Groupboxes und Messages??
-
Hallo!
Könnt ihr mir helfen?? Ich habe eine Groupbox mit Fensterelementen drinne, aber wenn ich irgednetwas darin anklicke passiert gar nichts, keine Messages werden an die WindowPorocedure gesendet. Muss ich das noch irgendwo festlegen oder was mache ich da falsch?? Objekte die nicht in einer Groupbox sind geben, wie gewohnt eine Message zurück, wenn ich sie z.B. anklicke.Grüsse,code_pilot
-
Also im Normalfall geht das schon...
Zeig mal n bissel Codecu para
-
Die Nachrichten werden an das Parent-Fenster gesendet. (WM_COMMAND) Wenn du die Fenster auf der Groupbox erstellst, kommt die Nachrichten dort an. Subclassing der Groupbox um die Nachrichten zu verarbeiten wäre da eine Lösung, oder vielleicht gibt es noch was eleganteres.
-
Original erstellt von <Gregor>:
Die Nachrichten werden an das Parent-Fenster gesendet. (WM_COMMAND)Ja! Und genau das ist nicht der Fall! Es wird gar nichts gesendet wenn ich den Button in der Groupbox klicke, klicke ich aber den auserhalb der Box sendet dieser ein WM_COMMAND.
@para: Nein, ich werde mein 4500 Zeilen umfassendes Programm, das ich später auch kommerziell nutzen will und welches strengster Geheimhaltung unterliegt NICHT hier rein posten!
Danke und Gruss,
code_pilot
-
Muss ich der Groupbox etwas seperat die Message-Prozedur zuweisen oder wo könnte das Problem sonst noch liegen?? Weis den keiner eine Antwrt?????
Gruss, code_pilot
-
So, hier mal ein Beispielprogramm!
Genau dasselbe Problem! Der erste Button lässt sich klicken, sendet ein WM_COMMAND, der zweite jedoch, der sich in der Groupbox bfindet, lässt sich zwar drücken, sendet aber GAR NICHTS!Und weder im Petzold noch in der MSDN noch sonstwo im Internet finde ich eine Lösung! Oder ist das wieder eine von Microsofts tollen Bugs????
#include <windows.h> //#include <commctrl.h> #define ID_DATEI_EXIT 9001 HWND WNDWin[10]; HWND WNDEdit[200]; HWND WNDButton[200]; HWND WNDGroupBox; HMENU hMenu; HMENU hSubMenu; HINSTANCE hInstance; LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: PostQuitMessage(0); break; case WM_CREATE: //Button ohne Groupbox WNDButton[0] = CreateWindow("button", "Click me!",WS_CHILD | WS_VISIBLE | ES_CENTER, 10, 70, 100, 20, WNDWin[0], (HMENU) 1, ((LPCREATESTRUCT) lParam)->hInstance, NULL); SendMessage(WNDButton[0], WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); //Gropubox erzeugen WNDGroupBox = CreateWindow("button", "testssss",WS_CHILD | WS_VISIBLE | ES_CENTER | BS_GROUPBOX, 10, 90, 400, 100, WNDWin[0], (HMENU) 5, ((LPCREATESTRUCT) lParam)->hInstance, NULL); //Button in der Groupbox WNDButton[1] = CreateWindow("button", "Abort",WS_CHILD | WS_VISIBLE | ES_CENTER, 10, 10, 100, 20, WNDGroupBox, (HMENU) 2, ((LPCREATESTRUCT) lParam)->hInstance, NULL); SendMessage(WNDButton[1], WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); return 0; case WM_COMMAND: switch (HIWORD(wParam))//Aktionsauswahl { case BN_CLICKED://Button gedrückt ? MessageBox(hwnd, "Gedrückt!", "" , 0); break; } return 0; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; } char szClassName[ ] = "WindowsApp"; int WINAPI WinMain(HINSTANCE tInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { MSG messages; WNDCLASSEX wincl; hInstance = tInstance; wincl.hInstance = hInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WindowProcedure; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof(WNDCLASSEX); wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION); wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wincl.hCursor = LoadCursor(NULL, IDC_ARROW); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH); if(!RegisterClassEx(&wincl)) return 0; WNDWin[0] = CreateWindowEx(0,szClassName, "Windows App1", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 544, 375, HWND_DESKTOP, NULL, hInstance, NULL); WNDWin[1] = CreateWindowEx(0,szClassName, "Windows App2", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, HWND_DESKTOP, NULL, hInstance, NULL); ShowWindow(WNDWin[0], nFunsterStil); ShowWindow(WNDWin[1], nFunsterStil); while(GetMessage(&messages, NULL, 0, 0)) { TranslateMessage(&messages); DispatchMessage(&messages); } return messages.wParam; }
BITTE HELFT MIR!
Gruss,
code_pilot
-
//Button in der Groupbox
WNDButton[1] = CreateWindow("button", "Abort",WS_CHILD | WS_VISIBLE | ES_CENTER, 10, 10, 100, 20, WNDGroupBox, (HMENU) 2, ((LPCREATESTRUCT) lParam)->hInstance, NULL);Das ist doch klar. Das Parent ist die Groupbox. Also kriegt auch die Groupbox die Message.
-
> Die Nachrichten werden an das Parent-Fenster gesendet. (WM_COMMAND)
Ja! Und genau das ist nicht der Fall!
Doch! Denn das Parent ist in diesem Falle die GroupBox. Du solltest die Postst, die zu deinen eigenen Problemen geschrieben werden, besser durchlesen!!!
-
Ahhh ja, ich meine der Button soll ja in der Groupbox gezeichnet werden!
Okay, nur meine Frage dazu war dann: Wie kann ich der Groupbox sagen, das sie als Verarbeitungsprozedur meine WndProc (WindowProcedure) benutzen soll??
Danke & GRuss,
code_pilot
-
Warum gibst du nicht als parent den dialog an? geht doch trotzdem noch das der button in der groupbox ist.
-
Hmm... vielleicht per SetWindowLongPtr(). Aber das wird nicht DER Weg sein. Du musst (hat man dir auch schon gesagt) SubClassing benutzen.
-
hä? mit SetWindowLongPtr wäre doch subclassing?
-
Öhhhh Leudde, äääähhh .... könntet ihr mir mal ein Sample geben??
:p
-
Öhh, hast recht. Naja, ich meinte, dass man dann keine neue WndProc macht, sondern einfach die WndProc des Hauptfensters benutzt. Wäre aber IMHO nicht so gut.
-
ach, der ist echt nicht mehr zu helfen. macht keinen spaß mehr hier. cu
-
Original erstellt von code_pilot:
Öhhhh Leudde, äääähhh .... könntet ihr mir mal ein Sample geben??:p
Nö. Schau dir die Doku zu SetWindowLongPtr() bzw. SetWindowLong() an und finde heraus, wie du deinem Control eine neue WindowProc verabreichst.
-
Original erstellt von WebFritzi:
Nö. Schau dir die Doku zu SetWindowLongPtr() bzw. SetWindowLong() an und finde heraus, wie du deinem Control eine neue WindowProc verabreichst.Na toll.
SetWindowLong(WNDGroupBox, GWL_WNDPROC, (LONG) WindowProcedure);
unter die CreateWindow für die groupbox gesetzt. Ergebnis: Groupbox verschwindet, Button funzt einwandfrei. Perfekt.
-
Erzeuge die Group-Box und den Button beidesmal auf dem Dialog. Und nicht Button auf Groupbox.
-
ARGHHHHHH ICH GEBS AUF ... SCHEISS MICROSOFT
-
Warum machst du Microsoft für dein Verhalten verantwortlich?