Dynamisches Menü
-
Hallo und guten Morgen

ich möchte ein dynamisches Menü erstellen, und zwar, welches zum CMainFrame gehört. Jedoch sollen sich die Einträge ändern, jenachdem was gerade in einem View angezeigt wird (meine App ist MDI). Ich habe es bis jetzt in die
"OnInitialUpdate"-Methode des Views geschrieben, aber es ändert sich keine Menüeintrag. Ich habe ein Menü-Punkt und ein dazugehöriges MenuItem mit dem RessourcenEditor erstellt. Dieses MenüItem lösche ich dann, und füge je nach View meine eigenen hinzu.Hier mal etwas Code wie ich es bis jetzt mache (habe es aus einem Buch, aba kann nicht kanz verstehe warum dort "static CMenu" verwendet wird)
CMenu* menu; menu = AfxGetMainWnd()->GetMenu(); CMenu* subMenu(menu->GetSubMenu(3)); subMenu->DeleteMenu(0,MF_BYPOSITION); static CMenu popUp; CMenu* popUpMenu = NULL; popUpMenu = & popUp; popUpMenu->CreatePopupMenu(); popUpMenu->AppendMenuW(MF_STRING,ID_POPUP_ITEM_1,L"Text 1");Der Effekt ist wie gesagt NULL
(also kein Effekt)!Wenn ich es in die "OnPrepareDC" Methode schreibe funktioniert es FAST. Eben nur Fast, auser das sich manchmal dadurch andere Menüeintrage ebenfalls ändern, unn zwar genau wie mein Menü was ich ändern will (GetSubMenu(3)).
Bye J.
-
Okay *freu*
habe es hinbekommen.
Lösung:Ich habe den ganzen Code wieder in "OnPrepareDC" geschrieben, blos jetzt so:
CMenu* menu; menu = AfxGetMainWnd()->GetMenu(); unsigned int menuPos(0); for(unsigned int ii=0; ii<menu->GetMenuItemCount(); ++ii) { CString menuStr; menu->GetMenuStringW(ii,menuStr,MF_BYPOSITION); if(menuStr==L"MeinMenu") { menuPos = ii; break; } } CMenu* subMenu(menu->GetSubMenu(menuPos)); ...... weiter wie sonst auchJetzt wird sichergestellt, das kein anderes Menü überschrieben wird!!
Bye
-
So, nun doch noch mal ne Frage.
So wie es jetzt funktioniert, funktioniert es fast schon so wie es soll, auser:
ich öffne das 1. Dokument -> View wird erstellt und angezeigt --> das Menü wird angepasst!
ich öffne das 2. Dokument -> View wird erstellt und angezeigt -->das Menü wird NICHT angepasst !!!Ich klicke auf View von Doku1 -> View von Doku 1 schiebt sich vor View von Doku 2.
Ich klicke dann auf View von Doku2 ->View von Doku 2 schiebt sich vor View von Doku 1 -----> Menü ist nun wie es sein soll und bleibt auch bei den ganzen Views auch wie es sein soll!!Ich denke da läuft dann etwas bei der Aktualisierung falsch!!
Kann mir jemand einen Tipp geben?
Ciao
-
1. OnPreareDC ist der total falsche Ansatz.
2. Schau Dir mal an wie in den MFC-Sourcen das ganze für die most recent used files gemacht wird.
Leg einen Dummy ID im Menü an. In den Handler dieses Dummy-Menüpunktes werden die eigentlichen Menüpunkte erzeugt...
3. Dein Ansatz müsste sonst berücksichtigen, dass MDI oder SDI benutzt wird.
-
Martin Richter schrieb:
2. Schau Dir mal an wie in den MFC-Sourcen das ganze für die most recent used files gemacht wird.
Leg einen Dummy ID im Menü an. In den Handler dieses Dummy-Menüpunktes werden die eigentlichen Menüpunkte erzeugt...
3. Dein Ansatz müsste sonst berücksichtigen, dass MDI oder SDI benutzt wird.Ja, ich glaube auch das "PrepareDC" der falsche Ansatz ist.
Ich lege auch schon einen Dummy im Menü an, da sonst das ganze nicht funktioniert.
Aber:
was meinst du mit "most recent used files"? Wo sind die, oder die Source?Ach, übrigens: Danke
-
Du hast die Source der MFC auf Deinem Rechner.
Bei einem SDI Projekt wird im Datei Menü die letzten verwendeten Dateien automatisch angehängt.
Dies geschieht in dem entsprechenden Handler in CWinApp::OnUpdateRecentFileMenu
Diese riuft eine Methode CRecentFileList::UpdateMenu(CCmdUI* pCmdUI) auf.Hier kannst Du sehen, wie die MFC Menüs anstelle eines Platzhalters ausführt...
Siehe
VC\atlmfc\src\mfc\filelist.cpp
-
okay,
das ist schön wie das dort funktioniert, aber mir erschliest sich das nicht wie, ich das auf meinen Fall anwenden kann.
Ich habe NULL Ahnung!............
-
Dann versuche es doch mal zu debuggen.
Du hast den Sourcecode.1. Du hast einen ON_UPDATE_COMMAND_UI Handlerfür das erste Item.
2. Dieser Handler wird durch die MFC mit einem pCmdUI Handler aufgerufen.
3. Mit den übergebenen Objekten ergänzt nun dieser Handler das Menü.Ist keine Hexerei
