An String von Menu Item kommen?



  • Ich würde als erstes mal probieren das direkt nach InsertMenu zum Laufen zu bekommen. Mit dem korrekten Handle. Und mich dann von dort aus weiterhanteln.



  • @Th69 ja hab geprüfte auf ODT_MENU und der Handle ist auch der selbe.



  • @Mike85Dev sagte in An String von Menu Item kommen?:

    InsertMenu (hMenu, 1, MF_STRING | MF_BYPOSITION | MF_OWNERDRAW, 888, L"Test Eintrag");

    Das Ding gibt nen BOOL zurück. Könnte leicht sein dass da 0 zurückkommt.

    Versuch's mal mit 0 bzw. -1 für uPosition.
    Ansonsten: GetLastError nach dem Aufruf prüfen.



  • Sieh Dir einmal die Parameterbeschreibung für lpNewItem aus der Funktion InsertMenu an und was MF_OWNERDRAW dort bewirkt.
    Das OWNERDRAW-Flag erst nach dem Aufruf von InsertMenu setzen, dann klappt es auch. ;o)
    Oder besser gleich InsertMenuItem benutzen.



  • Beim Aufruf von InsertMenu macht es keinen Sinn, sowohl `MF_STRING' als auch 'MF_OWNERDRAW' anzugeben.

    InsertMenu (hMenu, 1, MF_BYPOSITION | MF_OWNERDRAW, 888, L"Test Eintrag");
    

    Und dann braucht auch bei WM_DRAWITEM nicht extra GetMenuString aufgerufen werden, denn in Item->itemData steht dann der Zeiger auf den übergebenen Text drin.

    s.a. Creating Owner-Drawn Menu Items

    Ergo: Wichtig, wenn etwas nicht funktioniert: Doku lesen und vernünftig debuggen. 😉

    PS: Erzeugst du denn (laut deinem Code) einfach ein neues Popup-Menu mit diesem einem Eintrag?! Warum verwendest du dann nicht AppendMenu?



  • @Th69 sagte in An String von Menu Item kommen?:

    Beim Aufruf von InsertMenu macht es keinen Sinn, sowohl `MF_STRING' als auch 'MF_OWNERDRAW' anzugeben.

    MF_STRINGist eh nur symbolische Kosmetik, weil Wert gleich 0.

    Und dann braucht auch bei WM_DRAWITEM nicht extra GetMenuString aufgerufen werden (auch wenn immer noch nicht geklärt ist, warum es nicht funktioniert?!), denn in Item->itemData steht dann der Zeiger auf den übergebenen Text drin).

    Weil GetMenuString keinen Zeiger auf eine Zeichenkette findet, denn (wie Du richtig erkannt hast) der OP hat den Zeiger mit seinem Aufruf von InsertMenu plus ´MF_OWNERDRAW´ in dwItemData abgelegt und nicht in dwTypeData.
    MENUITEMINFOW structure

    Die alten Menüfunktionen sind nur noch Wrapper der neuen Menüfunktionen wie InsertMenuItem oder Get-/SetMenuItemInfo.
    (Edit: Dies ist nur eine Annahme meinerseits)

    Daher mein Rat besser gleich InserMenuItem zu benutzen.

    LG
    Greenhorn



  • Ja, ist ja (jetzt) auch logisch, daß dann kein String-Text ausgelesen werden kann, da ja nicht zwangsläufig ein String bei MF_OWNERDRAW übergeben werden muß, sondern es kann ja auch eine beliebige Datenstruktur o.ä. sein.



  • Doch das geht. Hab gemerkt das der String sich in Item->itemData versteckt hat. Ich musste nicht mal was beim Menü erstellen ändern. Danke für eure Hilfe ☺



  • @Mike85Dev sagte in An String von Menu Item kommen?:

    Doch das geht. Hab gemerkt das der String sich in Item->itemData versteckt hat. Ich musste nicht mal was beim Menü erstellen ändern. Danke für eure Hilfe ☺

    Das geht nur, so lange garantiert ist dass der Speicherbereich in dem der String steht nicht freigegeben wird so lange das Menu existiert.
    Probier das selbe mal mit

    std::wstring text = L"Test Eintrag";
    InsertMenu (hMenu, 0, MF_STRING | MF_BYPOSITION | MF_OWNERDRAW, 888, text.c_str());
    

    dann siehst du was ich meine.



  • Und ich meinte bei
    @Th69 sagte in An String von Menu Item kommen?:

    Ja, ist ja (jetzt) auch logisch, daß dann kein String-Text ausgelesen werden kann, da ja nicht zwangsläufig ein String bei MF_OWNERDRAW übergeben werden muß, sondern es kann ja auch eine beliebige Datenstruktur o.ä. sein.

    explizit das Auslesen mittels der GetMenuString-Funktion.


Log in to reply