Dynamisches Menu

Hunter

Erfahrenes Mitglied
Hallo,

Ich habe derzeit ein Dynamisches Menu, Dh. wenn zB. das Item A mit dem Item B übereinstimmt, wird das dem Menu hinzugefügt, andernfalls nicht. Nun, da ich keine Lust habe, jedem Item eine seperate ID zuzuweisen, wollte ich mal fragen, ob es möglich wäre, den Text des ausgewählten Items zu bekommen.

Code:
for(int i = 0; i < MAX_OTHERC_ITEMS; i++) {
     InsertMenu(hMenuPopup, NULL, MF_BYCOMMAND | MF_STRING, IDPM_OTHERCRAFTINGS, otherCraftingsVanilla[stringPosition][i]);
}


Ich versuche hiermit den Text zu bekommen, allerdings, bekomme ich immer nur den Text des ersten Items in des Menus:
Code:
case WM_COMMAND:
	switch(LOWORD(wParam)) {
		case IDPM_OTHERCRAFTINGS:
			char gotString[40];
			GetMenuString(hMenuPopup, IDPM_OTHERCRAFTINGS, gotString, 40, MF_BYCOMMAND);
			MessageBox(hWndImage, gotString, NULL, NULL);
               break;
	}
	break;

EDIT: Könnte ein Mod den Thread-Titel in Dynamisches Menu umbenennen? :)
 
Zuletzt bearbeitet:
Nunja, du gibst bei InsertMenu für alle Items die gleiche ID an (IDPM_OTHERCRAFTINGS), insofern bekommst du dann halt das erste passende zurück.

Wenn du unbedingt MF_BYCOMMAND benutzen willst, müssen die IDs unterschiedlich sein. Sonst kannst du auch MF_BYPOSITION benutzen.
 
Momentan benutze ich ja GetMenuString() um an den String zu kommen. Aber wie bekomme ich denn den String, wenn ich jetzt bei InsertMenu() MF_BYPOSITION benutze? :)
 
Hallo Hunter

Wie Endurion sagte ist das Problem, dass du allen Menuitems die ID IDPM_OTHERCRAFTINGS gibst. Entsprechend wird GetMenuString für diese ID immer einfach den Inhalt des ersten Menueintrags zurückgeben. Du müsstest bei InsertMenu immer eine andere ID verwenden, damit dein Code funktioniert.

Wenn du MF_BYPOSITION verwendest hat das den Einfluss auf GetMenuString der beschrieben ist:
Indicates that uIDItem gives the zero-based relative position of the menu item.

Viele Grüsse
Cromon
 
Aber gibt es denn keine Möglichkeit, die Position oder den Text des ausgewählten Items zu bekommen? Denn wenn ich jedem Item eine andere ID zuweise, aber dann nicht weiß welches das ausgewählt wurde, bringt mir das auch nichts.
 
Aber gibt es denn keine Möglichkeit, die Position oder den Text des ausgewählten Items zu bekommen? Denn wenn ich jedem Item eine andere ID zuweise, aber dann nicht weiß welches das ausgewählt wurde, bringt mir das auch nichts.

Doch, es bringt dir was, wenn du speicherst welches Menuitem welche ID hat.

Viele Grüsse
Cromon
 
@ComFreek
Das ist aber für eine Combobox. :)

Oh, tut mir leid, hatte zu unaufmerksam gelesen.
Dafür biete ich dir jetzt eine eigentliche Lösung für dein Problem ;)

Cromon hat bereits GetMenuString() erwähnt. Man kann diese Funktion nutzen, um den Menütitel an einer bestimmten Position herauszufinden (Flag MF_BYPOSITION).
Allerdings erfährst du nicht die Position des geklickten Menüeintrags mittels des WM_COMMAND-Events.
Allerdings kann man das MenuInfo-Object des Hauptmenüs ändern, sodass statt WM_COMMAND ein WM_MENUCOMMAND-Event gesendet wird (vgl. auch diese StackOverflow-Frage).

Beispielcode:
C++:
void CreateMainMenu(HWND hWnd)
{
	HMENU hMenu = CreateMenu();

	HMENU firstMenu = CreatePopupMenu();
	AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)firstMenu, TEXT("&First Menu"));
	AppendMenu(firstMenu, MF_STRING, IDPM_OTHERCRAFTINGS, TEXT("FIRST OPTION"));
	AppendMenu(firstMenu, MF_STRING, IDPM_OTHERCRAFTINGS, TEXT("SECOND OPTION"));

    // Quelle: siehe den Link zur StackOverflow-Frage oben
	MENUINFO mi;
	memset(&mi, 0, sizeof(mi));
	mi.cbSize = sizeof(mi);
	mi.fMask = MIM_STYLE;
	mi.dwStyle = MNS_NOTIFYBYPOS;
	SetMenuInfo(hMenu, &mi);

	SetMenu(hWnd, hMenu);
}

Nun kannst du das WM_MENUCOMMAND-Event abfangen:
C++:
case WM_MENUCOMMAND:
	/*  wParam
		  The zero - based index of the item selected.
		lParam
		  A handle to the menu for the item selected.
	*/


	TCHAR menuTitle[100];
	GetMenuString((HMENU)lParam, (UINT)wParam, menuTitle, 100, MF_BYPOSITION);
	MessageBox(hWnd, menuTitle, TEXT("Clicked menu option"), 0);

	break;
 

Neue Beiträge

Zurück