Menüeinträge deaktivieren - EnableMenuItem
-
Hi,
bei dem Versuch Menüeinträge in meiner SDI-Anwendung zu deaktivieren passieren Dinge, die ich überhaupt nicht verstehe

Zunächst wollte ich ein paar Einträge im "Datei-Menü" deaktivieren. Ich habe für die entsprechenden Einträge im Ressourcen-Editor die Eigenschaft "Enabled" auf FALSE und die Eigenschaft "Grayed" auf TRUE gesetzt, was allerdings in meiner Applikation überhaupt nichts bewirkt hat. Die Einträge waren weder "ausgegraut" noch waren sie inaktiv.
Anschließend habe ich es folgendermaßen probiert:
CMenu* pMainMenu = AfxGetApp()->m_pMainWnd->GetMenu(); CMenu* pSubMenu = pMainMenu->GetSubMenu(0); pSubMenu->EnableMenuItem(ID_FILE_PRINT, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);Auch das hat nichts bewirkt.
Mit dem selben Code konnte ich dann aber einen Menüeintrag deaktivieren, den ich selbst erstellt hatte. Als ich aber die 3 Zeilen Code wieder gelöscht habe, blieb der Eintrag deaktiviert (neuer Build) und ich konnte ihn auch nicht über
pSubMenu->EnableMenuItem(ID_MEINEINTRAG, MF_BYCOMMAND | MF_ENABLED);wieder aktivieren.
Gibt es dafür eine logische Erklärung. Ich kapiere es jedenfalls überhautp nicht

-
Du solltest erstmal verstehen, wie MFC Anwendungen Command's, Toolbars und Menüs behandeln.
Hierfür werden Handler aufgerufen, die z.B. dem Menüitem sagen ob es enabled oder disabled ist.
Das direkte manipulieren eines Menüeintrages hat in der MFC fast nie eine Wirkung, da der entsprechende Handler das Item wieder in den Status setzt, den er möchte.
Du must den ON_UPDATE_COMMAND_UI Handler für ID_FILE_PRINT überschreiben. Dort kannst Du über den Zeiger pCmdUI dann das Item z.B. disablenn.
Ist kein ON_UPDATE_COMMAND_UI aber ein ON_COMMAND Handler vorhanden, so ist das Menüitem immer enabled!
-
Ach du Sch...
Ja, das war natürlich ein absoluter Schnellschuss! Hätte ich das besser gleich noch einmal kurz nachgeschlagen, anstatt im Forum blöde Fragen zu stellen, wäre ich wahrscheinlich schneller am Ziel gewesen
Mit einer Behandlungsfunktion für ON_UPDATE_COMMAND_UI war die Sache dann eigentlich gleich erledigt.Vielen Dank also für den Hinweis!