Links Titel
Pixel
     
Sonstiges


Hier gibt es Infos und Codeschnipsel rund um C++ und Visual C++ die sonst in kein Thema passen.


Übersicht

  - Auflösung des Benutzers ermitteln und ändern
  - Benutzer- und Computername ermitteln
  - CD/DVD Laufwerke ermitteln und öffnen/schliessen
  - Datum & Uhrzeit anzeigen
  - Umwandeln von Variablen

 

Auflösung des Benutzers ermitteln und ändern

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;
    }
  }


Auflösung

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

 

Benutzer- und Computername ermitteln

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
  }

Benutzer



Downloads: Benutzer.exe - Gesamtes Projekt

 

CD/DVD Laufwerke ermitteln und öffnen/schliessen

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);
  }


Laufwerke

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

 

Datum & Uhrzeit anzeigen

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);
  }


Datum

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);
  }


Datum

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;
  }


Datum

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

 

Umwandeln von Variablen

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