Rechtsklick popup menü funktioniert nicht



  • huhu, ich wollte ein rechtsklick popup menü erstellen, ich denke, dass kennt jeder. Wenn nicht klickt einfach mal mit der rechten maustaste auf den desktop und ihr sehts 😛

    Hier mein code:

    case WM_RBUTTONDOWN:
    		 POINTSTOPOINT (point, lParam);
    		 if(point.x<0 || point.y<0 || point.x>(cxFieldCount*iFieldSize) || point.y>(cyFieldCount*iFieldSize) || selectmode || !FileLoaded)
    			 break;
    		 x = (int)(point.x / iFieldSize);
    		 y = (int)(point.y / iFieldSize);
    		 fieldID = (y*cxFieldCount+x);
    		 if(sfFieldState[fieldID].objectID==0)
    			 break;
    //Bis hier funkt alles (mit debugger halte punkten getestet)
    		 context_field = fieldID;
    		 hMenu = CreatePopupMenu();
    		 InsertMenu (hMenu, 500, MF_BYPOSITION, 500, "Objekt löschen");
    		 switch((int) TrackPopupMenu (hMenu, TPM_CENTERALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD, point.x, point.y, 0, hwnd, 0))
    		 {
    		 case 500:
    			 sbTemp = sbBrushes.GetBrush(sfFieldState[fieldID].objectID);
    			 for(i=0;i<sbTemp.arraylenght;i++)
    			 {
    				 sfFieldState[sbTemp.ID].objectID=0;
    			 }
    		 }
    		 DestroyMenu(hMenu);
    		 break;
    

    Mein problem ist jetzt, dass ich keine popup menü sehe 😛
    Hoffe mir kein jemand helfen.

    mfg tobZel



  • ich würde es so machen:
    (kanns aber nicht testen, da ich nicht zu hause bin...)

    switch((int) hMenu.TrackPopupMenu(TPM_CENTERALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD, point.x, point.y, 0, hwnd, 0)) 
    {
    


  • Guck mal in der Doku nach, was TrackPopupMenu () zurückliefert.
    🙂



  • bool != 500 😃

    und kennst du WM_CONTEXTMENU ??



  • wie fängt man sonst die menü auswahl ab? Die auf Winapi.net habens genauso gemacht.

    Das ding liefert ja im prinzip ein int zurück, kein bool
    -> BOOL das ist nur ein anderes wort für int.
    Trotzdem erscheint mir das unsauber.

    Ich kenn WM_CONTEXTMENU, aber die wird bei mir nie ausgelöst oO, deshalb bin ich auf WM_RBUTTONDOWN ausgewichen.

    Wobei wir wieder bei der anfangsfrage wären:
    Warum seh ich kein popupmenü?



  • Jo die Richtung mag schon richtig sein, mit TPM_RETURNCMD liefert es die ID des Item, aber prüf doch einfach mal den Rügabewert.
    Ja ja ja, ich weiß, du siehst kein Menu, dann klick woanders und du kriegst die 0 ^^

    Mach mal nen Test, tausche deine point.x/.y gegen 200,200 oder so, und guck dann mal ob du nen Menu siehst



  • @tobZel
    Wie wäre es, wenn du außerdem mal die Rückgabe der Funktion

    InsertMenu(hMenu, 500, MF_BYPOSITION, 500, "Objekt löschen");
    

    überprüfst?
    Das sollte meines Erachtens schon fehlschlagen. Du erstellst ein PopupMenu und fügst diesem an Position 500 ein Item hinzu - wo sind die restlichen schon vorhandenen Items?
    Desweiteren ist es auch besser nachzuvollziehen, wenn du 'anständige' ID's vergibst und nicht nur einen Wert (500) einsetzt.

    Beispiel:

    #define IDM_DELETEOBJECT  500
    

    und in der Funktion dann

    InsertMenu(hMenu, -1, MF_BYPOSITION | MF_STRING, IDM_DELETEOBJECT, "Objekt löschen");
    


  • @AnalogBit
    Ich weis, ich hatte bloß kein bock dazu :P. Ich hab mir gedacht die InsertMenus und das auswerten sind nur paar zeilen außeinander, da ist das ganze noch überschaubar.
    Nach deinem tollen tipp seh ich jetzt ein popup menü woohoo!
    Leider etwas versetzt, aber ich denke, dass bekomm ich noch hin oO.

    /edit auch gelöst, das waren screen und keine client koordinaten umrechenen wirkt wunder.

    THX an alle die geantwortet habt

    mfg tobZel



  • nö, kann ruich die 500. position sein, ist eben nur zur Sortierung, er hatte schlicht weg nur falsche Koordinaten, daher sagte ich ja er solle mal mit 200,200 versuchen 😉



  • tobZel schrieb:

    wie fängt man sonst die menü auswahl ab?

    Via WM_COMMAND 😉 .


Anmelden zum Antworten