|
|
|
|
|
Hier gibt es Infos und Codeschnipsel rund um C++ und Visual C++ die sonst in kein Thema passen.
- Auflösung des Benutzers ermitteln und ändern
- Benutzer- und Computername ermitteln
- CD/DVD Laufwerke ermitteln und öffnen/schliessen
- Datum & Uhrzeit anzeigen
- Umwandeln von Variablen
Hier geht es darum die aktuelle Auflösung des Benutzers zu ermitteln und diese Auflösung zu ändern. Die aktuell benutzte Auflösung kann man mit der Funktion GetSystemMetrics() ermitteln.
Beispiel:
Im folgenden Beispiel erstellen wir eine Anwendung, die als erstes die aktuelle Auflösung des Benutzers ausliest und dann die Möglichkeit bietet mit Hilfe von Buttons auf verschiedene Auflösungen zu wechseln.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Auflösung und entferne alle vorhandenen Elemente. Schau dir die untenstehende Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ganz oben ein Textfeld ein, lösche den Titel und ändere die ID in: IDC_AUFLOESUNG. Vergrössere das Textfeld etwas in die Breite und in die Höhe
- Füge untereinander fünf Buttons ein und ändere die Titel und IDs nach folgender Tabelle:
| Titel |
ID |
| Default Auflösung |
IDC_DEFAULT |
| 1280x1024 |
IDC_1280 |
| 1024x768 |
IDC_1024 |
| 800x600 |
IDC_800 |
| 640x480 |
IDC_640 |
- Klicke doppelt auf jeden Button, um für jeden eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht einzufügen. Übernehme die vorgeschlagenen Funktionsnamen
- Füge folgende Variablen für die Dialogklasse (CAufloesungDlg) ein:
| Variablentyp |
Variablenname |
Zugriffstatus |
| int |
nHoehe |
private |
| int |
nBreite |
private |
| CString |
strHoehe |
private |
| CString |
strBreite |
private |
- Füge nun noch eine Funktion für die Dialogklasse (CAufloesungDlg) ein - Funktionstyp: void, Funktionsdeklaration: Aufloesung_aendern(int nBreite, nHoehe), Zugriffstatus: private
- Füge jetzt folgenden Code in die OnInitDialog()-Funktion, in die für die Buttons erstellten Funktionen und in die Funktion Aufloesung_aendern ein:
BOOL CAufloesungDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Default-Auflösung ermitteln
nBreite = GetSystemMetrics(SM_CXSCREEN);
nHoehe = GetSystemMetrics(SM_CYSCREEN);
// int in String wandeln
strBreite.Format("%d", nBreite);
strHoehe.Format("%d", nHoehe);
// Ausgabe im Textfeld
SetDlgItemText(IDC_STATIC1, "Breite der Auflösung: " + strBreite + "\nHöhe der Auflösung: " + strHoehe);
return TRUE;
}
void CAufloesungDlg::OnDefault()
{
Aufloesung_aendern(nBreite, nHoehe);
strBreite.Format("%d", nBreite);
strHoehe.Format("%d", nHoehe);
SetDlgItemText(IDC_AUFLOESUNG, "Breite der Auflösung: " + strBreite + "\nHöhe der Auflösung: " + strHoehe);
}
void CAufloesungDlg::On1280()
{
Aufloesung_aendern(1280, 1024);
SetDlgItemText(IDC_AUFLOESUNG, "Breite der Auflösung: 1280\nHöhe der Auflösung: 1024");
}
void CAufloesungDlg::On1024()
{
Aufloesung_aendern(1024, 768);
SetDlgItemText(IDC_AUFLOESUNG, "Breite der Auflösung: 1024\nHöhe der Auflösung: 768");
}
void CAufloesungDlg::On800()
{
Aufloesung_aendern(800, 600);
SetDlgItemText(IDC_AUFLOESUNG, "Breite der Auflösung: 800\nHöhe der Auflösung: 600");
}
void CAufloesungDlg::On640()
{
Aufloesung_aendern(640, 480);
SetDlgItemText(IDC_AUFLOESUNG, "Breite der Auflösung: 640\nHöhe der Auflösung: 480");
}
void CAufloesungDlg::Aufloesung_aendern(int nBreite, int nHoehe)
{
DEVMODE dmAufloesung;
memset(&dmAufloesung, 0 , sizeof(dmAufloesung));
dmAufloesung.dmSize = sizeof(dmAufloesung);
dmAufloesung.dmPelsWidth = nBreite; // Breite der Auflösung
dmAufloesung.dmPelsHeight = nHoehe; // Höhe der Auflösung
dmAufloesung.dmBitsPerPel = 32; // Farbtiefe
dmAufloesung.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
if (ChangeDisplaySettings(&dmAufloesung , CDS_FULLSCREEN | CDS_UPDATEREGISTRY) != DISP_CHANGE_SUCCESSFUL)
{
MessageBox("FEHLER!", "FEHLER", MB_OK);
return;
}
}
 |
Beschreibung:
In der OnInitDialog()-Funktion ermitteln wir als erstes die aktuelle Auflösung des Benutzers. Mit den anderen Buttons lässt sich die Auflösung umschalten, dabei stehen die übergebenen Werte an die Funktion Aufloesung_aendern() für die Breite und Höhe der anzuzeigenden Auflösung. Hier könnt ihr im Prinzip jeden beliebigen Wert eintragen, solange euer Monitor mitspielt.
Genauso könnte man die Funktion auch noch erweitern und eine Bildschirmaktualisierungsrate mit angeben. Dazu müssen wir nur eine Zeile in der Funktion Aufloesung_aendern einfügen und eine Zeile erweitern:
dmAufloesung.dmDisplayFrequency = 75; // Monitor 75 Hertz
dmAufloesung.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY; // um DM_DISPLAYFREQUENCY erweitert
Über den Button: Default-Auflösung kann die Standard Auflösung wiederhergestellt werden.
Downloads: Aufloesung.exe - Gesamtes Projekt
Dieses Beispiel zeigt wie man den Benutzernamen und den Computernamen ermitteln kann.
Beispiel:
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Benutzer und entferne alle vorhandenen Elemente. Schau dir die untenstehende Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge die drei Textfelder und die zwei Eingabefelder ein. Setze bei beiden Eingabefelder im Register Formate einen Haken bei Schreibgeschützt.
- Füge jetzt folgenden Code in OnInitDialog Funktion ein:
BOOL CAufloesungDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Benutzername ermitteln und im Eingabefeld anzeigen
DWORD nSize;
char cBenutzer[255];
nSize = sizeof(cBenutzer);
GetUserName(cBenutzer, &nSize );
SetDlgItemText(IDC_EDIT1, cBenutzer);
// Computername ermitteln und im Eingabefeld anzeigen
char cComputer[255];
nSize = sizeof(cComputer);
GetComputerName(cComputer, &nSize );
SetDlgItemText(IDC_EDIT2, cComputer);
return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
}
Downloads: Benutzer.exe - Gesamtes Projekt
Hier zeige ich euch wie man angeschlossene CD- oder DVD Laufwerke ermittlen kann und öffnen bzw. schliessen kann.
Beispiel:
Bei dem folgenden Programm werden wir direkt nach dem Programmstart vorhandene CDROM oder DVD Laufwerke ermitteln und die Buttons zum Öffnen und Schliessen beschriften. Danach können ermittelte Laufwerke geöffnet und geschlossen werden.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Laufwerke und entferne alle vorhandenen Elemente. Schau dir die untenstehende Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ein Textfeld für die Überschrift ein und ändere den Titel in: CD/DVD Laufwerke ermitteln und öffnen/schliessen
- Füge vier Buttons ein und ändere Beschriftung und IDs nach folgender Tabelle:
| Titel |
ID |
| Laufwerk x öffnen |
IDC_LAUFWERK1_OEFFNEN |
| Laufwerk x öffnen |
IDC_LAUFWERK2_OEFFNEN |
| Laufwerk x öffnen |
IDC_LAUFWERK1_SCHLIESSEN |
| Laufwerk x öffnen |
IDC_LAUFWERK1_SCHLIESSEN |
- Klicke doppelt auf jeden Button, um für jeden eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht einzufügen. Übernehme die vorgeschlagenen Funktionsnamen
- Füge noch folgende Variablen in die Dialogklasse (CLaufwerkDlg) ein:
| Variablentyp |
Variablenname |
Zugriffstatus |
| DWORD |
dwBytesReturned |
private |
| HANDLE |
hDevice_1 |
private |
| HANDLE |
hDevice_2 |
private |
- Damit der folgende Code verwendet werden kann müssen wir eine Header-Datei inkludieren. Füge die Header-Datei: winioctl.h in die Datei: LaufwerkeDlg.cpp ein:
// LaufwerkeDlg.cpp : Implementierungsdatei
#include "stdafx.h"
#include "Laufwerke.h"
#include "LaufwerkeDlg.h"
#include "winioctl.h" // <-- Eingefügte Header-Datei
#ifdef _DEBUG
....
- Füge folgenden Code in die OnInitDialog()-Funktion und in die Funktionen für die Buttons ein:
BOOL CLaufwerkeDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Variablen initialisieren
dwBytesReturned=0;
int nMerker=0;
// Buttons ausblenden
GetDlgItem(IDC_LAUFWERK1_OEFFNEN)->ShowWindow(FALSE);
GetDlgItem(IDC_LAUFWERK2_OEFFNEN)->ShowWindow(FALSE);
GetDlgItem(IDC_LAUFWERK1_SCHLIESSEN)->ShowWindow(FALSE);
GetDlgItem(IDC_LAUFWERK2_SCHLIESSEN)->ShowWindow(FALSE);
CString strLaufwerk;
char szLaufwerk[] = {'A', ':', 0};
// In der Schleife werden alle Buchstaben auf vorhandene Laufwerke geprüft
for(int i=0; i<26; i++)
{
szLaufwerk[0] = 'A' + i;
// Vorhandene Laufwerke ermitteln
if(GetDriveType(szLaufwerk) == DRIVE_CDROM)
{
if(nMerker==0)
{
// Erstes Laufwerk gefunden
strLaufwerk = szLaufwerk;
hDevice_1 = CreateFile("\\\\.\\" +strLaufwerk, GENERIC_READ, 0, NULL,OPEN_EXISTING, 0, 0);
// Beschriftung der Buttons ändern
SetDlgItemText(IDC_LAUFWERK1_OEFFNEN, "Laufwerk " + strLaufwerk + " öffnen");
SetDlgItemText(IDC_LAUFWERK1_SCHLIESSEN, "Laufwerk " + strLaufwerk + " schliessen");
nMerker = 1;
// Buttons für das erste Laufwerk einblenden
GetDlgItem(IDC_LAUFWERK1_OEFFNEN)->ShowWindow(TRUE);
GetDlgItem(IDC_LAUFWERK1_SCHLIESSEN)->ShowWindow(TRUE);
// Gehe zum Ende des if-Zweigs und rufe ihn erneut auf
continue;
}
if(nMerker==1)
{
// Ein weiteres Laufwerk gefunden
strLaufwerk = szLaufwerk;
hDevice_2 = CreateFile("\\\\.\\" +strLaufwerk, GENERIC_READ, 0, NULL,OPEN_EXISTING, 0, 0);
// Beschriftung der Buttons ändern
SetDlgItemText(IDC_LAUFWERK2_OEFFNEN, "Laufwerk " + strLaufwerk + " öffnen");
SetDlgItemText(IDC_LAUFWERK2_SCHLIESSEN, "Laufwerk " + strLaufwerk + " schliessen");
nMerker = 0;
// Buttons für das zweite Laufwerk einblenden
GetDlgItem(IDC_LAUFWERK2_OEFFNEN)->ShowWindow(TRUE);
GetDlgItem(IDC_LAUFWERK2_SCHLIESSEN)->ShowWindow(TRUE);
}
}
}
return TRUE;
}
void CLaufwerkeDlg::OnLaufwerk1Oeffnen()
{
// Laufwerk öffnen
DeviceIoControl(hDevice_1, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, &dwBytesReturned, NULL);
}
void CLaufwerkeDlg::OnLaufwerk1Schliessen()
{
// Laufwerk schliessen
DeviceIoControl(hDevice_1, IOCTL_STORAGE_LOAD_MEDIA, NULL, 0, NULL, 0, &dwBytesReturned, NULL);
}
void CLaufwerkeDlg::OnLaufwerk2Oeffnen()
{
// Laufwerk öffnen
DeviceIoControl(hDevice_2, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, &dwBytesReturned, NULL);
}
void CLaufwerkeDlg::OnLaufwerk2Schliessen()
{
// Laufwerk schliessen
DeviceIoControl(hDevice_2, IOCTL_STORAGE_LOAD_MEDIA, NULL, 0, NULL, 0, &dwBytesReturned, NULL);
}
 |
Beschreibung:
In der OnInitDialog()-Funktion wird als erstes ermittelt wieviele CD- oder DVD Laufwerke am PC angeschlossen sind. Wird ein Laufwerk gefunden, wird der Laufwerkbuchstabe in die Buttons geschrieben, dem HANDLE zugewiesen und die Buttons angezeigt. Wird dann noch ein Laufwerk gefunden, wird der Laufwerksbuchstabe in die zwei übrig gebliebenen Buttons eingetragen, dem zweiten HANDLE zugewiesen und auch diese Buttons angezeigt. Über die eingeblendeten Buttons können die Laufwerke geöffnet oder geschlossen werden.
Downloads: Laufwerke.exe - Gesamtes Projekt
Hier zeige ich euch wie man Datum & Uhrzeit anzeigen und aktualisieren kann. Um eine aktuelle Zeit anzeigen zu lassen und damit diese auch ständig aktuallisiert werden kann, braucht man einen Timer.
Beispiel:
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Datum und entferne alle vorhandenen Elemente. Schau dir die untenstehende Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Datum && Uhrzeit anzeigen. Vergrössere das Textfeld etwas in die Breite
- Füge darunter noch ein Textfeld ein, entferne den Titel und ändere die ID in: IDC_DATUM. Füge für dieses Textfeld eine Member-Variable ein - Variablenname: m_strDatum, Kategorie: Wert, Variablentyp: CString
- Damit Uhrzeit und Datum auch ständig aktualisiert werden füge eine Nachrichtenbehandlungsroutine (Funktion) für die WM_TIMER-Nachricht ein
- Füge folgenden Code in die OnInitDialog()-Funktion und in die OnTimer()-Funktion ein:
BOOL CAufloesungDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Timer starten und jede Sekunde OnTimer() aufrufen
SetTimer(1 ,1000 ,NULL);
return TRUE;
}
void CUhrzeitDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent == 1)
{
CTime time = CTime::GetCurrentTime();
CString str = time.Format("%H:%M:%S\n%d.%m.%Y");
m_strDatum = str;
UpdateData(FALSE);
}
CDialog::OnTimer(nIDEvent);
}
Beschreibung:
In der OnInitDialog()-Funktion wird direkt beim Start der Anwendung der Timer gestartet. Wir geben ihm die ID: 1 und sagen ihm das er sich alle 1000ms aktualisieren soll, also jede Sekunde. In der Funktion OnTimer() ermitteln wir mit der Funktion GetCurrentTime() das aktuelle Datum und Zeit und speichern diese Werte in einer CTime-Variablen. Danach wandeln wir die ermittelten Werte mit Hilfe der Funktion Format() in einen String und zeigen sie dann im Textfeld an. Dies passiert jede Sekunde, damit die Zeit immer aktuell ist.
Wir können das Datum auch noch anders ausgeben lassen, ändere dazu den Code in der OnTimer()-Funktion etwas ab:
void CUhrzeitDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent == 1)
{
CTime time = CTime::GetCurrentTime();
// CString str = time.Format("%H:%M:%S\n%d.%m.%Y");
CString str = time.Format("%H:%M:%S\n %A, %B %d, %Y");
m_strDatum = str;
UpdateData(FALSE);
}
CDialog::OnTimer(nIDEvent);
}
Beschreibung:
Indem wir in der Funktion Format() andere Formatieranweisungen angeben, können wir die Anzeige des Datums beeinflussen. Hier zur Übersicht die verwendeten Formatieranweisungen für die Funktion Format in einer Tabelle:
| Formatiercode |
Ausgabe |
| %H |
Stunde - z.B. 03 |
| %M |
Minute - z.B. 15 |
| %S |
Sekunde - z.B. 23 |
| %d |
Tag - z.B. 29 |
| %A |
Tag - z.B. Wednesday |
| %m |
Monat - z.B. 05 |
| %B |
Monat - z.B. June |
| %Y |
Jahr - z.B. 2005 |
| %y |
Jahr - z.B. 05 |
Ein weiteres Beispiel:
Wem das oben aufgeführte Beispiel nicht gefällt, für den habe ich eine weitere Möglichkeit das aktuelle Datum mit Uhrzeit auszugeben:
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Datum2 und entferne alle vorhandenen Elemente. Schau dir die untenstehende Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
- Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Datum && Uhrzeit anzeigen 2. Vergrössere das Textfeld etwas in die Breite
- Füge nun, wie in dem Screenshot unten zu sehen, sechs Textfelder und sechs Eingabefelder ein. Für die Beschriftung und Vergabe der IDs siehe folgende Tabelle:
| Element |
ID |
Titel |
| Textfeld |
IDC_STATIC |
Jahr |
| Textfeld |
IDC_STATIC |
Monat |
| Textfeld |
IDC_STATIC |
Tag |
| Textfeld |
IDC_STATIC |
Stunde |
| Textfeld |
IDC_STATIC |
Minute |
| Textfeld |
IDC_STATIC |
Sekunde |
| Eingabefeld |
IDC_JAHR |
|
| Eingabefeld |
IDC_MONAT |
|
| Eingabefeld |
IDC_TAG |
|
| Eingabefeld |
IDC_STUNDE |
|
| Eingabefeld |
IDC_MINUTE |
|
| Eingabefeld |
IDC_SEKUNDE |
|
- Füge nun noch für jedes Eingabefeld eine Member-Variable. Alle Variablen sollen vom Typ: CString sein. Siehe für die Variablennamen folgende Tabelle:
| Eingabefeld-ID |
Variablenname |
| IDC_JAHR |
m_strJahr |
| IDC_MONAT |
m_strMonat |
| IDC_TAG |
m_strTag |
| IDC_STUNDE |
m_strStunde |
| IDC_MINUTE |
m_strMinute |
| IDC_SEKUNDE |
m_strSekunde |
- Füge folgenden Code in die Funktion OnInitDialog() ein:
BOOL CDatum2Dlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
CTime Zeit=CTime::GetCurrentTime();
int nJahr=Zeit.GetYear();
int nMonat=Zeit.GetMonth();
int nTag=Zeit.GetDay();
int nStunde=Zeit.GetHour();
int nMinute=Zeit.GetMinute();
int nSekunde=Zeit.GetSecond();
m_strJahr.Format("%d",nJahr);
m_strMonat.Format("%d",nMonat);
m_strTag.Format("%d",nTag);
m_strStunde.Format("%d",nStunde);
m_strMinute.Format("%d",nMinute);
m_strSekunde.Format("%d",nSekunde);
UpdateData(FALSE);
return TRUE;
}
Beschreibung:
Beim Start der Anwendung deklarieren wir ein Objekt(Variable) der Klasse CTime und holen uns die aktuelle Zeit, geben sie diesmal aber nicht wieder über Formatieranweisungen aus, sondern holen uns Zeit und Datum über Funktionen. Dann wandeln wir die erhaltenen Werte mit Hilfe von Format() um und aktualisieren die Variablen mit UpdateData(). Die Funktion GetDayofWeek() liefert den Wochentag (Monday - Sunday).
Downloads: Datum.exe - Gesamtes Projekt
Datum2.exe - Gesamtes Projekt
Oft hat man eine Variable und will sie in eine andere umwandeln, z.B int in CString oder anders herum. Hier zeige ich wie man Variablen in andere umwandeln kann.
int --> CString
int nWert = 123;
CString str;
str.Format("%d", nWert);
CString --> int
int nWert;
CString str = "123";
nWert = atoi(str);
double --> CString
double dZahl = 12.00;
CString str;
str.Format("%4.2f", dZahl);
CString --> double
double dZahl;
CString str = "123";
dZahl = atof(str);
|
Die Vervielfältigung der auf diesen Seiten enthaltenen Informationen und Grafiken ist untersagt, ausgenommen davon ist sämtlicher auf diesen Seiten angezeigter Quellcode. Es wird keinerlei Gewähr für die Richtigkeit und Vollständigkeit der bereitgestellten Informationen übernommen. Haftungsansprüche für Schäden, die durch Nutzung der bereitgestellten Informationen verursacht wurden, sind ausgeschlossen. Für den Inhalt von angegebenen Verweisen wird keine Gewährleistung übernommen.
Copyright © 2005 coding-help.de | |