MFC: Aktualisieren der Benutzungsoberfläche
-
Ich erstelle gerade eine MFC-Anwendung unter Visual C++ .net Standard 2003. Mein Problem: Ich möchte, abhängig von der Belegung gewisser Variablen, mehrere Menüeinträge gleichzeitig abblenden bzw. mit Häkchen versehen. Das direkte Ansprechen der Menüobjekte durch Code wie z.B.:
CMenu* mmenu = GetMenu(); CMenu* submenu = mmenu->GetSubMenu(0); submenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
funktioniert nur, wenn ich
m_bAutoMenuEnable = FALSE;
setze und somit die Standard-Ereignisbehandlung abschalte (was ich nicht möchte). Momentan habe ich für alle betreffenden Menüobjekte Ereignishandler angelegt (mittels Makro UPDATE_COMMAND_UI), doch die werden offenbar nur aufgerufen, wenn der Menüeintrag selbst angeklickt wird.
Meine Vermutung ist jetzt, dass ich den betreffenden Menüobjekten WM_UPDATEUISTATE oder WM_CHANGEUISTATE Messages senden muss, damit sie sich aktualisieren, aber irgendwie bekomme ich das nicht hin. Kann mir jemand verraten, wie man das sauber programmiert, was ich übersehen habe und welche Headerfiles inkludiert werden müssen?
(Ein verzweifelter MFC-Neuling nach der zwölften Tasse Kaffee.)
-
UPDATE_COMMAND_UI wäre der richtige Weg.
Hast du das Autoupdate auch wieder eingeschaltet?Oder hast du einen Dialog? Da musst du Google mal bemühen (ich fürchte, das ist noch nicht in der FAQ) und nach dem Workaround suchen.
-
http://support.microsoft.com/default.aspx?scid=kb;en-us;242577
Dürfte das sein, was estartu finden wollte.
-
Hallo,
um bestimmte Menuelemente zu aktivieren/deaktivieren benutze ich
[cpp] // zu aktivieren: m_cMenu.EnableMenuItem(IDC_REPORT, MF_ENABLED); m_cMenu.EnableMenuItem(IDC_FILE_SAVE, MF_ENABLED); m_cMenu.EnableMenuItem(IDC_FILE_SAVE_AS, MF_ENABLED); // zu deaktivieren und zugleich grau darstellen, da weist der User das diese Menuoption momentan nicht zu verfügung steht: m_cMenu.EnableMenuItem(IDC_REPORT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); m_cMenu.EnableMenuItem(IDC_FILE_SAVE, MF_DISABLED | MF_GRAYED); m_cMenu.EnableMenuItem(IDC_FILE_SAVE_AS, MF_DISABLED | MF_GRAYED); [/cpp]
ich hoffe das kann dir helfen ohne groß im Internet suchen zu müssen
mfg
pixelP.S. ah ja, bei mir ist m_cMenu kein submenu!
-
Vielen Dank für die raschen Antworten. Mal schauen, ob ich es jetzt hinbekomme.