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; }