LoadMenu mit String
-
Hi,
bei LoadMenu steht:lpMenuName
[in] Pointer to a null-terminated string that contains the name of the menu resource. Alternatively, this parameter can consist of the resource identifier in the low-order word and zero in the high-order word. To create this value, use the MAKEINTRESOURCE macro.Das mit MAKEINTRESOURCE und dem resource identifier bekomme ich hin.
Aber wie kriegt man das hin, was im ersten Satz steht? Wo steht denn der Name des Menüs (name of the menu resource)?
-
ja welchen namen denn
brauchst doch keinenoder ?
wenn das menu mit dem resourcenedit gemacht iss dann:
CMenu* pMenu = new CMenu(); pMenu->LoadMenu(IDR_MAINFRAME); SetMenu(pMenu);
ansonsten ein neues zur laufzeit erstellen:
CMenu NewMenu; NewMenu.CreateMenu(); NewMenu.InsertMenu(-1, MF_BYPOSITION|MF_STRING, ID, "Eintrag"); SetMenu(NewMenu);
gruß!
-
Du kannst zum einen anstelle von MAKEINTRESOURCE die ID mit (LPCTSTR) in einen String casten, oder du setzte die ID bei ID einen Namen in "" ein, dann schreibst du nachher einfach direkt den Namen hin (auch in "" natürlich)
-
Also ich wills nochmal erklären.
#define IDR_MENU1 101 // Möglichkeit 1 LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1)); // funktioniert // Möglichkeit 2 LoadMenu(hInstance, (LPCTSTR) IDR_MENU1); // funktioniert // Möglichkeit 3 LoadMenu(hInstance, "....."); // was muss ich hier statt den ..... eintragen, damit es funktioniert?
oder du setzte die ID bei ID einen Namen in "" ein, dann schreibst du nachher einfach direkt den Namen hin (auch in "" natürlich)
Das verstehe ich leider nicht.
-
#define IDR_MENU1 101 // Möglichkeit 3 LoadMenu(hInstance, TEXT("#101"));
Im Grunde ist das aber Blödsinn. Das brauchst Du normalerweise nur, wenn Du dem Menü eben nicht mit einem Integer-Identifier in den Ressourcen speicherst, sondern mit seinem Namen.
-
Ahh :), danke King.
Also das haut schonmal hin.
Ich habe mich nach dem Sinn gefragt, warum LoadMenu (und andere derartige Resource-Ladefunktionen) einen String entgegennehmen und nicht direkt die ID.
Also warum die Funktion nicht so aussieht:
LoadMenu(HINSTANCE, UINT);
Wie vergibt man denn seinem Menü (mit dem Ressourceneditor von Visual Studio) einen Namen, statt einer ID?
Ach und ist das mit dem # vor der ID (wie du es gezeigt hast) irgendwo in der MSDN dokumentiert?
-
Konnte doch flenders Beschreibung nach einiger Zeit nachvollziehen.
-
toxic schrieb:
CMenu* pMenu = new CMenu(); pMenu->LoadMenu(IDR_MAINFRAME); SetMenu(pMenu);
des is aber mfc.... => falsches forum *gg
-
vs schrieb:
Wie vergibt man denn seinem Menü (mit dem Ressourceneditor von Visual Studio) einen Namen, statt einer ID?
Du mußt dafür sorgen, daß es kein define gibt. Wenn also IDR_MENU1 nirgendwo definiert ist, wird es als String angenommen. Dann mußt Du tatsächlich "IDR_MENU1" beim Laden schreiben. Wie das mit dem Editor geht, weiß ich auch nicht. Per händischer Nacharbeit bist Du schnell am Ziel.
Das ist aber, wie gesagt, Blödsinn. Es dauert länger, bis das Menü geladen ist. Außerdem nimmt das Menü mehr Platz in den Ressourcen ein. Verwende lieber Intergers.
vs schrieb:
Ach und ist das mit dem # vor der ID (wie du es gezeigt hast) irgendwo in der MSDN dokumentiert?
Das ist gängige Praxis unter Windows und gilt nicht nur für Ressourcen. Schau Dir beispielsweise die Remarks zu FindResource an.
-
Du kannst es theoretisch einfach "IDR_MENU1" nennen (also mit ""). Dann wird afaik keine ID vergeben, sondern direkt der String verwendet (siehe -King-s Kommentar) - ist aber ja eh nicht so sehr sinnvoll
-
flenders schrieb:
Du kannst es theoretisch einfach "IDR_MENU1" nennen (also mit "").
Der Ressourcen-Compiler des VC macht da aber was anderes draus. Du mußt das Menü dann so laden:
LoadMenu(hInst, TEXT("\"IDR_MENU1\""));
Edit: Schreiben kann man das aber so, da hast Du natürlich recht.
-
Also wenn ich unter Eigenschaften bei ID einen String (bzw. halt in "" eingeschlossen) - z.B. "TestMenu" eingebe, steht das ohne "" im .rc (also TestMenu) und kann dann ganz normal mit direkt mit dem String ("TestMenu") geladen werden
-
Ah, Du sprichst vom Editor. Das habe ich falsch verstanden, ich war noch bei der händischen Nacharbeit. Da steht es dann eben so wie eingegeben. Sorry dafür.