CStatic Text in Farbe
-
Hallo
Ich möchte ein CStatic Element platzieren die Schrift aber in Farbe schreiben.
Ich wüsste eine Möglichkeit in dem ich eine eigene Klasse baue die von CStatic abgeleitet ist. usw usw ...Aber geht das nicht einfacher ??
Gruß
Martin
-
Ich hab hier einen alten Schnipsel, wo ich auch mal Edits und Statics mit farbigem Text versehen habe. Du musst OnCtlColor überschreiben:
HBRUSH CDlgTestCommLPT::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); pDC->SetBkMode(TRANSPARENT); //transparenter Hintergrund für Text switch(pWnd->GetDlgCtrlID()) { case IDC_EDIT_ID_MAININI: { CString idMainIni; CString idScanner; m_ctlEditIDMainIni.GetWindowText(idMainIni); m_ctlEditGetID.GetWindowText(idScanner); if(0!=idMainIni.Compare(idScanner)) { pDC->SetTextColor(RGB(240,240,240)); return m_brushRed; }else { pDC->SetTextColor(RGB(0,0,0)); return m_brushGreen; } } case IDC_STATIC_NOSCANNER: pDC->SetTextColor(RGB(255,0,0)); } return m_brushBackground; }
-
Hi
Ja aber dazu muss ich doch ableiten oder ?
Grüße
-
Du musst nur OnCtlColor deiner Dialogklasse überschreiben und wie im Beispiel gestalten (also einfach ein switch machen und für die ID deines Statics CDC::SetTextColor ausrufen). Mehr ist nicht nötig, denke ich. Ist schon lange her, daher nicht böse sein, wenn ich irgendwas vergessen habe. Aber ich denke, so sollte es gehen...
-
@_matze: Wenn Du SetBkMode(TRANSPARENT); sezt, dann wird ein Static nicht korrekt neu gezeichnet, wenn man SetWindowText oder SetDlgItemText ausführt, nachdem der Dialog erzeugt wurde.
Ändert sich das Control nicht mehr geht das.
-
Martin Richter schrieb:
@_matze: Wenn Du SetBkMode(TRANSPARENT); sezt, dann wird ein Static nicht korrekt neu gezeichnet, wenn man SetWindowText oder SetDlgItemText ausführt, nachdem der Dialog erzeugt wurde.
Ändert sich das Control nicht mehr geht das.Hab grad nochmal nachgesehen. Für dieses Static wird auch nicht mehr SetWindowText o.ä. aufgerufen (es wird lediglich versteckt oder angezeigt). Bei dem Edit Control ist das aber anders. Und das wird nach SetWindowText korrekt neugezeichnet. Demnach gilt deine Aussage nur für das Static?
-
Hmm
In dem Fall leite ich aber doch liebr ab:
HBRUSH CColorStatic::CtlColor(CDC* pDC, UINT nCtlColor) { HBRUSH hbr; hbr = (HBRUSH)m_brBkgnd; pDC->SetBkColor(m_crBkColor); pDC->SetTextColor(m_crTextColor); return hbr; }
Spricht was dagegen wenn ich es so mache ? Bzw habe ich einen Nachteil ?
Ich Finde das in einer eigenen Klasse dann übersichtlicher ...
Ich finde nur nicht was mir nCtlColor übergibt ? Muss ich mit dem Wert noch etwas machen ?
-
_matze schrieb:
Demnach gilt deine Aussage nur für das Static?
Habe ich ja auch geschrieben.
Dennoch TRANPARENT führt auch bei anderen Control zu unerwünscten Effekten.
Es wird normalerweise immer erwartet das eine BK-Color gesetzt wird.
-
HBRUSH CColorStatic::CtlColor(CDC* pDC, UINT nCtlColor) { pDC->SetBkColor(m_crBkColor); pDC->SetTextColor(m_crTextColor); return (HBRUSH)m_brBkgnd; }
So spricht denk ich mal nix dagegen.
nCtlColor brauchst du nicht zu beaschten, da das nur sinn macht wenn du die OnCtlColor des Dialoges Überschreibst,siehe MSDN OnCtlColor.