Wie kann ich Menüs dynamisch erweitern?
-
Hi Forum !!
Habe mal ein Problem wie kann man ein Menü dynamisch erweitern?
z.B. Ich habe ein Menü mit einen Popup-Menu Laufwerke
jetzt möchte ich das das Programm alle Laufwerke ausliest und dann in das Popup Menu einbindet. Wie die Laufwerke ausgelesen werden ist nicht von belangen mich interessiert nur wie ich sie dann ich das Menü rein bekomme weil ja wahrscheinlich jeder Rechner unterschiedlich viele Laufwerke hat.
hier noch mal die Struktur des Menüs
z.b.
-------DATEI-------Bearbeiten---------Ansicht-----
........|
Laufwerke->Dynamisch Auflistung
........................|
Dynamisch Auflistung
........................|
Dynamisch Auflistung
-
Hi!
Ich habe das gleiche Problem...
Ich möchte in meiner Anwendung MultilanguageSupport einbauen und dazu die Menus dynamisch aufbauen. Je nach Anzahl der Sprachen. Dazu arbeite ich mit einer Language.ini, in der ich die Sprachen konfigurieren kann. Dann werden die entsprechenden Sprach-Files geladen. Nun soll der Benutzer aber selbst wählen können welche Sprachen unter Ansicht dargestellt werden und welche nicht.
Das Menu sieht wie folgt aus:
|Ansicht|
|Sprache >| [hier sollen dann die Sprachen hin]Frage: Wie bekomme ich nun unterhalb des Popups "Sprache" neue Einträge zur Laufzeit generiert, wenn dort noch keiner vordefiniert ist?
Ich habe mir in der FAQ den Thread zum dynamischen Laden angeguckt, aber der setzt ja schon einen Eintrag im letzten Submenu voraus. Wenn ich unter Sprache "Deutsch" vordefiniere in der Entwicklungsumgebung, dann kann ich auch problemlos weitere Sprachen einfügen. Der Anwender soll aber auch entscheiden können, daß "Deutsch" nicht vorhanden ist über die INI-Datei.
Ein Lösungsweg wäre sicherlich den Eintrag immer umzubenennen, sofern er nicht Deutsch ist aber da muß es doch auch noch eine bessere Lösung geben?
Vielen Dank schonmal im Voraus!!
-
Hi Frenzy!
Habe das Problem so gelöst gefällt mir zwar noch nicht 100% aber egal
also in den Popup menu in den die Einträge dynamisch erzeugt werden sollen habe ich ein dummy menupunkt eingefügt damit der zeiger nicht ins leer bzw ungültige adresse zeigt. diesen dummy eintrag lösche ich dann dynamisch wieder raus nach dem ich die einträge eingetragen habe. habe in meinen dialog feld ne m_variable von typ cmenu erstellt. bei oninitial
m_Menu.LoadMenu(IDR_MENU1) und gebe dies Recource nicht wie üblich mit m_Menu.Detach(); wieder frei. da nach gehts hier der code:
BOOL CCdromDlg::OnInitDialog()
{....m_Menu.LoadMenu(IDR_MENU1);
}
dann erzeuge ich es mit
void CCdromDlg::CreatePopUpMenu()
{
CMenu *submenu, *smenu;
submenu=m_Menu.GetSubMenu(0);
smenu=submenu->GetSubMenu(0);
for (UINT i = 0; i < m_iAnzLaufwerke; i++)
{
smenu->InsertMenu(0,MF_BYCOMMAND,pStart[i].n_ID,pStart[i].Laufwerk);
}
smenu->DeleteMenu(0,MF_BYPOSITION);
smenu=submenu->GetSubMenu(1);
for (i = 0; i < m_iAnzLaufwerke; i++)
{
smenu->InsertMenu(0,MF_BYCOMMAND,pStart[i].n_ID+26,pStart[i].Laufwerk);
}
smenu->DeleteMenu(0,MF_BYPOSITION);
//m_Menu.Detach();//Recource wieder freigeben
}hoffe das hilft weiter
-
Hi!
So hatte ich das ja auch schon gelöst, aber es sollte ja auch ne feinere Methode geben, oder?
Der sonstige Weg war ja in der FAQ sehr schön beschrieben, aber nen Dummy Eintrag über den RessourcenEditor zu generieren und dann wieder zu löschen, kann eigentlich nicht die endgültige Lösung sein.
-
Sorry aber ne bessere Idee hatte ich noch nicht falls du eine finden solltes kannst du die ja hier Posten
-
Macht ja nix.
Es klappt so, auch wenn es in meinen Augen net so die feine Art ist. Irgendwie muß es ja auch anders gehen.
Sobald ich was habe poste ich es hier.
-
*böses doppelpost*
-
So hab mal Lösung falls es dich noch interessiert....
CMenu *submenu;
submenu=m_Menu.GetSubMenu(0);
CMenu *pMenu = new CMenu;
pMenu->CreatePopupMenu();
submenu->InsertMenu(0, MF_BYPOSITION | MF_POPUP, (UINT)pMenu->m_hMenu, pStart[i].Laufwerk);
pMenu->InsertMenu(0,MF_BYPOSITION , pStart[i].n_ID, "Öffnen");damit klappt es
musst du halt noch so anpassen wie du es bei dir brauchst
-
Vielen Dank.
Ich habe es jetzt schon über die Version mit dem Dummy-Eintrag gelöst, aber Deine Lösung werde ich mir auch nochmal ansehen.
Vielleicht mache ich ja doch nochmal eine Änderung.
-
das ist doch recht simpel. ihr habt doch im prinzip nur menü eingebaut. aber was ist mit den click events?
das macht mich zu schaffen. menüs dynamisch einbauen ist ja ok, aber ich muss ja nun jedem menüpunkt ein click event geben, also was passieren soll wenn einer von den dynmischen menüs ein click ausgelöst wurde.
oder habt ihr das schon irgendwie gemacht? würd mich interessieren.
-
Vielleicht mal etwas ganz interessantes http://www.codeproject.com/dll/plugin.asp
-
Edenus schrieb:
das ist doch recht simpel. ihr habt doch im prinzip nur menü eingebaut. aber was ist mit den click events?
das macht mich zu schaffen. menüs dynamisch einbauen ist ja ok, aber ich muss ja nun jedem menüpunkt ein click event geben, also was passieren soll wenn einer von den dynmischen menüs ein click ausgelöst wurde.
oder habt ihr das schon irgendwie gemacht? würd mich interessieren.
Das mit den Klick Events steht auch in der FAQ.
Du musst jedem Menu eine eindeutige ID geben, und das dann
in der OnCommand entsprechend filtern.Devil