Menüresource zur LZ an eine existierendes Menü anhängen



  • hi

    gibt es eine Möglichkeit,
    ein als Resource existierendes Menü (per LoadMenu)
    an das Windowsystemmenü anzuhängen?
    Wie man das Systemmenü bearbeitet weiß ich schon.

    Und das alles mit reiner WINAPI.

    das würde mir es ersparen, extra eine StringTable für das Menü verwalten zu müssen, damit es auch in anderen Sprachen dargestellt werden kann.
    StringTable kann ich hierfür auf keinen Fall verwenden!

    THX



  • Wenn du einen neuen Eintrag mir dem entsprechenden Menü als Popup anhängst sollte das einfach gehen - sonst müsstest du wohl die Items einzeln anhängen (bind mir da aber nicht ganz sicher) 🤡



  • Das funktioniert ganz wunderbar mit SetMenuItemInfo. Das hSubMenu-Mitglied des MENUITEMINFO structs sollte dein Augenmerk bekommen:

    Zitat aus der MSDN:

    hSubMenu
    Handle to the drop-down menu or submenu associated with the menu item. If the menu item is not an item that opens a drop-down menu or submenu, this member is NULL.



  • Achja, vorher würde ich empfehlen ein MenuItem an das Systemmenü anzuhängen, das dann dein Menü aus den Ressourcen öffnet.



  • das hab ich auch gesehn

    allerdings ist das ein submenu
    und ich wollte das resourcemenü direkt an das sysmenü hängen.

    oder geht das auch mit dem?



  • Ich nehme an, dass du dann die einzelnen Einträge durchgehen und getrenn anhängen musst 🕶



  • na gut wenns nicht anders geht
    dann könnte ich mir ne funktion schreiben
    die das allgemein machen kann.

    kann mir einer tipps geben, wie man dynamisch durch ein menü iteriert,
    und die menüitems anfügt (ok appendmenu)



  • Du könntest mit GetMenuItemCount die Anzahl der Einträge auslesen und dann in einer Schleife den Eintrag mit GetMenuItemInfo auslesen und mit InsertMenuItem anhängen - sollte eigentlich recht einfach gehen 😉



  • Voila, wen's interessiert :

    //ApppendMenu fuegt ein existierendes Menue an
    //ein anderes Menu an.
    bool AppendMenu(HMENU hDestMenu, HMENU hSourceMenu)
    {
        //Anzahl der Menueeintraege des Quellmenues
        int Source_Count = GetMenuItemCount(hSourceMenu);
    
        //Aktuelle Anzahl der Eintraege im Zielmenue
        int Dest_Count = GetMenuItemCount(hDestMenu);
    
        if ((Source_Count == 0) || (hDestMenu == 0) || (hSourceMenu == 0))
            return FALSE;
    
        for (int i = 0; i < Source_Count;i++)
        {
            MENUITEMINFO info;
            info.cbSize = sizeof(MENUITEMINFO);
    
            info.fMask = MIIM_SUBMENU | MIIM_STRING | MIIM_CHECKMARKS | MIIM_DATA | MIIM_FTYPE | MIIM_ID | MIIM_STATE;
            //Stringbehaelter muss NULL sein, um die Stringlaenge zu erhalten
            info.dwTypeData = NULL;
            //ermittelt Menueeintragsinfos
            //muss zuerst aufgerufen werden, um die Laenge des
            //Menutextes zu ermitteln. Steht in cch
            GetMenuItemInfo(hSourceMenu,i, TRUE, &info);
    
            //wenn es kein Seperator ist, muss der Text ermittelt werden
            if ((info.fType != MFT_SEPARATOR))
            {
                //die Laenge des Strings muss erhoeht werden
                info.cch++;
                //Speicher fuer den String anlegen
                info.dwTypeData = new char[info.cch];
                memset(info.dwTypeData,0,info.cch);
    
                //String und weitere Menuedaten ermitteln
                GetMenuItemInfo(hSourceMenu,i, TRUE, &info);
            }   
            //Menueitem unterhalb des letzten Eintrags einfuegen
            InsertMenuItem(hDestMenu,Dest_Count + 1,TRUE,&info);
    
            //Speicher loeschen
            if (info.dwTypeData != NULL)
            {
                delete[] info.dwTypeData;
            }
    
            //Anzahl neu bestimmen
            Dest_Count = GetMenuItemCount(hDestMenu);
        }
        return true;
    }
    

Log in to reply