SetMenu nur direkt unter "CALLBACK WndProc - WM_CREATE" möglich?
-
Hallo zusammen,
Gibt es einen Grund, warum das Erzeugen eines Menüs nicht funktioniert, wenn ich unter case WM_CREATE nicht direkt die entsprechenden Funktionen aufrufe, sondern eine Hilfsfunktion aufrufe, die diese Funktionen enthält?Zum besseren Verständnis - folgendermaßen funktioniert es wunderbar:
(innerhalb von LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)case WM_CREATE: HMENU hMenu, hSubMenu; hMenu = CreateMenu(); hSubMenu = CreatePopupMenu(); AppendMenu(hSubMenu, MF_STRING, ID_FILE_OPEN, "&Open"); AppendMenu(hSubMenu, MF_STRING, ID_FILE_EXIT, "E&xit"); AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&File"); hSubMenu = CreatePopupMenu(); AppendMenu(hSubMenu, MF_STRING, ID_AUDIO_PLAY, "Playback devices"); AppendMenu(hSubMenu, MF_STRING, ID_AUDIO_REC, "Capture devices"); AppendMenu(hSubMenu, MF_STRING, ID_AUDIO_SET, "Set up devices"); AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "Audio"); SetMenu(hwnd, hMenu);
Aber folgendes erzeugt kein Menü, wobei void cMenu(){} dann die oben aufgeführten Definitionen und Befehle enthält. Der Zugriff auf hwnd ist auch möglich und die ID_s sind als #define gesetzt.
case WM_CREATE: cMenu();
-
elscorcho schrieb:
Der Zugriff auf hwnd ist auch möglich ...
Anscheinend wohl nicht.
Ich rate einfach einmal: Das Fensterhandle setzt Du global nach dem Aufruf von CreateWindow(Ex). Die WM_CREATE bekommt Deine Fensterprozedur aber während des Aufrufs von CreateWindow bevor die Funktion zurückkehrt.Gruß
-
Ja, du hattest vollkommen Recht. Das habe ich nicht bedacht - dankesehr!
Was ist denn eigentlich der eleganteste Weg, mit der Codeplatzierung in solchen Fällen umzugehen? Packt man solche Dinge direkt in die Fensterprozedur und nimmt in Kauf, dass sie riesig groß wird?
Oder gliedert man es aus und ruft dann Hilfsfunktionen - wie cMenu() - nach CreateWindow auf?
-
elscorcho schrieb:
Was ist denn eigentlich der eleganteste Weg, mit der Codeplatzierung in solchen Fällen umzugehen?
Gib der Funktion cMenu das hwnd mit ... und was sie sonst noch benötigt, was nicht anderweitig zur Verfügung steht.