SetBkColor Problem bei abgeleiteter CStatic Klasse
-
Hallo,
folgendes (altbekanntes) Problem:
Ich habe eine abgeleitete Klasse CExStatic von CStatic erstellt und möchte standardmäßig schwarzen Text auf weißem Hintergrund.Ohne neue Klasse bekomme ich das zwar hin, habe aber den Nachteil daß ich in OnCtlColor der Dialogklasse jedes IDC der Statics abfragen müßte und das geht einfach nicht (zuviele davon).
Lediglich in der abgeleiteten Klasse OnCtlColor zu überladen reicht wohl nicht aus.
Hat jemand eine Idee?
-
Warum benutzt du im Dialog nicht nCtlColor = CTLCOLOR_STATIC von OnCtlColor(), sollten doch dann alle Statics deines Dialoges sich melden
-
CTecS schrieb:
Warum benutzt du im Dialog nicht nCtlColor = CTLCOLOR_STATIC von OnCtlColor(), sollten doch dann alle Statics deines Dialoges sich melden
Hallo,
ja das geht sicher auch aber ich möchte das eben flexibel als eigene Klasse haben, damit es sinnvoll wiederverwendbar ist (das wird eh eintreffen, da ich nicht nur 1 Applikation schreiben werde).
Außerdem kann es sein daß nicht alle Statics die eigene CExStatic sein werden, dann wäre deine Lösung auch nicht astrein.
-
na dann mach dir doch ne SetColor und 2 Members in der Klasse für Vorder- und Hintergrundfarbe. Füll in OnEraseBkgnd() den Hintergrund mit der entsprechenden Farbe und in der OnPaint Zeichneste den Text mit der entsprechenden Farbe und wenn de das noch besonders gut machen willst, machste noch den Font Flexibel.
Fertig! Mehr wüsste ich nicht was man so noch bei Text machen kann, außer du willst noch ein Bild Platzieren, dann kannste das ja auch der Klasse machen lassen
-
Hmm,
also ich habe mir mal
http://www.codeguru.com/cpp/controls/staticctrl/article.php/c2909
runtergeladen und da funzt es einwandfrei mit SetBkColor in OnCtlColor() der abgeleiteten Klasse.
Ich frage mich echt was da anders ist, das kann nur was "externes" sein...
-
Vermutlich weil dort Message-Refelection verwendet wird.
ON_WM_CTLCOLOR_REFLECT!
-
Martin Richter schrieb:
Vermutlich weil dort Message-Refelection verwendet wird.
ON_WM_CTLCOLOR_REFLECT!Ja das hab auch gesehen aber ich kann das REFLECT gar nicht hinzufügen.
Klassenansicht, Klasse markieren, Rechtsklick, Eigenschaften, MeldungsIcon und dann ist da nur WM_CTLCOLOR ohne REFLECT.
Wenn ich das dazuschreibe gibts folgenden Fehler:
error C2039: 'CtlColor': Ist kein Element von 'CExStatic'.
Was tun? (Benutze übrigens MSVS 2008 Standard).
-
ARGH!
Ganz oben mit nem = zuerst... *Kopf->Tisch*
Note that the equal sign in front of the message name in the list of messages you can handle indicates that the message is reflected. This is described in Defining a Message Handler for a Reflected Message.
-
Und selbst wenn es nicht in der Liste wäre?
Bist Du nicht in der Lage ein paar Zeilen selbst zu schreiben?
Musst Du alles durch Mausschubsen programmieren?
-
Martin Richter schrieb:
Und selbst wenn es nicht in der Liste wäre?
Bist Du nicht in der Lage ein paar Zeilen selbst zu schreiben?
Musst Du alles durch Mausschubsen programmieren?Das Problem ist mittlerweile vom Tisch.
Die Eigenschaft "Einfach" muß auf FALSE gesetzt werden muß, damit nicht nur der Text die neue Hintergrundfarbe annimmt, sondern das gesamte StaticField.
Hab ich nirgends gelesen.
(War man nicht in der Lage das zu erwähnen oder ich nicht in der Lage das aus der tollen Beschreibung zu "Einfach" herauszulesen? Sachen gibts!)
Damit genügt SetBkColor in CtlColor und man braucht kein WM_ERASEBKGND oder sonstige Extrasachen implementieren.
Und wer weiß? Vielleicht klappts ja auch mit der normalen WM_CTLCOLOR ohne REFLECT.
Dank an alle die geholfen haben!
-
MFC-Coder schrieb:
Und wer weiß? Vielleicht klappts ja auch mit der normalen WM_CTLCOLOR ohne REFLECT.
Nein! Denn WM_CTLCOLOR wird immer an das Parent gesendet!
_REFLECT sorgt dafür dass die Nachricht an das Fenster selbst "reflektiert" wird...