Comboboxes in normalen Fenster
-
-
Oh nöööö,
funktioniert leider bei mir nicht.
Ich mache das so:
LONG_PTR CExporter::m_ComboBoxProc; // Als static in meiner Klasse!!! // ... LRESULT CALLBACK CExporter::ComboBoxProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_CTLCOLORLISTBOX: case WM_CTLCOLORBTN: SetBkColor(reinterpret_cast<HDC>(wParam), TRANSPARENT); SetTextColor(reinterpret_cast<HDC>(wParam), RGB(0, 255, 255)); return reinterpret_cast<LRESULT>(GetStockObject(BLACK_BRUSH)); break; } return CallWindowProc(reinterpret_cast<WNDPROC>(m_ComboBoxProc), hWnd, message, wParam, lParam); } // ... LRESULT CALLBACK CExporter::InitProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND Btn1, CB1, CB2, CB3; switch( message ) { case WM_CREATE: CB1 = CreateWindowEx(NULL, "BUTTON", "Unterteilung auf Basis der Materialnamen", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, 20, 20, 350, 20, hWnd, reinterpret_cast<HMENU>(0x8801), GetModuleHandle(0), NULL); CB2 = CreateWindowEx(NULL, "BUTTON", "Unterteilung auf Basis der Modellnamen", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, 20, 50, 350, 20, hWnd, reinterpret_cast<HMENU>(0x8802), GetModuleHandle(0), NULL); CB3 = CreateWindowEx(NULL, "BUTTON", "Keine Unterteilung vornehmen", WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, 20, 80, 350, 20, hWnd, reinterpret_cast<HMENU>(0x8803), GetModuleHandle(0), NULL); Btn1 = CreateWindowEx(NULL, "BUTTON", "Weiter...", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 160, 140, 60, 20, hWnd, reinterpret_cast<HMENU>(0x8804), GetModuleHandle(0), NULL); m_ComboBoxProc = SetWindowLongPtr(CB1, GWLP_WNDPROC, (LONG_PTR)ComboBoxProc); m_ComboBoxProc = SetWindowLongPtr(CB2, GWLP_WNDPROC, (LONG_PTR)ComboBoxProc); m_ComboBoxProc = SetWindowLongPtr(CB3, GWLP_WNDPROC, (LONG_PTR)ComboBoxProc); if(!SendMessage(CB1, WM_CTLCOLORBTN, NULL, NULL)) ERROR_MESSAGE("SendMessage", -1); if(!SendMessage(CB2, WM_CTLCOLORBTN, NULL, NULL)) ERROR_MESSAGE("SendMessage", -1); if(!SendMessage(CB3, WM_CTLCOLORBTN, NULL, NULL)) ERROR_MESSAGE("SendMessage", -1); break; // ... case WM_DESTROY: SetWindowLongPtr(CB1, GWLP_WNDPROC, m_ComboBoxProc); SetWindowLongPtr(CB2, GWLP_WNDPROC, m_ComboBoxProc); SetWindowLongPtr(CB3, GWLP_WNDPROC, m_ComboBoxProc); break; default: return DefWindowProc( hWnd, message, wParam, lParam ); } return 0;
-
Aus irgendeinem Grund wird leider diese Nachricht gar nicht gesendet. Und wenn ich sie eben manuell sende (was funktioniert) ändert sich nichts!!!
-
Also ich hatte früher auch dieses Problem und habe so behoben, dass ich auf
WM_CTLCOLORLISTBOX
WM_CTLCOLORBTNIm WindowProc vom Parent reagiert habe und wenn du nähere Information willst, kann ich dir auch einige Quelltextstückchen überlassen, bei denen ich weiß, dass sie funktionieren.
-
Hi,
ich weiß nicht, ob es daran liegt. Ich habe ja die Nachrichten auch manuel nach dem erstellen gesendet, und die Childfenster haben sich kein bisschen verändert!!!
Aber, wenn du Code hast, wo es funktioniert: Nur her damit!!!
Danke...
-
Klar, dass es nicht funktioniert, wenn ich nach dem erstellen des Child-Fensters schreibe:
if(!SendMessage(CB1, WM_CTLCOLORBTN, NULL, NULL)) ERROR_MESSAGE("SendMessage", -1); if(!SendMessage(CB2, WM_CTLCOLORBTN, NULL, NULL)) ERROR_MESSAGE("SendMessage", -1); if(!SendMessage(CB3, WM_CTLCOLORBTN, NULL, NULL)) ERROR_MESSAGE("SendMessage", -1);Durch das Sub-Classing erwartet ja der Compi ein HDC als wParam, und bei ist es nur NULL :)...
Nun denn, die Nachrichten
WM_CTLCOLORLISTBOX
WM_CTLCOLORBTNwerden so nicht gesendet und ich weiß nicht, was ich noch tun soll. Kann mir nicht jemand bitte helfen???
Danke...
PS: Wie kriege ich das HDC meiner HWND-Combobox
-
Der_WiXXer schrieb:
Wie kriege ich das HDC meiner HWND-Combobox
GetDC mit dem HWND der Combobox - ich kann mir aber nicht vorstellen, dass das manuelle Senden etwas bringt

-
Ja, es hat nichts gebracht. Irgendwie hat leider gar nichts gebracht...

Die Funktion wird erfolgreich ausgeführt (wenn ich die Nachricht manuell sende), aber es ändert sich nichts.
Ach, ist ja auch egal. Wenn jemand noch Code hat, wo soewtas funktioniert, kann er es hier gerne posten. Sonst,
für mich ist das Thema vorbei. Ich mach mir meine eigene Klasse für Steuerelemente...
Naja, Schüss...
-
Du musst die Nachrichten im Parent empfangen!
LRESULT CALLBACK CExporter::InitProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch( message ) { case WM_CTLCOLORLISTBOX: ...
-
Aha, vielen Dank.
Hat ja auch JeanLeBon geschrieben. (Wer lesen kann, ist bei solchen Sachen deutchlich bevorteiligt!
) Leider funktioniert es so immer noch nicht...Ich mache das so:
case WM_CTLCOLORLISTBOX: case WM_CTLCOLORBTN: if(SetBkMode(GetDC(CB1), TRANSPARENT)==CLR_INVALID) ERROR_WINAPI("SetBkMode", -1); if(SetBkMode(GetDC(CB2), TRANSPARENT)==CLR_INVALID) ERROR_WINAPI("SetBkMode", -1); if(SetBkMode(GetDC(CB3), TRANSPARENT)==CLR_INVALID) ERROR_WINAPI("SetBkMode", -1); return reinterpret_cast<LRESULT>(GetStockObject(WHITE_BRUSH)); break;Fehler gibt es aber nicht!!!
Vielen Dank nochmals...
-
Na, du musst aber schon den DC aus dem wParam nehmen, sonst wird das nichts
(so wie du es in CExporter::ComboBoxProc hattest)
-
Vielen Dank,
jetzt wird die Funktion SetBkMode wenigenstens erfolgreich gesendet, ohne dass ich selbst nachhelfen muss! (Juhu :D)
Leider sehe ich aber keine Unterschied! *wein*
Naja,
schönes Wochenende...
-
Jetzt funktioniert es plötzlich!!!

Ich habe einfach noch eine dritte Nachricht behandelt, und jetzt geht es eben. Jetzt meine letzte (und wirklich letzte Frage), welche Nachricht muss ich senden, um mein Child-Window-Button zu deaktivieren???
Danke...
-
EInfach hwnd des Buttons ermitteln und dann ganz normal deaktivieren indem du mit sendmessage WM_DEACTIVATE sendest.
-
Gibt es denn die Nachricht WM_DEACTIVATE???
-
Ich würds mal mit WM_ACTIVATE probieren. Bin mir aber nicht sicher, ob's funktioniert
-
Ich würde da eher EnableWindow nehmen

-
Also hier ist das versprochene Textstückchen:
//..... case WM_CTLCOLOREDIT: case WM_CTLCOLORLISTBOX: { if((HWND)lparam == Fensterquelltexthandle) { SetBkColor((HDC)wparam, RGB(255, 80, 80)); SetTextColor((HDC)wparam, RGB(0, 0, 130)); return((LRESULT)CreateSolidBrush(RGB(255, 80, 80))); } else if((HWND)lparam != Fensternormalerlinkhandle && (HWND)lparam != Fensteraktiverlinkhandle && (HWND)lparam != Fensterbesuchterlinkhandle && (HWND)lparam != Fenstermauszeigerlinkhandle) { SetBkColor((HDC)wparam, RGB(255, 255, 80)); SetTextColor((HDC)wparam, RGB(0, 130, 0)); return((LRESULT)CreateSolidBrush(RGB(255, 255, 80))); } else { SetBkColor((HDC)wparam, RGB(121, 121, 255)); SetTextColor((HDC)wparam, RGB(255, 200, 255)); UpdateWindow(Fensternormalerlinkhandle); UpdateWindow(Fensteraktiverlinkhandle); UpdateWindow(Fensterbesuchterlinkhandle); UpdateWindow(Fenstermauszeigerlinkhandle); return((LRESULT)CreateSolidBrush(RGB(121, 121, 255))); } } //.......Zur Erklärung:
ich finde hier im lparam heraus um welchen Handle es sich handelt (ich reagiere sowohl auf editfelder als auch comboboxen.
Dann setzte ich die Textfarbe die Texthintergrundfarbe und gebe eine Brush als LRESULT konvertiert zurück, der dann den Hintergrund für die Combobox oder editbox angibt. Das HDC ist im wparam.
Auf diese Nachrichten musst du im WindowProc vom Parent reagieren und du darfst nicht die Nachrichten selber schicken, sondern du kriegst sie automatisch geschickt. Hoffe es hat dir geholfen ;).