CreatePopupMenu
-
TPM_RETURNCMD weglassen und via WM_COMMAND feststellen, was gewählt wurde

-
hi,
danke das geht!!
nur ein problem hab ich noch:
... case WM_COMMAND: if ( LOWORD( wParam ) == 3) //3 ist mein menüitem { //mach irgendwas } ... ... case WM_RBUTTONUP: // rechte Maustaste SetForegroundWindow(hwnd); GetCursorPos(&pt); TrackPopupMenu(hMenu, TPM_RIGHTBUTTON , pt.x, pt.y, 0, hwnd, NULL); PostMessage(hwnd, WM_NULL, 0, 0); ....wenn ich nun rechtklick mache wird dies erkannt "//mach irgendwas" wird ausgeführt, programm läuft weiter, nur blöderweise wird "//mach irgendwas" immer wieder ausgeführt (ununterbrochen ohne erneuerte aktivierung durch menüauswahl) ??

was könnte mein fehler sein? steh ich auf dem schlauch?
-
zu "case" hast du auch überall nen "break" oder ?
Prüf mal noch lParam und HIWORD(wParam) - vielleicht kommen die gar nicht vom Menü...
-
hi, ich poste mal einen gekürzten code auschnitte (ich hoffe ich hab nicht zu viel gekürzt
)switch (message) { case WM_COMMAND: if ( LOWORD( wParam ) == 3) //bei auswahl des menüitem 3 { //mach was } break; case WM_CREATE: hMenu = CreatePopupMenu (); // Menu anlegen InsertMenu (hMenu, 0, MF_BYPOSITION, 0, "bla"); InsertMenu (hMenu, 1, MF_BYPOSITION, 1, "bla"); InsertMenu (hMenu, 2, MF_SEPARATOR, 0, NULL); // Separator InsertMenu (hMenu, 3, MF_BYPOSITION, 3, "bla"); break ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; EndPaint (hwnd, &ps) ; break ; //Nachricht bei klick auf das Icon in der Taskbar case WM_ICONCLICK: switch(lParam) { case WM_LBUTTONUP: // linke Maustaste //..bla break; case WM_RBUTTONUP: // rechte Maustaste SetForegroundWindow(hwnd); GetCursorPos(&pt); TrackPopupMenu(hMenu, TPM_RIGHTBUTTON , pt.x, pt.y, 0, hwnd, NULL); PostMessage(hwnd, WM_NULL, 0, 0); break; } return 0; case WM_DESTROY: // Icon entfernen DestroyMenu (hMenu); Icon_in_Taskleiste (hwnd, FALSE); // Icon aus der Taskleiste entfernen DestroyIcon (hIcon); // Speicher freigeben PostQuitMessage (0) ; return 0 ; default: // Taskleiste neu gestartet: if (message == s_uTaskbarRestart) Icon_in_Taskleiste (hwnd, TRUE); // Icon in die Taskleiste setzen break; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
-
die message wird irgendwie nicht gelöscht? das eie message von wo anders her kommt kann ich mir nicht vorstellen, sonst würde dies doch nicht nur als folge eines ersten rechtsklick passieren.

-
Du solltest vielleicht auch den HIWORD noch auswerten, denn es gibt sicher einige Nachrichten mit LOWORD von 3

-
sorry, aber ich find leider nirgends was HIWORD (wParam) zurückgeben soll?, ich dachte zuerst halt das handle vom menü if (HIWORD (wParam) == hMenu)... aber das ist total falsch...

-
Sorry, sehe gerade, dass das im MSDN-Example auch nicht gemacht wird - ansonsten:
The high-order word specifies the notification code if the message is from a control. [..] If the message is from a menu, this value is zero.
Der Fehler steckt also wo anders. Kann es vielleicht sein, dass du bei einem darüberliegenden case das break vergessen hast, oder was ändert sich durch den Mausklick (denn davor bekommst du ja nicht dauernd diese Nachricht)
-
ich werd mir morgen den code nochmal gründlich vornehmen, aber mal eine kurze zwischenfrage:
wie bekomme ich das handle vom menü?
mit LOWORD( wParam ) bekomme das ausgewählte menüitem, aber wie finde ich heraus von welchem menü diese kommt. (also in meinem beispiel hMenu) ?
-
so, ich hab jetzt mal rumprobiert
wenn ich
[cpp] case WM_COMMAND:
if ( LOWORD( wParam ) == 3) //bei auswahl des menüitem 3
{
//mach was
PostMessage(hwnd, WM_NULL, 0, 0);//neu
}
break; [/cpp]das postmessage da rein nehme tritt der fehler nicht mehr auf? ist das nun korrekt oder ist das nun gewissermassen "zufall" das es dadurch jetzt geht?
und weiß nun vielleicht jemand wie ich an das handle vom menü komme?
also wenn ich jetzt mehrer menüs habehMenu1 = CreatePopupMenu ();
InsertMenu (hMenu1, 0, MF_BYPOSITION, 1, "text1");hMenu2 = CreatePopupMenu ();
InsertMenu (hMenu2, 0, MF_BYPOSITION, 1, "text2");dann bekomme ich ja mit LOWORD( wParam ) == 1 für beide menüs eine übereinstimmung?
cu
-
LOWORD( wParam ) sollte eigentlich für beide 0 sein, denn da wird die ID übergeben - das wass du bei InsertMenu als zweites angegeben hast. Dafür definiert man sich für gewöhnlich Konstanten.