Edit Controls automatisch färben
-
also ich erzeuge meine Edits statisch von hand im Resourceeditor und füge über den Klassenassi Member-Variablen zu. Wie lege ich nun so ein Array an und was ist denn besser? Eines mit CWnd Objekten oder eines mit den IDs? Für mich wäre glaub ich die IDs besser, da ich mit integer besser jonglieren kann wie mit CWnd-Objekten. Aber wenn das nur mit nem Handstand geht, dann werde ich CWnd Objekt-Array machen müssen
-
Hallo Peterchen (oder auch gerne jemand anders)
Die Idee ist ja gut aber wie kann ich sowas umsetzen?
-
ping' mich heut abend noch mal an (msg hier). Muß grad fleißig Geld verdienen
-
OK dann verschieben wir das auf Montag bin nämlich jetzt im WE und bin für diese Woche fertig mit fleißig Geld verdienen.
Bis Montag
-
So Peterchen nun ist es wieder montag und ich hoffe du kannst mir erklären, was du da oben geschrieben hast. Wäre echt nett Danke schon im Voraus!
-
Kann mir bitte jemand sagen wie ich mir ELEGANT ein Array meiner EditFelder anlege? Ich brauch das Array um das im ersten Post beschriebene Problem zu lösen!
-
geht ja schon los....
Wie "färbst" du die controls? Überschreibst du WM_CTLCOLORDLG?
-
Bisher färbe ich sie wie gesagt noch gar nicht aber sonst färbe ich sie mit hilfe von WM_CTLColor bzw der daraus entstenden FKT
OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
Und nu?
Danke schon im Voraus für die Hilfe!
-
In WM_CTLCOLORx müßtest Du ja das HWND vergleichen richtig?
Du hkannst dir ein Array / std::set von entweder den ID's oder den HWND's anlegen. Im folgenden für die ID's:Erste Variante:
const UINT ArrayIDs[] = { IDC_EDIT_1, IDC_EDIT_2, IDC_EDIT_3, ... }; const UINT ArrayIDLen = sizeof(ArrayIDs)/sizeof(ArrayIDs[0]); const UINT * found = std::find(ArrayIDs, ArrayIDs+ArrayIDLen); if (found != ArrayIDs+ArrayIDLen) { // ID ist im array }
Eine andere Variante (wenn du statt der "vielen ID's" lieber eine fette Schleife hackst:
mit GetWindow(GW_CHILD), GetWindow(GW_HWNDNEXT) rasselst du durch alle Child-Fenster der Controls und siebst die Edit-Controls so aus:
// HWND wnd ist ein edit? WNDCLASSEX wcx; ZeroMemory(&wcx, sizeof(wcx)); wcx.cbSize = sizeof(wcx); ::GetClassInfoEx(wnd, &wcx)); if (HIWORD(wcx.lpszClassName != NULL) // ist ein string (kein Atom) { if (_tcscmp(wcx.lpszClassName) == _T("EDIT")) { // wnd ist ein EDIT } }
(geht nur für "echte" Edits!)
Die ID's der edits kannst du dir z.B. in einem std::vector oder std::set merken.
-
Was ist ein "echtes" Edit bzw. ein unechtes?
-
WOW!
Bin erschlagen! Doch leider verstehe ich es nicht so ganz! Die zweite Variante fällt weg, da ich nicht alle Editfelder sondern nur bestimmte färben will. Die erste Variante ist nicht schlecht, nur die Zeileconst UINT * found = std::find(ArrayIDs, ArrayIDs+ArrayIDLen);
macht mir sorgen! Ich hätte jetzt eine Schleife durchlaufen wo ich die kommende ID mit jedem Eintrag vergleiche, aber deines gefällt mir schon besser! nur was ist std::find? der Compiler sagt mir:
error C2653: 'std' : is not a class or namespace name
error C2065: 'find' : undeclared identifier
error C2440: 'initializing' : cannot convert from 'int' to 'const unsigned int *'
Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
-
Schleife ist auch ok.
std::find nimmt fast beliebige Anfangs- und End-iteratoren, und sucht das erste Element, das paßt.
C-Pointer sind auch zulässige iteratoren (#include <algorithm> fehlt noch)
-
also das mit find hab ich immernoch nicht hin gebracht, aber dafür mit ner einfachen for Schleife. Jetzt hab ich es wie folgt:
bool found = false; HBRUSH hbr = CRecordView::OnCtlColor(pDC, pWnd, nCtlColor); const UINT ArrayIDs[] = { IDC_EDT_SUCHEN, IDC_EDT_KOMMANDO}; const UINT ArrayIDLen = sizeof(ArrayIDs)/sizeof(ArrayIDs[0]); for(int i=0; i<=ArrayIDLen; i++) { if (pWnd->GetDlgCtrlID() == ArrayIDs[i]) found = true; } CString EditText; pWnd->GetWindowText(EditText); if (found&& Test=="TRW:W1") { // ID ist im array pDC->SetBkMode(TRANSPARENT); // Hintergrund transparent machen (also KEIN SetBkColor nötig) HBRUSH B = CreateSolidBrush(RGB(123,123,123)); //Hintergrundfarbe return (HBRUSH) B; // Die Farbe soll genommen werden }
Vielen Dank für deine Hilfe!!
-
J U H U U U U
Ich hab das mit dem find doch hinbekommen, es war ein kleiner Fehler drin:
In der Zeile:const UINT * found = std::find(ArrayIDs, ArrayIDs+ArrayIDLen,pWnd->GetDlgCtrlID());//der letzte Übergabeparameter hat gefehlt!
Zusammen sieht das nun so aus:
const UINT ArrayIDs[] = { IDC_EDT_SUCHEN, IDC_EDT_KOMMANDO}; const UINT ArrayIDLen = sizeof(ArrayIDs)/sizeof(ArrayIDs[0]); const UINT * found = std::find(ArrayIDs, ArrayIDs+ArrayIDLen,pWnd->GetDlgCtrlID()); if (found != ArrayIDs+ArrayIDLen) { pDC->SetBkMode(TRANSPARENT); // Hintergrund transparent machen (also KEIN SetBkColor nötig) HBRUSH B = CreateSolidBrush(RGB(123,123,123)); //Hintergrundfarbe return (HBRUSH) B; // Die Farbe soll genommen werden }