Eigene Text-/Editfelder

Außer dass das Aussehen des Dialogs verändert werden kann, kann selbstverständlich auch das Aussehen der Steuerelemente verändert werden. Auf dieser Seite werden wir uns ansehen, wie das Aussehen der Text- und Editfelder verändert wird. Der fertige Dialog zu dieser Tipps&Tricks Seite wird folgendes Aussehen besitzen:

Beginnen wir dem Verändern eines Textfeldes. Auch hierfür könnten wir die auf der vorherigen Tipps&Tricks Seite aufgeführte OnCtlColor(...) Methode des Dialogs verwenden, da OnCtlColor(...) durch die MFC auch für alle im Dialog enthaltenen Steuerelemente aufgerufen wird. Der letzte Parameter für das zu zeichnende Element würde hier den Wert CTLCOLOR_STATIC enthalten. Dies hätte aber den Nachteil, dass ohne weitere Abfrage (des Parameters CWnd*) alle Textfelder eines Dialogs immer gleich dargestellt würden. Wir werden hier einen etwas anderen Weg einschlagen um so gezielt einzelne Textfelder mit einem anderen Aussehen zu erhalten. Dazu wird zunächst für jede abweichende Darstellung über den Klassen-Assistenten eine neue MFC-Klasse zum Projekt hinzugefügt die von der Basisklasse CStatic abgeleitet ist. Dieser Klasse wird dann ein Nachrichtenbearbeitet für die 'WINDOWS-Nachricht' WM_CTLCOLOR hinzugefügt.

Beachten Sie dabei, dass die Nachricht mit dem Zeichen '=' beginnt. Nachrichten die mit einem '=' beginnen sind so genannte reflektierte Nachrichten, d.h. sie werden nicht von WINDOWS direkt an das Steuerelement gesendet. Vielmehr sendet WINDOWS hier die Nachricht WM_CTLCOLORSTATIC an den Dialog und die MFC leitet die Nachricht dann an die Methode OnCtlColor(...) des Steuerelements weiter. Dies ist auch der Grund, warum in der OnCtlColor(...) Methode des Dialogs der Aufruf Basisklassen-Methode nicht entfernt werden darf (siehe auch vorherige Tipps&Tricks Seite). Die Basisklassen-Methode ist für die Weiterleitung der Nachricht an das Steuerelement verantwortlich.

Um nun dem Textfeld eine anderes Aussehen zu geben, müssen innerhalb der Methode CtlColor(...) der neuen Klasse die Zeichenattribute (CDC) einfach entsprechend umgesetzt werden. Zu beachten ist dabei aber, dass der Attribut-DC m_hAttribDC ebenfalls gesetzt werden muss.

HBRUSH COwnStatic::CtlColor(CDC* pDC, UINT nCtlColor)
{
    // TODO: Attribute des Gerätekontexts hier ändern

    // TODO: Pinsel ungleich NULL zurückgeben, falls die Behandlungsroutine ...
    // Font fuer statische Elemente auswaehlen
    pDC->m_hAttribDC = pDC->m_hDC;
    pDC->SelectObject(m_CStaticFont);
    // Text in transparent in blau ausgeben
    pDC->SetBkMode(TRANSPARENT);
    pDC->SetTextColor(RGB(0,0,0xff));
    // Brush fuer statische Elemente zurueckgeben
    return m_CBackBrush;
}

Im obigen Listing wird zunächst der Zeichensatz für das Textfeld umgesetzt und dann noch der Brush für Hintergrund. Der dazu notwendige Zeichensatz und Brush (CFont- bzw. CBrush-Objekt) wird im Konstruktor der Klasse erstellt.

Um nun ein Textfeld mit diesen Attributen darzustellen, wird über den Klassen-Assistent das entsprechende Textfeld über eine Membervariable mit der neuen Klasse verknüpft.

Beachten Sie dabei, dass unter Kategorie der Typ Control eingestellt ist und unter Variablentyp die neu erstellte Klasse.

Wollen Sie in einem Dialog mehrere Textfelder mit unterschiedlichem Aussehen verwenden, so erstellen Sie einfach mehrere von CStatic abgeleitete Klassen und überschreiben dort die Methode CtlColor(...) entsprechend. Um weitere Textfelder mit den Standard-Aussehen darzustellen brauchen Sie nichts weiter tun.

Auf die gleiche Art und Weise können Sie dann auch Editfelder mit einem eigenen Aussehen erstellen. Der einzige Unterschied zu den Textfeldern mit eigenem Aussehen besteht darin, dass die hierfür neu zu erstellende Klasse nun nicht von CStatic sondern von CEdit abgeleitet wird. Wollen Sie bei Editfeldern auch einen anderen Zeichensatz einstellen, so können Sie dies nicht in der Methode OnCtlColor(...) tun da ansonsten eventuell Zeichen bei der Darstellung abgeschnitten werden. Am Besten erstellen Sie innerhalb des Konstruktors des Editfeldes den Zeichensatz und fügen dann zur Klasse des Editfeldes eine Methode hinzu um den Zeichensatz einzustellen. Im Beispiel erfolgt dies durch die Methode SetFont(...). Diese Methode rufen Sie dann von der Methode OnInitDialog(...) des Dialogs aus auf.

Das fertige Beispiel finden Sie unter 08Dialoge\OwnEdStat.



Copyright © 2004

Senden Sie Emails mit Fragen oder Kommentaren zu dieser Website an: mailto:info@cpp-tutor.de
 Wolfgang Schröder, Lerchenweg 23, D-72805 Lichtenstein. Tel: +49 7129 6470