Links Titel
Pixel
     
Steuerelemente allgemein


Hier findet ihr allgemeine Infos zum Umgang mit Steuerelementen.


Übersicht

  - Auslesen von Steuerelementen/Schreiben in Steuerelemente - Get/SetDlgItemText()
  - Farbige Steuerelemente
  - Dialog in Grösse und Position ändern - MoveWindow()
  - Fokus auf ein Steuerelement setzen - SetFocus()
  - Fokus abfragen - GetFocus()
  - Rahmen um Steuerelemente
  - Schriftart für Steuerelemente ändern - SetFont()
  - Steuerelemente aktivieren bzw. deaktivieren - EnableWindow()
  - Steuerelemente ein- bzw. ausblenden - ShowWindow()
  - Zugriff auf Steuerelemente

 

Auslesen von Steuerelementen/Schreiben in Steuerelemente - Get/SetDlgItemText()

GetDlgItemText() und SetDlgItemText() sind Member-Funktionen der Klasse CWnd, d.h. sie funktionieren für alle Steuerelemente. Diese Funktionen lesen den Inhalt eines Steuerelements aus bzw. Schreiben in ein Steuerelement einen angegebenen String.

Beispiel:
Im folgendem Beispiel wird eine Anwendung erstellt, die demonstriert wie man aus Steuerelementen liest und in Steuerelemente schreibt. Hier kommen auch die Funktionen GetDlgItemInt() und SetDlgItemInt() vor. Damit kann ein Eingabefeld auslesen, welches in den Eigenschaften das Attribut Nummer aktiviert hat:
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Auslesen und entferne alle vorhandenen Elemente. Schau dir die unten stehenden Abbildung an, um zu sehen wie die Steuerelemente angeordnet werden
  • Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Schreiben in Steuerelemente und Lesen aus Steuerelementen Get/SetDlgItemText() - Get/SetDlgItemInt()
  • Füge zwei Gruppenfelder ein und behalte die vorgegebene IDs (IDC_STATIC). Ändere die Titel in: Text auslesen/setzen und Zahl auslesen/setzen
  • Füge vier Textfelder ein, behalte die vorgebenen IDs (IDC_STATIC) und ändere die Titel wie in der untenstehenden Abbildung, also für die linken Zwei: Text Eingabe: und Text Ausgabe:. Für die rechten Zwei: Zahl Eingabe: und Zahl Ausgabe:
  • Füge die vier Eingabefelder ein und ändere die IDs der zwei linken Felder in: IDC_TEXT_EINGABE und IDC_TEXT_AUSGABE. Ändere die IDs der zwei rechten Felder in IDC_ZAHL_EINGABE und IDC_ZAHL_AUSGABE
  • Aktiviere in den Eigenschaften der Eingabefelder IDC_TEXT_AUSGABE und IDC_ZAHL_AUSGABE die Eigenschaft: Schreibgeschützt (Read Only). Aktiviere für die Eingabefelder IDC_ZAHL_EINGABE und IDC_ZAHL_AUSGABE ebenfalls in den Eigenschaften die Eigenschaft: Nummer (Number), da diese nur mit Zahlen arbeiten sollen
  • Füge zwei Buttons ein und ändere die ID´s in: IDC_BUTTON_TEXT und IDC_BUTTON_ZAHL. Ändere jetzt noch die Titel in: Text auslesen und Zahl auslesen
  • Klicke doppelt auf die Buttons, um für jeden eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht zu erstellen und übernehme die vorgeschlagenen Funktionsnamen. Füge folgenden Code in die eben erstellten Funktionen ein:
  void CAuslesenDlg::OnButtonText()
  {
    CString str;

    // Text aus IDC_TEXT_EINGABE auslesen
    GetDlgItemText(IDC_TEXT_EINGABE, str);

    // Ausgelesenen Text in IDC_TEXT_AUSGABE schreiben
    SetDlgItemText(IDC_TEXT_AUSGABE, str);
  }

  void CAuslesenDlg::OnButtonText()
  {
    int nZahl;

    // Zahl aus IDC_ZAHL_EINGABE auslesen
    nZahl = GetDlgItemInt(IDC_ZAHL_EINGABE);

    // Ausgelesene Zahl in IDC_ZAHL_AUSGABE schreiben
    SetDlgItemInt(IDC_ZAHL_AUSGABE, nZahl);
  }


Auslesen


Downloads: Auslesen.exe - Gesamtes Projekt

 

Farbige Steuerelemente

Hier möchte ich zeigen, wie man Steuerlemente und den Dialog einfärben kann. Es wird für jedes Steuerelement eine WM_CTLCOLOR-Nachricht gesendet, bevor es angezeigt wird. Genauso ist es auch beim Dialog. Fügt man seiner Anwendung eine Nachrichtenbehandlungsroutine für diese Nachricht hinzu, dann kann man Hintergrund- und Vordergrundfarben der Texte bestimmen, sowie Hintergrundbereiche der Steuerelemente einfärben.

Beispiel:
Das Beispiel wird von Anfang an zeigen, wie man den Dialog Hintergrund und Steuerlemente färben kann.
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Farbe und entferne den OK und den Abbrechen Button
  • Ändere den Titel des Textfeld in: Farbige Steuerelemente und die ID in: IDC_TEXT
  • Füge eine Nachrichtenbehandlungsroutine in die Dialogklasse (CFarbeDlg) für die Nachricht WM_CTLCOLOR ein und ändere die Funktion folgendermaßen ab:
  HBRUSH CFarbeDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  {
    // Brush für den Dialog Hintergrund anlegen
    HBRUSH hBGBrush = CreateSolidBrush(RGB(128, 184, 223));

    // Brush für Dialog Hintergrund zurück geben
    return hBGBrush;
  }


Farbe

Beschreibung:
Wie man in der Abbildung sehen kann haben wir ein Problem nachdem wir die Dialog Hintergrundfarbe geändert haben. Der Hintergrund des Textfeld ist weiss hinterlegt und sieht nicht so schön aus. Um dies zu ändern gibt es zwei Möglichkeiten. Entweder ändern wir die Hintergrundfarbe des Textfeld oder setzen den Hintergrund transparent.
  • Um den Hintergrund des Textfeld transparent zu setzen, ändere die Funktion OnCtlColor() so ab:
  HBRUSH CFarbeDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  {
    // Brush für den Dialog Hintergrund anlegen
    HBRUSH hBGBrush = CreateSolidBrush(RGB(128, 184, 223));

    // Hintergrund für Text transparent setzen
    if(pWnd->GetDlgCtrlID() == IDC_TEXT)
    {
      pDC->SetBkMode(TRANSPARENT);
    }

    // Brush für Dialog Hintergrund zurück geben
    return hBGBrush;
  }


Farbe

Beschreibung:
Der Parameter pDC der Funktion OnCtlColor() verweist auf ein bestimmtes Steuerelement. Nachdem wir den Hintergrund für das Textfeld mit Hilfe der Funktion SetBkMode() transparent gesetzt haben, sieht das schon besser aus. Doch wie funktioniert das nun mit mehreren Steuerelementen?
  • Um das zu testen füge ein Eingabefeld und ein Listenfeld in die Anwendung ein. Initialisiere beide Steuerelemente indem du folgenden Code in die Funktion OnInitDialog() einfügst:
  BOOL CFarbeDlg::OnInitDialog()
  {
    ...
    // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    // Text für Eingabefeld setzen
    SetDlgItemText(IDC_EDIT1, "Eingabefeld");

    // Listenfeld Einträge setzen
    CListBox* p_ListBox =(CListBox*)GetDlgItem(IDC_LIST1);
    p_ListBox->AddString("Eintrag 1");
    p_ListBox->AddString("Eintrag 2");
    p_ListBox->AddString("Eintrag 3");
    p_ListBox->AddString("Eintrag 4");

    return TRUE;
  }
  • Damit der Hintergrund der Texte im Eingabe- und Listenfeld transparent wird, ändere die Funktion OnCtlColor() so ab:
  HBRUSH CFarbeDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  {
    // Brush für den Dialog Hintergrund anlegen
    HBRUSH hBGBrush = CreateSolidBrush(RGB(128, 184, 223));

    // Hintergrund für Text transparent setzen
    if(pWnd->GetDlgCtrlID() == IDC_TEXT || pWnd->GetDlgCtrlID() == IDC_EDIT1 || pWnd->GetDlgCtrlID() == IDC_LIST1)
    {
      pDC->SetBkMode(TRANSPARENT);
    }

    // Brush für Dialog Hintergrund zurück geben
    return hBGBrush;
  }


Farbe

Beschreibung:
Wir fragen einfach alle unsere Steuerelemente ab, also das Textfeld, Eingabefeld und das Listenfeld und setzen den Hintergrund transparent. Um die Textfarbe zu ändern müssen wir die Funktion OnCtlColor() so abändern:

  HBRUSH CFarbeDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  {
    // Brush für den Dialog Hintergrund anlegen
    HBRUSH hBGBrush = CreateSolidBrush(RGB(128, 184, 223));

    // Hintergrund für Text transparent setzen
    if(pWnd->GetDlgCtrlID() == IDC_TEXT || pWnd->GetDlgCtrlID() == IDC_EDIT1 || pWnd->GetDlgCtrlID() == IDC_LIST1)
    {
      pDC->SetBkMode(TRANSPARENT);
      pDC->SetTextColor(RGB(255, 255, 225));
    }

    // Brush für Dialog Hintergrund zurück geben
    return hBGBrush;
  }


Farbe

Beschreibung:
Mit Hilfe der Funktion SetTextColor() ändern wir ganz einfach die Textfarbe. Angenommen wir wollen aber für die Steuerelemente unterschiedliche Farben, dann müssen wir die Funktion OnCtlColor() etwas abändern:

  HBRUSH CFarbeDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  {
    // Brush für den Dialog Hintergrund anlegen
    HBRUSH hBGBrush = CreateSolidBrush(RGB(128, 184, 223));

    // Hintergrund für Text transparent setzen
    if(pWnd->GetDlgCtrlID() == IDC_TEXT)
    {
      // Hintergrund für Text transparent setzen
      pDC->SetBkMode(TRANSPARENT);
      // // Textfarbe ändern
      pDC->SetTextColor(RGB(255, 0, 0));
    }

    if(pWnd->GetDlgCtrlID() == IDC_EDIT1)
    {
      pDC->SetBkMode(TRANSPARENT);
      pDC->SetTextColor(RGB(0, 255, 0));
    }

    if(pWnd->GetDlgCtrlID() == IDC_LIST1)
    {
      pDC->SetBkMode(TRANSPARENT);
      pDC->SetTextColor(RGB(0, 0, 255));
    }

    // Brush für Dialog Hintergrund zurück geben
    return hBGBrush;
  }


Farbe

Beschreibung:
Nachdem wir nun alle Steuerelemente einzeln abfragen, können wir natürlich auch alle einzeln behandeln. Jetzt möchten wir aber das Eingabefeld etwas anders gestalten. Der Hintergrund des Eingabefelds soll schwarz werden und der Texthintergrund für das Textfeld soll weiss werden. Die geänderte Funktion OnCtlColor() sieht so aus:

  HBRUSH CFarbeDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  {
    // Brush für den Dialog Hintergrund anlegen
    HBRUSH hBGBrush = CreateSolidBrush(RGB(128, 184, 223));
    // Brush für den Hintergrund des Eingabefeld festlegen
    HBRUSH hBGEdit = CreateSolidBrush(RGB(0, 0, 0));

    if(pWnd->GetDlgCtrlID() == IDC_TEXT)
    {
      // Hintergrund für Text auf weiss setzen
      pDC->SetBkColor(RGB(255, 255, 255));
      // Textfarbe ändern
      pDC->SetTextColor(RGB(255, 0, 0));
    }

    if(pWnd->GetDlgCtrlID() == IDC_EDIT1)
    {
      // Hintergrund für Text transparent setzen
      pDC->SetBkMode(TRANSPARENT);
      // Textfarbe ändern
      pDC->SetTextColor(RGB(0, 255, 0));
      // Brush für Hintergrund des Eingabefelds zurückgeben
      return hBGEdit;
    }

    if(pWnd->GetDlgCtrlID() == IDC_LIST1)
    {
      pDC->SetBkMode(TRANSPARENT);
      pDC->SetTextColor(RGB(0, 0, 255));
    }

    // Brush für Dialog Hintergrund zurückgeben
    return hBGBrush;
  }


Farbe

Beschreibung:
Als erstes legen wir einen neuen Brush für den Hintergrund des Eingabefelds an, welchen wir auch zurück geben, wenn die WM-CTLCOLOR-Nachricht für das Eingabefeld gesendet wird. Um den Texthintergrund des Textfelds zu ändern, haben wir die Funktion SetBkColor() verwendet.

Was ist nun wenn wir z.B eine ganze Reihe von Eingabefeldern oder Listenfelder haben, die alle gleich aussehen sollen. Jede ID abzufragen bei vielleicht 50 Eingabefelder ist etwas mühsam. Dafür kann man einen Steuerelementtyp angeben, den Code zum färben eingeben und alle Steuerelemente dieses Typs sehen gleich aus. Der Code um alle Eingabefelder einer Anwendung gleich einzufärben sieht so aus:

  HBRUSH CFarbeDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // Brush für den Hintergrund des Eingabefeld festlegen
    HBRUSH hBGEdit = CreateSolidBrush(RGB(0, 0, 0));

    if(nCtlColor == CTLCOLOR_EDIT)
    {
      // Hintergrund für Text transparent setzen
      pDC->SetBkMode(TRANSPARENT);
      // Textfarbe ändern
      pDC->SetTextColor(RGB(0, 255, 0));
      // Brush für Hintergrund des Eingabefelds zurück geben
      return hBGEdit;
    }

    // TODO: Anderen Pinsel zurückgeben, falls Standard nicht verwendet werden soll
    return hbr;
  }


Beschreibung:
Der Parameter nCtlColor bezeichnet den Steuerelementtyp. Mit diesem Code sehen alle Eingabefelder in der Anwendung gleich aus, ganz egal wie viele das sind.

Genauso kann man alle Steuerelemente des Typs: Static einfärben, indem man CTLCOLOR_STATIC angibt.
Steuerelemente des Typs: ListBox kann man mit CTLCOLOR_LISTBOX einfärben.
Steuerelemente des Typs: ScrollBar kann man mit CTLCOLOR_SCROLLBAR einfärben.


Downloads: Farbe.exe - Gesamtes Projekt

 

Fokus auf ein Steuerelement setzen - SetFocus()

SetFocus() ist eine Member-Funktion der Klasse CWnd, d.h. sie funktioniert für alle Steuerelemente. Möchte man während dem Programmlauf einem bestimmten Steuerelement den Fokus zuweisen, ist dies die richtige Funktion.

Beispiel:
Im folgendem Beispiel wird eine Anwendung erstellt, die demonstriert wie ein Fokus auf ein Element direkt beim Start der Anwendung, sowie während des Programmlaufs gesetzt werden kann:
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: SetFocus und entferne alle vorhandenen Elemente
  • Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Fokus setzen - SetFocus()
  • Füge zwei Eingabefelder ein und behalte die vorgegebenen ID´s (IDC_EDIT1, IDC_EDIT2)
  • Füge einen Button ein und behalte die vorgegebene ID (IDC_BUTTON1). Ändere den Titel in: Fokus setzen
  • Klicke doppelt auf den Button, um eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht zu erstellen und übernehme den vorgeschlagenen Funktionsnamen. Füge folgenden Code in die eben erstellte Funktion ein:
  void CSetFocusDlg::OnButton1()
  {
    // Erstelle einen Zeiger und weise ihm das Eingabefeld IDC_EDIT1 zu
    CWnd *pFocus = GetDlgItem(IDC_EDIT1);

    // Setze den Fokus
    pFocus->SetFocus();
  }
  • Füge jetzt noch folgenden Code in die OnInitDialog() - Funktion ein:
  BOOL CSetFocusDlg::OnInitDialog()
  {
    ...
    // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    // Erstelle einen Zeiger und weise ihm das Eingabefeld IDC_EDIT2 zu
    CWnd *pFocus = GetDlgItem(IDC_EDIT2);

    // Setze den Fokus
    pFocus->SetFocus();

    // Soll ein Focus gesetzt werden, gebe FALSE zurück
    return FALSE;
  }


Fokus setzen

Beschreibung:
In der OnInitDialog() - Funktion wird festgelegt, das beim Start der Anwendung das Eingabefeld 2 nach dem Programmstart den Fokus besitzen soll. Wichtig ist hier das wir FALSE zurück geben müssen, da der Fokus sonst nicht gesetzt wird. Ein Klick auf den Button setzt dann den Fokus auf das Eingabefeld 1.


Downloads: SetFocus.exe - Gesamtes Projekt

 

Fokus abfragen - GetFocus()

GetFocus() ist eine Member-Funktion der Klasse CWnd, d.h. sie funktioniert für alle Steuerelemente. Diese Funktion können wir verwenden, wenn wir wissen möchten welches Steuerelement gerade den Fokus hat.

Beispiel:
Im folgenden Beispiel möchte ich zeigen wie die Funktion GetFocus() eingesetzt werden kann. Viele Benutzer drücken die Enter-Taste nachdem sie etwas in ein Eingabefeld eingegeben haben. Aus diesem Grund werden wir eine Anwendung erstellen die dem Benutzer ermöglicht Adressdaten in Eingabefelder einzugeben. Wird die Enter-Taste gedrückt fragen wir ab welches Eingabefeld gerade den Fokus hat und springen in das nächste Eingabefeld.
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: GetFocus und entferne alle vorhandenen Elemente. Um zu sehen wie die Steuerelemente angeordnet werden, schau dir untenstehende Abbildung an
  • Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Fokus abfragen - GetFocus()
  • Füge nun, wie in dem Screenshot unten zu sehen, untereinander vier Textfelder und nebendran vier Eingabefelder ein. Für die Beschriftung und Vergabe der IDs siehe folgende Tabelle:


  • Element ID Titel
    Textfeld IDC_STATIC Vorname
    Textfeld IDC_STATIC Nachname
    Textfeld IDC_STATIC Strasse
    Eingabefeld IDC_VORNAME  
    Eingabefeld IDC_NACHNAME  
    Eingabefeld IDC_STRASSE  
    Eingabefeld IDC_PLZ  

  • Überschreibe in der Dialogklasse (CGetFocusDlg) die Funktion: PreTranslateMessage
  • Füge folgenden Code in die Funktion OnInitDialog() ein:
  BOOL CGetFocusDlg::OnInitDialog()
  {
    ...
    // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    // Focus auf IDC_VORNAME setzen
    CWnd *pFocus = GetDlgItem(IDC_VORNAME);
    pFocus->SetFocus();

    return FALSE;
  }


  • Füge folgenden Code in die überschriebene Funktion PreTranslateMessage() ein:
  BOOL CGetFocusDlg::PreTranslateMessage(MSG* pMsg)
  {
    // Wurde eine Taste gedrückt?
    if(pMsg->message==WM_KEYDOWN)
    {
      // Ist die gedrückte Taste die Enter-Taste?
      if(pMsg->wParam==VK_RETURN)
      {
        // Ermittle ob ein Element den Fokus hat
        CWnd* pFocus = NULL;
        pFocus = GetFocus();
        if(pFocus==NULL)
          return FALSE;

        // Welches Element hat den Fokus?
        int nID = pFocus->GetDlgCtrlID();
        switch(nID)
        {
          case IDC_VORNAME:
          {
            pFocus = GetDlgItem(IDC_NACHNAME);
            pFocus->SetFocus();
            break;
          }
          case IDC_NACHNAME:
          {
            pFocus = GetDlgItem(IDC_STRASSE);
            pFocus->SetFocus();
            break;
          }
          case IDC_STRASSE:
          {
            pFocus = GetDlgItem(IDC_PLZ);
            pFocus->SetFocus();
            break;
          }
          case IDC_PLZ:
          {
            pFocus = GetDlgItem(IDC_VORNAME);
            pFocus->SetFocus();
            break;
          }
          default:
            break;
        }
      return 0;
      }
    }
    return CDialog::PreTranslateMessage(pMsg);
  }


Fokus ermitteln

Beschreibung:
In der OnInitDialog() - Funktion wird festgelegt, das beim Start der Anwendung das Eingabefeld 1(IDC_VORNAME) nach dem Programmstart den Fokus besitzen soll. Wichtig ist hier das wir FALSE zurück geben müssen, da der Fokus sonst nicht gesetzt wird.

In der Funktion PreTranslateMessage() ermitteln wir zuerst welche Taste gedrückt wurde, fragen dann den Fokus des aktuellen Eingabefelds ab und setzen den Fokus auf das nächste Eingabefeld.


Downloads: GetFocus.exe - Gesamtes Projekt

 

Rahmen um Steuerelemente

Um manche Steuerelemente optisch etwas hervorzuheben eignet sich ein Rahmen. Um ein Rahmen um ein Steuerlement setzen zu können muss man dessen Grösse ermitteln, diesen ermittelten Bereich mit der Funktion InflateRect() vergrössern und mit der Funktion FillRect() mit Farbe füllen.

Beschreibung:
Um dies zu demonstrieren werden wir jetzt um ein Textfeld und um ein Button einen farbigen Rahmen ziehen.
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Rahmen und entferne alle vorhandenen Elemente
  • Füge ein Textfeld für die Überschrift ein, ändere den Titel in: Rahmen um Steuerelemente und die ID in: IDC_TEXT. Vergrössere es etwas und gehe in die Eigenschaften des Textfeld und zentriere den Text unter: Text ausrichten (Align Text). Richte den Text ausserdem noch unter: Vertikal zentrieren (Center Image) vertikal aus
  • Füge darunter einen Button ein und gib ihm die Bezeichnung: Beenden
  • Füge für den Button eine Funktion für die Nachricht: BN_CLICKED indem du doppelt drauf klickst und füge folgenden Code ein:
  void CRahmenDlg::OnButton1()
  {
    OnOK();
  }
  • Füge nun folgenden Code in die Funktion OnPaint() ein:
  void CRahmenDlg::OnPaint()
  {
    // DC zum Zeichnen innerhalb des Dialogs holen
    CPaintDC dc(this);

    // ----------- Rahmen um Textfeld -----------

    // CRect Variable für die Maße der Steuerelemente
    CRect Rect;

    // Zeiger auf Textfeld holen
    CStatic *pStaticWnd = (CStatic*)GetDlgItem(IDC_TEXT);

    // Textfeldgroesse in Bildschirm-Koordinaten holen
    pStaticWnd->GetWindowRect(Rect);

    // Koordinaten nach Client-Koordinaten des Dialogs wandeln
    ScreenToClient(Rect);

    // Rechteck um Textfeld um 3 Pixel vergroessern
    Rect.InflateRect(3,3);

    // Vergrössertes Rechteck mit Farbe ausfüllen
    dc.FillRect(Rect,&CBrush(RGB(0, 0, 0)));

    // ----------- Rahmen um Button -----------

    // Zeiger auf OK-Button holen
    CButton *pBtnWnd = (CButton*)GetDlgItem(IDC_BUTTON1);

    // Buttongroesse in Bildschirm-Koordinaten holen
    pBtnWnd->GetWindowRect(Rect);

    // Koordinaten nach Client-Koordinaten des Dialogs wandeln
    ScreenToClient(Rect);

    // Button-Rechteck um 3 Pixel vergroessern
    Rect.InflateRect(3,3);

    // Vergrössertes Rechteck mit Farbe ausfüllen
    dc.FillRect(Rect,&CBrush(RGB(0, 0, 0)));
 }
  • Jetzt werden zwar die Rahmen schon angezeigt, aber damit es besser wirkt, färben wir noch den Hintergrund des Textfelds ein. Füge dazu eine Nachrichtenbehandlungsroutine in die Dialogklasse (CRahmenDlg) für die Nachricht WM_CTLCOLOR ein. Der Code der Funktion sieht so aus:
  HBRUSH CRahmenDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    // Brush für Textfeld erstellen
    HBRUSH hBgText = CreateSolidBrush(RGB(255, 0, 0));

    // TODO: Attribute des Gerätekontexts hier ändern
    if(pWnd->GetDlgCtrlID() == IDC_TEXT)
    {
      // Hintergrundfarbe ändern
      pDC->SetBkColor(RGB(255, 0, 0));

      // Brush für Textfeld zurückgeben
      return hBgText;
    }

    // TODO: Anderen Pinsel zurückgeben, falls Standard nicht verwendet werden soll
    return hbr;
  }


Rahmen


Downloads: Rahmen.exe - Gesamtes Projekt

 

Schriftart für Steuerelemente ändern - SetFont()

Will man in einem Steuerelement eine andere Schriftart als die Standardschrift nutzen, muss man die gewünschte Schriftart mit Hilfe von CreateFont() festlegen und mit der Funktion SetFont() dem Steuerelement zuweisen.

Beispiel:
Das folgende Beispiel zeigt wie man die Schriftart in einem Steuerelement ändert. Als Beispiel kommen ein Textfeld und ein Button zum Einsatz.
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen Schriftart und entferne alle vorhandenen Elemente
  • Füge untereinander zwei Textfelder in die eben erstellte Anwendung ein und ändere die IDs in (IDC_STATIC1, IDC_STATIC2)
  • Füge eine Member-Variable für das Textfeld mit der ID: IDC_STATIC1 ein - Kategorie: Control, Variablentyp: CStatic, Name: m_ctlStatic1
  • Füge eine Variable in die Dialogklasse (CSchriftartDlg) ein - Variablentyp: CFont, Variablenname: schriftTextfeld1, Zugriffstatus: Public
  • Füge folgenden Code in die OnInitDialog()-Funktion ein:
  BOOL CSchriftartDlg::OnInitDialog()
  {
    ...
    // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    // Variable für die Schriftart erstellen
    CString strSchriftart ="Arial";

    // Schriftart für das Textfeld 1 erstellen - Arial 22pt
    schriftTextfeld1.CreateFont(22, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, strSchriftart);

    // Dem Textfeld 1 die neue Schriftart zuweisen
    m_ctlStatic1.SetFont(&schriftTextfeld1);
    SetDlgItemText(IDC_STATIC1, "Eine andere Schrift.");

    // In Textfeld 2 Text in Standardschrift einfügen
    SetDlgItemText(IDC_STATIC2, "Standardschrift.");

    return TRUE;
  }


Neue Schriftart

Beschreibung:
Mit Hilfe der Funktion CreateFont() legen wir eine neue Schriftart fest und weisen sie dann mit Hilfe der Funktion SetFont() dem ersten Textfeld zu. Es schadet nicht sich mal alle Parameter von CreateFont() in Ruhe anzuschauen, da diese Funktion sehr umfangreich ist. Hier ein paar Beispiele:

Um den angelegten Font fett darzustellen, muss das 5. Argument von FW_NORMAL in FW_BOLD geändert werden:

  // Schrift fett darstellen
  schrift.CreateFont(22, 0, 0, 0, FW_BOLD, 0, 0, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, Schriftart);


Um den angelegten Font kursiv darzustellen, muss das 6. Argument von 0 in 1 geändert werden:

  // Schrift kursiv darstellen
  schrift.CreateFont(22, 0, 0, 0, FW_NORMAL, 1, 0, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, Schriftart);


Um den angelegten Font unterstrichen darzustellen, muss das 7. Argument von 0 in 1 geändert werden:

  // Schrift unterstrichen darstellen
  schrift.CreateFont(22, 0, 0, 0, FW_NORMAL, 0, 1, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, Schriftart);



Erweiterung des Beispiels:
Angenommen in das Beispiel soll nun noch ein Button eingefügt werden, der auch wieder eine andere Schrift haben soll, dann kann man so vorgehen:
  • Füge unter den zwei Textfelder einen Button hinzu
  • Füge eine Member-Variable für den Button ein - Kategorie: Control, Variablentyp: CButton, Name: m_ctlButton1
  • Füge eine Variable in die Dialogklasse (CSchriftartDlg) ein - Variablentyp: CFont, Variablenname: schriftButton1, Zugriffstatus: Public
  • Der komplette Code, um die Schriftart im Textfeld 1 und den eingefügten Button zu ädern sieht so aus:
  BOOL CSchriftartDlg::OnInitDialog()
  {
    ...
    // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen

  // ----------------------- Textfeld -------------------------------------
    // Variable für die Schriftart erstellen
    CString strSchriftart ="Arial";

    // Schriftart für das Textfeld 1 erstellen - Arial 22pt
    schriftTextfeld1.CreateFont(22, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, strSchriftart);

    // Dem Textfeld 1 die neue Schriftart zuweisen
    m_ctlStatic1.SetFont(&schriftTextfeld1);
    SetDlgItemText(IDC_STATIC1, "Eine andere Schrift.");

    // In Textfeld 2 Text in Standardschrift einfügen
    SetDlgItemText(IDC_STATIC2, "Standardschrift.");

  // ----------------------- Button -------------------------------------
    // Schriftart für den Button festlegen
    strSchriftart ="Comic Sans MS";

    // Schriftart für den Button 1 erstellen - Comic Sans 18pt fett unterstrichen
    schriftButton1.CreateFont(18, 0, 0, 0, FW_BOLD, 0, 1, 0, DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, strSchriftart);

    // Dem Button 1 die neue Schriftart zuweisen
    m_ctlButton1.SetFont(&schriftButton1);
    SetDlgItemText(IDC_BUTTON1, "Eine andere Schrift.");

    return TRUE;
  }


Neue Schriftart

Beschreibung:
Das Beispiel zeigt wie man Steuerelementen eine andere Schriftart zuweist. Das Beispiel klappt natürlich nicht nur bei Textfelder und Buttons, sondern bei allen anderen Steuerelementen mit denen sich Schrift anzeigen lässt wie z.B: Listenfelder, Optionsfelder, Kombinationsfelder usw.


Downloads: Schriftart.exe - Gesamtes Projekt

 

Dialog in Grösse und Position ändern - MoveWindow()

Mit der Funktion MoveWindow() kann man Dialoge und Steuerelemente zur Laufzeit verschieben oder in der Größe ändern. MoveWindow() ist eine Member-Funktion der Klasse CWnd, d.h. sie funktioniert für alle Steuerelemente. Die im folgenden Beispiel verwendete Funktion sieht so aus:

  void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );

  - Der erste Parameter gibt die Position von links an
  - Der zweite Parameter gibt die Position von oben an
  - Der dritte Parameter gibt die Breite an
  - Der vierte Parameter gibt die Höhe an
  - Der letzte Parameter besagt, daß das Fenster neu gezeizeichnet wird

Beispiel:
Im folgenden Beispiel werden wir sehen wie leicht wir mit Hilfe von MoveWindow() Steuerelemente oder den ganzen Dialog verschieben können. Bevor man etwas verschiebt, sollte man sich erstmal die Maße des Dialogs oder Steuerelement, welches verschoben werden soll, besorgen. Für den Dialog werden wir direkt mit diesen ermittelten Maßen arbeiten, für den Button werden wir die ermittelten Maße erst in int-Variablen speichern und dann mit diesen Variablen weiter arbeiten.
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen MoveWindow und entferne alle vorhandenen Elemente
  • Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Steuerelemente/Dialog in Grösse und Position ändern - MoveWindow()
  • Füge zwei Buttons ein, ändere die Titel in Dialog verschieben und in Button verschieben. Behalte die vorgegebenen IDs (IDC_BUTTON1, IDC_BUTTON2)
  • Klicke doppelt auf jeden Button, um für jeden eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht zu erstellen. Übernehme die vorgegebenen Funktionsnamen
  • Füge folgenden Code in die eben erstellten Funktionen ein:
  void CMoveWindowDlg::OnButton1()
  {
    // Maße des Dialogs ermitteln
    CRect CDlgRect;
    GetWindowRect(&CDlgRect);

    // Dialog verschieben
    MoveWindow(CDlgRect.left-50 , CDlgRect.top -50, CDlgRect.Width(), CDlgRect.Height(), TRUE);
  }

  void CMoveWindowDlg::OnButton2()
  {
    // CRect Variable wird angelegt, um Höhe und Breite des Buttons zu ermitteln
    CRect CBtnRect;

    // Zeiger auf Button erstellen und den Button2 zuweisen
    CButton *pButton = (CButton*)GetDlgItem(IDC_BUTTON2);

    // Maße des Buttons ermitteln
    pButton->GetWindowRect(CBtnRect);

    // Ermittelte Koordinaten bzw Maße umwandeln
    ScreenToClient(&CBtnRect);

    // Höhe und Breite sowie die Position des Buttons in int übertragen
    int nButtonBreite = CBtnRect.Width();
    int nButtonHoehe = CBtnRect.Height();
    int nButtonPosLinks = CBtnRect.left;
    int nButtonPosOben = CBtnRect.top;

    // Button verschieben
    pButton->MoveWindow(nButtonPosLinks +20, nButtonPosOben +20, nButtonBreite, nButtonHoehe, TRUE);
  }


MoveWindow

Beschreibung:
Bei Klick auf die Buttons verschiebt sich entweder nur der Button oder der ganze Dialog. Je nachdem wie groß dein Dialog ist, kann es sein das du die Parameter in der MoveWindow() - Funktion anpassen musst.

Wie oben geschrieben ist die Übertragung der Maße des Buttons in int-Variablen nicht unbedingt nötig, man könnte die Werte der ermittelten Koordinaten auch direkt in MoveWindow() Funktion eintragen, also CBtnRect.Width() und CBtnRect.Height() bzw. CBtnRect.top und CBtnRect.left. Damit wollte ich nur zeigen das es sich bei diesen Werten eigentlich um int-Werte handelt, außerdem muss man in diesem Fall die ermittelten Koordinaten umwandeln, wie es in dieser Zeile geschieht:

  ScreenToClient(&CBtnRect);

Man könnte also auch die ermittelten Maße des Dialogs erst in int-Variablen übertragen und dann diese Variablen in der MoveWindow()-Funktion angeben.


Erweiterung des Beispiels:
Hier möchte ich euch zeigen, wie man einen verschobenen Dialog bzw. Button auch wieder an seine Startposition zurück schieben kann. Wir werden jetzt das Beispiel erweitern:
  • Füge eine Variable in die Dialogklasse (CMoveWindowDlg) ein - Variablentyp: BOOL, Variablenname: bBtnVerschoben, Zugriffstatus: Public. Füge noch eine Variable auf die gleiche Weise hinzu - Variablentyp: BOOL, Variablenname: bDlgVerschoben, Zugriffstatus: Public. Die Variablen sollen sich merken, ob der Button oder der Dialog verschoben wurde
  • Füge folgenden Code in die OnInitDialog() Funktion ein, um die eben erstellten Variablen zu initialisieren:
  BOOL CMoveWindowDlg::OnInitDialog()
  {
    ...
    ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    bBtnVerschoben = FALSE;
    bDlgVerschoben = FALSE;
    return TRUE;
  }
  • Ändere den Code in den Funktionen für die Buttons etwas um:
  void CMoveWindowDlg::OnButton1()
  {
    // Maße des Dialogs ermitteln
    CRect CDlgRect;
    GetWindowRect(&CDlgRect);

    // Dialog verschieben
    if(bDlgVerschoben == FALSE)
    {
      // Dialog an neue Position verschieben
      MoveWindow(CDlgRect.left-50 , CDlgRect.top -50, CDlgRect.Width(), CDlgRect.Height(), TRUE);
      bDlgVerschoben = TRUE;
    }
    else
    {
      // Dialog wieder in Ausgangsposition setzen
      MoveWindow(CDlgRect.left+50, CDlgRect.top+50, CDlgRect.Width(), CDlgRect.Height(), TRUE);
      bDlgVerschoben = FALSE;
    }
  }

  void CMoveWindowDlg::OnButton2()
  {
    // CRect Variable wird für die Maße des Buttons benötigt
    CRect CBtnRect;

    // Zeiger auf Button erstellen und den Button2 zuweisen
    CButton *pButton = (CButton*)GetDlgItem(IDC_BUTTON2);

    // Maße des Buttons ermitteln
    pButton->GetWindowRect(CBtnRect);

    // Ermittelte Koordinaten bzw Maße umwandeln
    ScreenToClient(&CBtnRect);

    // Höhe und Breite sowie die Position des Buttons in int übertragen
    int nButtonBreite = CBtnRect.Width();
    int nButtonHoehe = CBtnRect.Height();
    int nButtonPosLinks = CBtnRect.left;
    int nButtonPosOben = CBtnRect.top;

    // Button verschieben
    if(bBtnVerschoben == FALSE)
    {
      // Button an neue Position verschieben
      pButton->MoveWindow(nButtonPosLinks +20, nButtonPosOben +20, nButtonBreite, nButtonHoehe, TRUE);
      bBtnVerschoben = TRUE;
    }
    else
    {
      // Button wieder in Ausgangsposition setzen
      pButton->MoveWindow(nButtonPosLinks -20, nButtonPosOben -20, nButtonBreite, nButtonHoehe, TRUE);
      bBtnVerschoben = FALSE;
    }
  }



Größe von Dialogen oder Steuerlementen verändern:
Wie man dies anstellen kann, dürfte eigentlich klar sein, werde es hier aber trotzdem nochmal zeigen. Man muss einfach nur die Breite oder Höhe des Dialogs oder Steuerelement in der MoveWindow()-Funktion verändern.
  • Ändere den schon vorhandenen Code für die Funktion OnButton1() folgendermaßen um:
  void CMoveWindowDlg::OnButton1()
  {
    ...
    // Dialog verschieben
    if(bDlgVerschoben == FALSE)
    {
      // Dialog an neue Position verschieben
      MoveWindow(CDlgRect.left-50 , CDlgRect.top -50, CDlgRect.Width() +50, CDlgRect.Height() +50, TRUE);
      bDlgVerschoben = TRUE;
    }
    else
    {
      // Dialog wieder in Ausgangsposition setzen
      MoveWindow(CDlgRect.left+50, CDlgRect.top+50, CDlgRect.Width() -50, CDlgRect.Height() -50, TRUE);
      bDlgVerschoben = FALSE;
    }
  }
  • Ändere den schon vorhandenen Code für die Funktion OnButton2() folgendermaßen um:
  void CMoveWindowDlg::OnButton2()
  {
    ...
    if(bBtnVerschoben == FALSE)
    {
      // Button an neue Position verschieben
      pButton->MoveWindow(nButtonPosLinks +20, nButtonPosOben +20, nButtonBreite +20, nButtonHoehe +20, TRUE);
      bBtnVerschoben = TRUE;
    }
    else
    {
      // Button wieder in Ausgangsposition setzen
      pButton->MoveWindow(nButtonPosLinks -20, nButtonPosOben -20, nButtonBreite -20, nButtonHoehe -20, TRUE);
      bBtnVerschoben = FALSE;
    }
  }


MoveWindow2


Downloads: MoveWindow1.exe - Gesamtes Projekt1 (nur verschieben)
                      MoveWindow2.exe - Gesamtes Projekt2 (verschieben+Größe ändern)

 

Steuerelemente aktivieren bzw. deaktivieren - EnableWindow()

Mit der Funktion EnableWindow() kann man Steuerelemente zur Laufzeit deaktivieren bzw. aktivieren. Diese Funktion wird in Anwendungen sehr oft verwendet. Wenn der Benutzer z.B. nur unter bestimmten Bedingungen einen Button betätigen darf, deaktiviert man ihn einfach solange, bis diese Bedingung erfüllt ist. EnableWindow() ist eine Member-Funktion der Klasse CWnd, d.h. sie funktioniert für alle Steuerelemente.

Beispiel:
Im folgenden Beispiel wird eine kleine Anwendung erstellt, die demonstriert wie man Steuerelemente zur Laufzeit deaktivieren und auch wieder aktivieren kann.
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen EnableWindow und entferne alle vorhandenen Elemente. Sieh dir die untenstehende Abbildung an, um zu sehen wie die Steuerelemente eingefügt werden
  • Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Steuerelemente aktivieren bzw. deaktivieren - EnableWindow()
  • Füge zwei Buttons ein und ändere für den ersten Button den Titel in Steuerelemente aktivieren und die ID in: IDC_AKTIVIEREN. Gebe dem zweiten Button den Titel: Steuerelemente deaktivieren und ändere die ID in: IDC_DEAKTIVIEREN
  • Füge ein Eingabefeld und ein Kombinationsfeld ein. Behalte die vorgegebenen ID´s (IDC_EDIT1, IDC_COMBO1)
  • Klicke doppelt auf jeden Button, um zfür jeden eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht zu erstellen. Übernehme die vorgegebenen Funktionsnamen
  • Füge folgenden Code in die eben erstellten Funktionen ein:
  void CEnableWindowDlg::OnAktivieren()
  {
    // Steuerelemente aktivieren
    GetDlgItem(IDC_EDIT1)->EnableWindow(TRUE);
    GetDlgItem(IDC_COMBO1)->EnableWindow(TRUE);
    GetDlgItem(IDC_DEAKTIVIEREN)->EnableWindow(TRUE);

    // Button 'Steuerelemente aktivieren' deaktivieren
    GetDlgItem(IDC_AKTIVIEREN)->EnableWindow(FALSE);
  }

  void CEnableWindowDlg::OnDeaktivieren()
  {
    // Steuerelemente deaktivieren
    GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE);
    GetDlgItem(IDC_COMBO1)->EnableWindow(FALSE);
    GetDlgItem(IDC_DEAKTIVIEREN)->EnableWindow(FALSE);

    // Button 'Steuerelemente aktivieren' aktivieren
    GetDlgItem(IDC_AKTIVIEREN)->EnableWindow(TRUE);
  }
  • Füge jetzt noch folgenden Code in die OnInitDialog() - Funktion ein:
  BOOL CEnableWindowDlg::OnInitDialog()
  {
    ...
    // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    // Button 'Steuerelemente aktivieren' deaktivieren
    GetDlgItem(IDC_AKTIVIEREN)->EnableWindow(FALSE);

    return TRUE;
  }


EnableWindow()

Beschreibung:
Beim Start der Anwendung haben wir in der Funktion OnInitDialog() den Button Steuerelemente aktivieren deaktiviert, da es nicht sinnvoll ist diesen Button zu aktivieren. Die Steuerelemente sind ja bereits aktiviert, also macht es auch keinen Sinn auf diesen Button klicken zu können. Werden die Steuerelemente deaktiviert, aktivieren wir den Button Steuerelemente aktivieren wieder und deaktivieren dafür den Button Steuerelemente deaktivieren.


Downloads: EnableWindow.exe - Gesamtes Projekt

 

Steuerelemente ein- bzw. ausblenden - ShowWindow()

Mit der Funktion ShowWindow() kann man Steuerelemente zur Laufzeit ausblenden bzw. einblenden. ShowWindow() ist eine Member-Funktion der Klasse CWnd, d.h. sie funktioniert für alle Steuerelemente.

Beispiel:
Im folgenden Beispiel wird eine kleine Anwendung erstellt, die demonstriert wie man Steuerelemente zur Laufzeit ausblenden und auch wieder einblenden kann.
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen ShowWindow und entferne alle vorhandenen Elemente. Schau dir die untenstehende Abbildung an, um zu sehen wie die Steuerelemente eingefügt werden
  • Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Steuerelemente ein- bzw. ausblenden - ShowWindow()
  • Füge zwei Buttons ein und ändere für den ersten Button den Titel in Steuerelemente einblenden und die ID in: IDC_EINBLENDEN. Gebe dem zweiten Button den Titel: Steuerelemente ausblenden und ändere die ID in: IDC_AUSBLENDEN
  • Füge ein Eingabefeld und ein Kombinationsfeld ein. Behalte die vorgegebenen ID´s (IDC_EDIT1, IDC_COMBO1)
  • Klicke doppelt auf jeden Button, um für jeden eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht zu erstellen. Übernehme die vorgegebenen Funktionsnamen
  • Füge folgenden Code in die eben erstellten Funktionen ein:
  void CShowWindowDlg::OnEinblenden()
  {
    // Steuerelemente einblenden
    GetDlgItem(IDC_EDIT1)->ShowWindow(TRUE);
    GetDlgItem(IDC_COMBO1)->ShowWindow(TRUE);
    GetDlgItem(IDC_AUSBLENDEN)->ShowWindow(TRUE);

    // Button 'Steuerelemente einblenden' deaktivieren
    GetDlgItem(IDC_EINBLENDEN)->EnableWindow(FALSE);
  }

  void CShowWindowDlg::OnAusblenden()
  {
    // Steuerelemente ausblenden
    GetDlgItem(IDC_EDIT1)->ShowWindow(FALSE);
    GetDlgItem(IDC_COMBO1)->ShowWindow(FALSE);
    GetDlgItem(IDC_AUSBLENDEN)->ShowWindow(FALSE);

    // Button 'Steuerelemente einblenden' aktivieren
    GetDlgItem(IDC_EINBLENDEN)->EnableWindow(TRUE);
  }
  • Füge jetzt noch folgenden Code in die OnInitDialog() - Funktion ein:
  BOOL CEnableWindowDlg::OnInitDialog()
  {
    ...
    // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    // Button 'Steuerelemente aktivieren' deaktivieren
    GetDlgItem(IDC_EINBLENDEN)->EnableWindow(FALSE);

    return TRUE;
  }


ShowWindow()

Beschreibung:
Beim Start der Anwendung haben wir in der Funktion OnInitDialog() den Button Steuerelemente einblenden deaktiviert, da es nicht sinnvoll ist diesen Button zu aktivieren. Die Steuerelemente sind ja bereits sichtbar, also macht es auch keinen Sinn auf diesen Button klicken zu können. Werden die Steuerelemente ausgeblendet, aktivieren wir den Button Steuerelemente einblenden wieder und deaktivieren dafür den Button Steuerelemente ausblenden.


Downloads: ShowWindow.exe - Gesamtes Projekt

 

Zugriff auf Steuerelemente

Der Zugriff auf Steuerelemente kann mit Hilfe eines Zeigers oder mit einer Steuerelement-Variable vom Typ: Control erfolgen. Jeder sollte für sich selbst herausfinden welche Variante er bevorzugt. Ich bevorzuge den Zugriff über Variablen.

Um mit einem Zeiger auf ein Steuerelement zuzugreifen, erstelle einen Zeiger vom Typ des Steuerelements auf das zugegriffen werden soll und weise ihm mit Hilfe der Funktion GetDlgItem() das gewünschte Steuerelement zu. Da der zurückgegebene Zeiger vom Typ CWnd ist, muss er explizit in den gewünschten Typ gewandelt werden.

Am Beispiel eines Eingabefelds sieht das so aus:

  // Zeiger auf Eingabefeld erstellen und ein Eingabefeld zuweisen
  CEdit *pEdit = (CEdit*) GetDlgItem (IDC_EDIT1);


Um mit einer Variablen auf ein Steuerlement zuzugreifen, kann diese über den Klassen-Assistent hinzugefügt werden. Sie muss vom Typ: Control sein.


Hier eine Übersicht der Steuerelemente mit den zugehörigen Klassen:

Steuerelement Klasse
Bild-Element CStatic
Textfeld CStatic
Eingabefeld CEdit
Gruppenfeld CButton
Schaltfläche CButton
Kontrollkästchen CButton
Optionsfeld CButton
Kombinationsfeld CComboBox
Listenfeld CListBox
Bildlaufleiste CScrollBar
Drehfeld CSpinButtonCtrl
Statusanzeige CProgressCtrl
Regler CSilderCtrl
Zugriffstaste CHotKeyCtrl
Listenelement CListCtrl
Strukturansicht CTreeCtrl
Registerkarten CTabCtrl
Animation CAnimateCtrl
Rich-Edit CRichEditCtrl
Zeit-/Datumauswahl CDateTimeCtrl
Monatskalender CMonthCalCtrl
IP-Adresse CIPAdressCtrl
Erw. Kombinationsfeld CComboBoxEx


Beispiel:
Im folgenden Beispiel möchte ich euch anhand eines Eingabefelds zeigen, wie man mit einem Zeiger und einer Variablen darauf zugreifen kann.
  • Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Zugriff und entferne alle vorhandenen Elemente
  • Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Zugriff auf Steuerelemente
  • Füge ein Eingabefeld ein und behalte die vorgegebene ID (IDC_EDIT1)
  • Füge zwei Buttons ein und ändere die IDs in: IDC_ZEIGER und IDC_VARIABLE. Ändere auch noch die Titel in: Zeiger und Variable
  • Füge eine Member-Variable für das Eingabefeld IDC_EDIT1 ein - Kategorie: Control, Variablentyp: CEdit, Name: m_ctlEdit
  • Klicke doppelt auf jeden Button, um für jeden eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht einzufügen und übernehme die vorgeschlagenen Funktionsnamen
  • Füge folgenden Code in die eben erstellten Funktionen ein:
  void CSt_ZugriffDlg::OnZeiger()
  {
    CEdit *pEdit = (CEdit*) GetDlgItem (IDC_EDIT1);
    pEdit->SetWindowText("Zugriff über Zeiger");
  }

  void CSt_ZugriffDlg::OnVariable()
  {
    m_ctlEdit.SetWindowText("Zugriff über Variable");
  }


Zugriff


Downloads: Zugriff.exe - Gesamtes Projekt

 

Die Vervielfältigung der auf diesen Seiten enthaltenen Informationen und Grafiken ist untersagt, ausgenommen davon ist sämtlicher auf diesen Seiten aufgeführter 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