Problem mit Child-Fenster
-
Ich hab eien Fenster mit mehreren Groupboxen und Radiobuttons drinnen. Mein Problem ist nun das ich die Windows-Messages von den Radiobuttons nicht abfangen kann. Hier mal die Funktion welche für die Nachrichten zuständig ist:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HWND hParent; int iGroupID; char* lpszClassName; switch (message) { case WM_CREATE: iGroupID = -1; for (int count = 0; count < NUM_BUTTONS; count++) { if (iGroupID == -1 || Buttons[count].iStyle == BS_GROUPBOX) { iGroupID = count; hParent = hWnd; } else { hParent = Buttons[iGroupID].hOwn; } Buttons[count].hOwn = CreateWindow( "button", Buttons[count].szText, WS_CHILD | WS_VISIBLE | Buttons[count].iStyle, Buttons[count].iLeft, Buttons[count].iTop, Buttons[count].iWidth, Buttons[count].iHeight, hParent, NULL, ((LPCREATESTRUCT) lParam)->hInstance, NULL); } UpdateWindow(hWnd); return 0; case WM_COMMAND: iGroupID = 0; for (int count = 0; count < NUM_BUTTONS; count++) { if (lParam == (LPARAM)Buttons[count].hOwn && HIWORD(wParam) == BN_CLICKED) { if(Buttons[count].iStyle == BS_GROUPBOX) iGroupID = count; else if (Buttons[count].iStyle == BS_AUTORADIOBUTTON) Buttons[iGroupID].dwValue = Buttons[count].dwValue; else if (Buttons[count].iStyle == BS_PUSHBUTTON) Shutdown(hWnd); } } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, message, wParam, lParam); }Hat da von euch jemand eine Idee?
-
so wie das lese sind die radios auch childs von den groups. wie soll das gehen?
[edit]
sollten diese nicht childs von hwnd und das erste noch zusätzlich den style WS_GROUP besitzen. täusche ich mich gerade?
-
Wenn ich alle Radiobuttons Childs von HWND mache habe ich eine große Gruppe mit Radiobuttons, ich brauche aber mehrere kleine Gruppen. Ich poste mal das Array mit den "Buttons". Vieleicht wird dann einiges klarer.
typedef struct BUTTONGROUP { int iStyle ; char * szText ; HWND hOwn ; int iTop ; int iLeft ; int iWidth ; int iHeight; DWORD dwValue; }; BUTTONGROUP Buttons[] = { BS_PUSHBUTTON, "Ausführen", NULL, 410, 15, 190, 30, 0x00000000, BS_GROUPBOX, "SHTDN_REASON_MAJOR", NULL, 10, 10, 200, 150, 0x00000000, BS_AUTORADIOBUTTON, "_APPLICATION", NULL, 20, 10, 180, 15, 0x00040000, BS_AUTORADIOBUTTON, "_HARDWARE", NULL, 35, 10, 180, 15, 0x00010000, BS_AUTORADIOBUTTON, "_LEGACY_API", NULL, 50, 10, 180, 15, 0x00070000, BS_AUTORADIOBUTTON, "_OPERATINGSYSTEM", NULL, 65, 10, 180, 15, 0x00020000, BS_AUTORADIOBUTTON, "_OTHER", NULL, 80, 10, 180, 15, 0x00000000, BS_AUTORADIOBUTTON, "_POWER", NULL, 95, 10, 180, 15, 0x00060000, BS_AUTORADIOBUTTON, "_SOFTWARE", NULL, 110, 10, 180, 15, 0x00030000, BS_AUTORADIOBUTTON, "_SYSTEM", NULL, 125, 10, 180, 15, 0x00050000, BS_GROUPBOX, "SHTDN_REASON_MINOR", NULL, 10, 210, 230, 435, 0x00000000, BS_AUTORADIOBUTTON, "_BLUSCREEN", NULL, 20, 10, 210, 15, 0x0000000F, BS_AUTORADIOBUTTON, "_CORDUNPLUGGED", NULL, 35, 10, 210, 15, 0x0000000B, BS_AUTORADIOBUTTON, "_DISK", NULL, 50, 10, 210, 15, 0x00000007, BS_AUTORADIOBUTTON, "_ENVIROMENT", NULL, 65, 10, 210, 15, 0x0000000C, BS_AUTORADIOBUTTON, "_HARDWARE_DRIVER", NULL, 80, 10, 210, 15, 0x0000000D, BS_AUTORADIOBUTTON, "_HOTFIX", NULL, 95, 10, 210, 15, 0x00000011, BS_AUTORADIOBUTTON, "_HOTFIX_UNINSTALL", NULL, 110, 10, 210, 15, 0x00000017, BS_AUTORADIOBUTTON, "_HUNG", NULL, 125, 10, 210, 15, 0x00000005, BS_AUTORADIOBUTTON, "_INSTALLATION", NULL, 140, 10, 210, 15, 0x00000002, BS_AUTORADIOBUTTON, "_MAINTENANCE", NULL, 155, 10, 210, 15, 0x00000001, BS_AUTORADIOBUTTON, "_MMC", NULL, 170, 10, 210, 15, 0x00000019, BS_AUTORADIOBUTTON, "_NETWORK_CONNECTIVITY", NULL, 185, 10, 210, 15, 0x00000014, BS_AUTORADIOBUTTON, "_NETWORKCARD", NULL, 200, 10, 210, 15, 0x00000009, BS_AUTORADIOBUTTON, "_OTHER", NULL, 215, 10, 210, 15, 0x00000000, BS_AUTORADIOBUTTON, "_OTHERDRIVER ", NULL, 230, 10, 210, 15, 0x0000000E, BS_AUTORADIOBUTTON, "_POWER_SUPPLY", NULL, 245, 10, 210, 15, 0x0000000A, BS_AUTORADIOBUTTON, "_PROCESSOR", NULL, 260, 10, 210, 15, 0x00000008, BS_AUTORADIOBUTTON, "_RECONFIG", NULL, 275, 10, 210, 15, 0x00000004, BS_AUTORADIOBUTTON, "_SECURITY", NULL, 290, 10, 210, 15, 0x00000013, BS_AUTORADIOBUTTON, "_SECURITYFIX", NULL, 305, 10, 210, 15, 0x00000012, BS_AUTORADIOBUTTON, "_SECURITYFIX_UNINSTALL", NULL, 320, 10, 210, 15, 0x00000018, BS_AUTORADIOBUTTON, "_SERVICEPACK", NULL, 335, 10, 210, 15, 0x00000010, BS_AUTORADIOBUTTON, "_SERVICEPACK_UNINSTALL", NULL, 350, 10, 210, 15, 0x00000016, BS_AUTORADIOBUTTON, "_TERMSRV", NULL, 365, 10, 210, 15, 0x00000020, BS_AUTORADIOBUTTON, "_UNSTABLE", NULL, 380, 10, 210, 15, 0x00000006, BS_AUTORADIOBUTTON, "_UPGRADE", NULL, 395, 10, 210, 15, 0x00000003, BS_AUTORADIOBUTTON, "_WMI", NULL, 410, 10, 210, 15, 0x00000015, BS_GROUPBOX, "SHTDN_REASON_FLAG", NULL, 160, 10, 200, 75, 0x00000000, BS_AUTORADIOBUTTON, "_USER_DEFINED", NULL, 20, 10, 180, 15, 0x40000000, BS_AUTORADIOBUTTON, "_PLANNED", NULL, 35, 10, 180, 15, 0x80000000, BS_AUTORADIOBUTTON, "_NONE", NULL, 50, 10, 180, 15, 0x00000000, BS_GROUPBOX, "EWX", NULL, 235, 10, 200, 75, 0x00000000, BS_AUTORADIOBUTTON, "_FORCE", NULL, 20, 10, 180, 15, 0x00000004, BS_AUTORADIOBUTTON, "_FORCEIFHUNG", NULL, 35, 10, 180, 15, 0x00000010, BS_AUTORADIOBUTTON, "_NONE", NULL, 50, 10, 180, 15, 0x00000000, BS_GROUPBOX, "SHUTDOWN_TYPE", NULL, 310, 10, 200, 90, 0x00000000, BS_AUTORADIOBUTTON, "LOGOFF", NULL, 20, 10, 180, 15, 0x00000000, BS_AUTORADIOBUTTON, "REBOOT", NULL, 35, 10, 180, 15, 0x00000002, BS_AUTORADIOBUTTON, "SHUTDOWN", NULL, 50, 10, 180, 15, 0x00000001, BS_AUTORADIOBUTTON, "POWREOFF", NULL, 65, 10, 180, 15, 0x00000008, };
-
afaik muss jeder radiogruppenanfang WS_GROUP besitzen.
bsp:
BS_PUSHBUTTON, "Ausführen", NULL, 410, 15, 190, 30, 0x00000000, BS_GROUPBOX, "SHTDN_REASON_MAJOR", NULL, 10, 10, 200, 150, 0x00000000, BS_AUTORADIOBUTTON | WS_GROUP, "_APPLICATION", NULL, 20, 10, 180, 15, 0x00040000, BS_AUTORADIOBUTTON, "_HARDWARE", NULL, 35, 10, 180, 15, 0x00010000, BS_AUTORADIOBUTTON, "_LEGACY_API", NULL, 50, 10, 180, 15, 0x00070000, BS_AUTORADIOBUTTON, "_OPERATINGSYSTEM", NULL, 65, 10, 180, 15, 0x00020000, BS_AUTORADIOBUTTON, "_OTHER", NULL, 80, 10, 180, 15, 0x00000000, BS_AUTORADIOBUTTON, "_POWER", NULL, 95, 10, 180, 15, 0x00060000, BS_AUTORADIOBUTTON, "_SOFTWARE", NULL, 110, 10, 180, 15, 0x00030000, BS_AUTORADIOBUTTON, "_SYSTEM", NULL, 125, 10, 180, 15, 0x00050000, BS_GROUPBOX, "SHTDN_REASON_MINOR", NULL, 10, 210, 230, 435, 0x00000000, BS_AUTORADIOBUTTON | WS_GROUP, "_BLUSCREEN", NULL, 20, 10, 210, 15, 0x0000000F, BS_AUTORADIOBUTTON, "_CORDUNPLUGGED", NULL, 35, 10, 210, 15, 0x0000000B,
-
Ich habe jetzt jeden ersten Radiobutton in einer Gruppe das Flag WS_GROUP mit gegeben, mein Problem hat es aber nicht gelöst.
-
jetzt solltest du aber ganz normal nachrichten bekommen. welche nachrichten kommen den an?
ps:
else if (Buttons[count].iStyle == BS_AUTORADIOBUTTON) // iGroupID ist wenn du hier ankommst immer 0 Buttons[iGroupID].dwValue = Buttons[count].dwValue;andere frage warum vergibst du keine id? dann könttest du dir das iteretieren in wm_command sparen und alles über die id's ansprechen
case WM_COMMAND: switch(LOWORD(wParam)) { case ID_BTN1: break; case ID_RADIO1: case ID_RADIO2: case ID_RADIO3: break;
-
ps:
else if (Buttons[count].iStyle == BS_AUTORADIOBUTTON)
// iGroupID ist wenn du hier ankommst immer 0
Buttons[iGroupID].dwValue = Buttons[count].dwValue;iGroupID ist nicht immer 0 wenn ich im else-Zweig ankomme sondern hat immer die ID der letzten Groupbox im Array, wenn ich jetzt noch ID's einführe so wie du das meinst wird der code recht unhandlich. Jetzt brauche ich nur das Array verändern und fertig.
welche nachrichten kommen den an?
Ich habe im case-Abschnitt für WM_COMMAND mal eine Mesage-Box eingebaut, wenn ich aber meine Radiobuttons drücke kommt keine MessageBox nur, wenn ich den defaultknopf drücke bekomme ich eine MessageBox, dieser Knopf liegt aber auch direkt auf dem Hauptfenster.
Welche Messages könnte ich den noch versuchen?
-
habe es gerade mal selber probiert, da ich gestern kein windows in der nähe hatte.
bei mir kommt die msg an.if(HIWORD(wParam) == BN_CLICKED) MessageBox(hwnd, "click", "click", MB_OK);zeige doch mal deinen geänderten erstellungscode.
-
Im Moment habe ich kein Möglichkeit den geänderten Code zu posten, erst heute Abend.
Ich habe die Messagebox folgendermassen platziert:case WM_COMMAND: Messagbox ... iGroupID = 0;Sind deine Buttons Child vom Hauptfenster oder von den Groupboxen?
-
DarkMight1 schrieb:
Sind deine Buttons Child vom Hauptfenster oder von den Groupboxen?
vom hauptfenster
-
Dann klappt es bei mir auch allerdings habe ich dann den Nachteil das ich Groupboxen und Radiobuttons wieder getrennt habe, und z.b. nicht zusammen verschieben kann.
Es kann ja nicht im Sinne des Erfinders sein, das ich zwar Buttons innerhalb von Groupboxen organisieren kann, dann aber keine Möglichkeit habe diese Buttons auszuwerten.