Hintergrundfarbe bestimmter EditControlls ändern
-
Hi Zusammen, ich habe eine Anwendung, bei der ich sehr viele editcontrols hab. Nun möchte ich wenn in einem der Felder NIO steht den Hintergrund dieses Controls ändern. Ich habe schon sehr viel gelesen, aber nie das richtige gefunden, bzw ich habe es nicht verstanden. Was muss ich machen um bei einem Control die bg-farbe zu ändern? Also wenn ich das richtig verstanden habe leg ich mal sowas in die Art an:
HBRUSH CACRSQLView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
mach darin dann meineFarben in etwa so.
pDC->SetTextColor(RGB(0,0,0)); pDC->SetBkColor(RGB(255,255,255));
Ich weiß jetzt aber nicht wie ich dieser OnCtlColor ein bestimmtes Edit übergebe! Geht das überhaupt so oder muss ich da ne Klasse von CEdit ableiten? Also hier z.b. http://www.codeproject.com/editctrl/enhfocusedit.asp machen sie letzteres. Kann mir mal jemand erklären wie ich Controls an die FKT übergebe?
-
WM_CLTCOLOR heißt die Nachricht dazu.
Die wird für JEDES Dialogelement aufgerufen - du musst sie nicht aufrufen.
In der Funktion kann man dann gucken, welches Control gerade dran ist.pWnd->GetDlgCtrlID()
Gibt noch andere praktische Sachen, musste mal forschen.
-
also hab ich das jetzt richtig verstanden meine ganzen Edits rufen alle WM_CTLCOLOR auf. Das verweist dann logischerweise auf meine Funktion
HBRUSH CACRSQLView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
Und wenn ich dann in der Funktion mache
pWnd->GetDlgCtrlID()
dann weiß ich in der FKT welches Control gerade die oben genannte FKT aufruft.
[RICHTIG??]
Das würde also für mich bedeuten, dass ich einfach in der FKT eine Abfrage machen kann,if Text == "NIO";//Text steht halt für den Text im Control pDC->SetBkColor(RGB(255,0,0));
Ist das so einfach? Muss ich probieren!
-
Genau, probier mal.
Ein Tip noch: In die Funktion reindebuggen ist genauso ätzend wie OnPaint. VC und das Programm dürfen sich nicht überdecken, sonst wird ja dauernd neu gezeichnet und du hängst wieder in der Funktion.
Für sowas braucht man dann am besten nen zweiten Monitor.
-
COOL!
Aber so ganz ist es noch nicht ganz das was ich will, wenn ich jetzt mal das hier mach:if (pWnd->GetDlgCtrlID() == IDC_EDT_ID) pDC->SetBkColor(RGB(255,0,0));
färbt er mir den Hintergrund des Textes. Das Edit-Control ist aber viel größer wie der Text! der Rest bleibt weiß! Da hab ich auch wieder bei Codeprojekt was gelesen, versteh es aber mal wieder nicht richtig! (liegt das an meinem Englisch? Jetzt mach ich schon ein Hochschulzertifikat für besondere Englisch kenntnisse und dennoch scheiterts!) Also erst mal den Link! http://www.codeproject.com/useritems/CReadOnlyEdit.asp der macht das ganze auf seine Control membervariable, wenn ich das mach geht da gar ncihts! Muss ich also auch erst ne Klasse von CEdit ableiten?
Will nicht unbedingt für so ne Kleinigkeit ne extra Klasse!
Hast mir noch nen Tip??
-
Versuch mal das hier:
HBRUSH B = CreateSolidBrush(::GetSysColor(COLOR_3DFACE)); //Hintergrundfarbe
So sieht das bei mir im Zusammenhang aus:
HBRUSH CFilialenView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor); // Die Listbox für die Mitarbeiter soll bitte deaktiviert aussehen. if ((pWnd->GetDlgCtrlID() == IDC_LST_MITARBEITER) && (m_nViewMode == VIEW_MODE_VIEW)) { pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT)); // Leider kein Effekt -> TODO: Listboxklasse machen pDC->SetBkMode(TRANSPARENT); HBRUSH B = CreateSolidBrush(::GetSysColor(COLOR_3DFACE)); //Hintergrundfarbe return (HBRUSH) B; } return hbr; }
-
Joa, also bei mir tut sich da irgendwie nichts, ich nimm mal an, dass dein COLOR_3DFACE einfach eine RGB Farbe defined, oder?
Also bei schauts so aus:if (pWnd->GetDlgCtrlID() == IDC_EDT_POT_TST_IST) { HBRUSH B = CreateSolidBrush(::GetSysColor(RGB(0,0,100))); }
Aber öhm ich seh nichts!
-
Guck bitte in die MSDN, was GetSysColor macht.
-
also ich hab mal nachgeschat, und so bekomm ich die Fenster die halt 3D Face sind OK, aber wenn ich dann setBKcolor mach passiert wieder das gleiche Texthintergrund ändert sich rest bleibt weiß!
estartu_de schrieb:
HBRUSH CFilialenView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor); // Die Listbox für die Mitarbeiter soll bitte deaktiviert aussehen. if ((pWnd->GetDlgCtrlID() == IDC_LST_MITARBEITER) && (m_nViewMode == VIEW_MODE_VIEW)) { pDC->SetTextColor(::GetSysColor(COLOR_WINDOWTEXT)); // Leider kein Effekt -> TODO: Listboxklasse machen pDC->SetBkMode(TRANSPARENT); HBRUSH B = CreateSolidBrush(::GetSysColor(COLOR_3DFACE)); //Hintergrundfarbe return (HBRUSH) B; } return hbr; }
´
das TODO lässt mich darauf schließen dass die LB nicht deaktiviert ausschaut, warum nicht CDC::GrayString?
-
pDC->SetBkMode(TRANSPARENT); // Hintergrund transparent machen (also KEIN SetBkColor nötig) HBRUSH B = CreateSolidBrush(RGB(0,0,100)); //Hintergrundfarbe return (HBRUSH) B; // Die Farbe soll genommen werden
Das TODO steht da, weil ich schwarzen Text haben will, der ist aber immer grau.
Und weil sich das (genauso wie bei Comboboxen und Edits) nicht mal eben verbiegen lässt, was die Textfarbe im deaktivierten Zustand angeht, muss man eine eigene Klasse machen und da selber zeichnen oder andere Kopfstände veranstalten.
Dazu hatte ich noch keine Lust und soooooo dringend ist es nicht. Lesen kann man es ja ausreichend.
-
Du weißt natürlich genau was ich will!! *schmatzaufbacke*
Jetzt geht es so wie ich will!!D A N K E
-
Hm jetzt brauch ich dich doch nochmal schnell Ich will dass mein Readonly nicht grau ist! Ich mach:
switch (nCtlColor) { case CTLCOLOR_STATIC: // Für alle Statics pDC->SetTextColor(RGB(0,0,0)); pDC->SetBkColor(RGB(255,255,255)); case IDC_EDT_ID: pDC->SetTextColor(RGB(255,0,0)); pDC->SetBkColor(RGB(255,255,255)); case CTLCOLOR_DLG: // Für den Dialog return (HBRUSH)m_brush; } return hbr;
Jetzt sollte er doch eigentlich nur IDC_EDT_ID rot machne, oder?
Er macht mir alle statics rot!
-
break soll Wunder wirken.
Und ich glaube, nCtlColor hat nix mit IDC_EDT_ID zu tun - falls es also nicht klappen will, guck dir das genauer an.
-
OK OK ich hab gepennt, aber wenn ich ein Edit disable, ist es dann kein Edit mehr?
denn wenn ich das hier mache:switch (nCtlColor) { case CTLCOLOR_STATIC: // Für alle Statics pDC->SetTextColor(RGB(0,0,0)); //<=die sind ROT!! pDC->SetBkColor(RGB(255,255,255)); case CTLCOLOR_EDIT: pDC->SetTextColor(RGB(255,0,0)); pDC->SetBkColor(RGB(255,255,255)); case CTLCOLOR_DLG: // Für den Dialog return (HBRUSH)m_brush; } return hbr;
dann färbt er keine disabled Edits. Also nur read-write edits!
Ach sonst werden die halt alle RW-Edits!
-
Hast du gelesen, was ich oben geschrieben habe?
Das TODO steht da, weil ich schwarzen Text haben will, der ist aber immer grau.
Und weil sich das (genauso wie bei Comboboxen und Edits) nicht mal eben verbiegen lässt, was die Textfarbe im deaktivierten Zustand angeht, muss man eine eigene Klasse machen und da selber zeichnen oder andere Kopfstände veranstalten.Mach sie ReadOnly und gut ist.
-
OK ist zwar nicht ganz so schön wie disabled und schwarz aber hast ja recht alles andere ist zu viel aufwand für zu wenig nutzen. Read only kann man sie halt immernoch markieren. Aber jetzt ist es immerhin mal schwarz! Und das ist die Hauptsache.
DANKE