HMENU Beschriftung nachträglich ändern

Thomasio

Erfahrenes Mitglied
Ich habe da ein Fenster mit einem Menü, nichts besonderes, einfach im case WM_CREATE

Code:
INITCOMMONCONTROLSEX iccx;
iccx.dwSize=sizeof(INITCOMMONCONTROLSEX);
iccx.dwICC=ICC_BAR_CLASSES;
InitCommonControlsEx(&iccx);

HMENU hMenu = CreateMenu();
HMENU hSubMenu = CreatePopupMenu();
AppendMenu(hSubMenu, MF_STRING, ID_M1, "Button 1");
AppendMenu(hSubMenu, MF_STRING, ID_M2, "Button 2");
AppendMenu(hSubMenu, MF_STRING, ID_M3, "Button 3");
AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "Titel 1");

// usw.

Nun möchte ich gerne nachträglich die Beschriftung der Titel und Buttons ändern.
Ich brauche also ein Handle auf das Menu bzw. dessen einzelne Einträge und die Syntax, wie man die Strings setzt.
Ich finde zwar jede Menge Anleitungen im Web, wie man so etwas erstellt, aber nichts, wie man es nachträglich ändern kann, oder bin ich nur blind?
 
Na, die beiden Artikel kannte ich sogar schon, nur werde ich daraus nicht schlau, weil

1) The ModifyMenu function has been superseded by the SetMenuItemInfo function
also doch lieber die andere verwenden.

2) MENUITEMINFO macht diverse Unterschiede, je nach OS, wobei ich schon bei fmask nicht durchblicke, welcher Eintrag die Beschriftung sein soll.
MIIM_STRING kling ja vielversprechend, hat aber eine Anmerkung, dass das nur für Win98,ME,2000 und XP gilt, ich brauch das aber für XP und Vista.
MFT_STRING vielleicht? Da steht dann unter ftype, Windows 98/Me, Windows 2000/XP: MFT_STRING is replaced by MIIM_STRING.

Oder um es kurz zu sagen, ich bringe die Syntax dazu nicht auf die Reihe.
Ich habe an anderer Stelle mal ein Stückchen Code geschrieben, um mit Hilfe von MENUITEMINFO die checkmarks zu setzen, das funktioniert sogar, aber selbst mit dem Code als Anhaltspunkt bringe ich es nicht hin.
 
Hallo,

ja, du solltest mit SetMenuItemInfo arbeiten.
Bei MENUITEMINFO und "fmask" musst du schon MIIM_STRING verwenden. Dass Vista nicht aufgeführt wird, liegt vermutlich an der fehlenden Aktualisierung der Beschreibung.
Der Member "ftype" ist uninteressant, da du ja bei "fmask schon festlegst, dass du nur "dwTypeData" ändern willst.
Wenn's nicht funktioniert, zeig mal deinen Aufruf von SetMenuItemInfo und die Befüllung der MENUITEMINFO-Struktur.

Gruß
MCoder
 
Erstmal ganz vielen Dank, ich habe es zumindest so weit, dass ich den Text ändern kann.
Nun noch ein paar kleine Zusatzfragen:

Das Ganze ist UNICODE, mii.dwTypeData erwartet also WCHAR*
Der string den ich brauche ist aber im Format std::wstring
Kann ich da einfach

mii.dwTypeData = (WCHAR*)MyString.c_str();

machen?

Kann man den leeren Platz vor einem Button (wo die Checkbox hin kommt) entfernen wenn man sie nicht braucht, so dass nur der Text da steht?

Enable und disable kann ich ja mit den Buttons, aber kann man nachträglich auch das ganze Menü bearbeiten, also Titel und Buttons hinzufügen und entfernen?
 
Nja wenn du sichergehen kannst das an dem Speicher nichts verändert wird ;) (du castest da einen const wchar_t* in einen wchar_t*, ist riskant ;) ).
 

Neue Beiträge

Zurück