Menüleiste aktualisieren
-
Hallo!
Ich habe ein Fenster mit einer Menüleiste (z.B. Datei, Hilfe, usw...). Um einzelne Menüs für den User zu sperren deaktiviere ich sie mit:
mmenu->EnableMenuItem(0, BYPOSITION | MF_DISABLED | MF_GRAYED);
Das Menü kann nun nicht mehr angewählt werden. Die Menüleiste wird jedoch nicht neu gezeichnet und das Menü bleibt unverändert wie es war (Ist also noch nicht grau hinterlegt)
. Wie kann ich nun ein Update des gesamten Fensters (nicht nur Views) auslösen?
Danke!
-
Dann musst du das Aktualisieren sicherlich in der MainFrame machen...
Gruß
:: NoName ::
-
Ja das habe ich versucht mit Invalidate() aber das hat auch nicht den gewünschten Effekt gebracht.
Das Problem mit Invalidate() ist, dass nur die client area aktualisiert wird. Nicht aber der Rahmen.
-
Gibt es noch andere Möglichkeiten eine Aktualisierung auszulösen? Bei einem Schliessen einer MessageBox beispielsweise wird das rufende Fenster auch wieder neu gezeichnet.
Gruss Jonas
-
Warum arbeitest du nicht mit OnUpdateUI?
Das wird immer zum richtigen Zeitpunkt aufgerufen.
-
estartu_de schrieb:
Warum arbeitest du nicht mit OnUpdateUI?
Das wird immer zum richtigen Zeitpunkt aufgerufen.
Wenn ich das richtig verstehe arbeite ich bereits damit. Oder habe ich dich falsch verstanden? Mein Code sieht vereinfacht wie folgt aus:
void CMainFrame::OnUpdatePassword(CCmdUI *pCmdUI) { CWnd* pMain = AfxGetMainWnd(); CMenu* mmenu = pMain->GetMenu(); mmenu->EnableMenuItem(0, BYPOSITION | MF_DISABLED | MF_GRAYED ) Invalidate(); // geht nicht }
Gruss Jonas
-
Teilweise...
Du warstest, bis ein bestimmter Menüpunkt geupdatet werden soll (Passwort) und holst dir dann einen Zeiger auf das Menü usw.
Du hast mit pCmdUI aber schon einen Zeiger auf den Menüpunkt, der gerade dran ist.
Den kannst du nun mit pCmdUI-Enable(FALSE) grau machen.
-
OnUpdatePassword() wird durch drücken der F1-Taste ausgelöst. Das heisst der Zeiger zeigt nicht auf das Menü (oder die Menüs). Deshalb funktioniert pCmdUI-Enable(FALSE) leider nicht um sie grau zu machen und so hab ich mir die Zeiger eben geholt.
-
Du must die Aktualisierung "von Hand" anstoßen. So z.B.
void CMeinDialog::UpdateMenus() { CMenu* pMainMenu = GetMenu(); CCmdUI cmdUI; for (UINT n = 0; n < pMainMenu->GetMenuItemCount(); ++n) { CMenu* pSubMenu = pMainMenu->GetSubMenu(n); cmdUI.m_nIndexMax = pSubMenu->GetMenuItemCount(); for (UINT i = 0; i < cmdUI.m_nIndexMax;++i) { cmdUI.m_nIndex = i; cmdUI.m_nID = pSubMenu->GetMenuItemID(i); cmdUI.m_pMenu = pSubMenu; cmdUI.DoUpdate(this, FALSE); } } }
Dann baust du "UpdateMenue" einfach dort ein, wo dein Menü geändert werden soll.
-
Achsoooo, du hast einen Dialog!
Ja, sorry, bei einem Dialog funktioniert der OnUpdateUI Mechanismus nicht, such mal, dazu gibt es einen Workaround. (Ist vielleicht auch das, was gezeigt wurde, weiß ich nicht genau.)
-
Nein ich habe keine Dialog. Nur ein Fenster mit Rahmen, Statusleiste, Menüleiste und einen Splitter Window. In dieser Ansicht kann F1 gedrückt werden was dazu führt, dass einige Menüs grau werden. Und zwar nicht Untermenüs wie beispielsweise Öffnen im Menü Datei sondern direkt das Menü Datei.
Der Code von Burkhi hat leider auch nicht funktioniert. Die Menüs sind dadurch nicht gesperrt worden. Mit dem ursprünglichen Code:
mmenu->EnableMenuItem(0, BYPOSITION | MF_DISABLED | MF_GRAYED);
...wurden die Menüs zwar gesperrt aber die Ansicht wurde nicht aktualisiert.
-
Hallo Suzi,
sorry, ich hatte vergessen dazuzuschreiben, das du in den OnUpdate-Methoden die Bedingungen für das Sperren bzw. Freigeben definieren mußt.
Im Klartext heißt das: Definiere für jeden Menüpunkt, den du vorhast zu ändern, eine Update-Command Methode (das geht mit dem Resourcen-Editor). In dieser schreibst du dann hinein, wann dein Menüpunkt aktiviert bzw. deaktiviert werden soll.Also z.B:
void CMyDialog::OnUpdateMenueDatei(CCmdUI *pCmdUI) //Das fügt der Resourceneditor ein. { pCmdUI->Enable (m_EnableMenue); }