Brauche dringend euren Rat - Menü-Item verändert sich einfach nicht
-
Ich habe ein Menü mit Datei-Neu-Arbeitsgruppe
Zum testen möchte ich einfach, dass nachdem Click auf Arbeitsgruppe, das MenüItem disabled wird. Ich habe schon sämtliche Sachen ausprobiert. Wenn ich folgendes nehme:
CWnd* pMain = AfxGetMainWnd(); CMenu* pMenu = pMain->GetMenu(); CMenu* pSubMenu = pMenu->GetSubMenu(0); pSubMenu->EnableMenuItem(0,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
dann diabled er "Neu". Wenn ich folgendes nehme:
CWnd* pMain = AfxGetMainWnd(); CMenu* pMenu = pMain->GetMenu(); CMenu* pSubMenu = pMenu->GetSubMenu(0); CMenu* pSubSubMenu = pSubMenu->GetSubMenu(0); pSubSubMenu->EnableMenuItem(0,MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
dann sollte er doch eigentlich "Arbeitsgruppe" disablen. Tut er aber nicht.
Oder zweites Beispiel. Ich habe Datei-test. Das test hat die ID IDD_TEST.
Beide Sachen klappen ebenfalls nicht.
CWnd* pMain = AfxGetMainWnd(); CMenu* pMenu = pMain->GetMenu(); pMenu->EnableMenuItem(IDD_TEST,MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
CWnd* pMain = AfxGetMainWnd(); CMenu* pMenu = pMain->GetMenu(); CMenu* pSubMenu = pMenu->GetSubMenu(0); pSubMenu->EnableMenuItem(IDD_TEST,MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
Ich verstehe das nicht. Was mache ich falsch?
-
Du müsstest ein Drittes mal GetSubMenu(0) aufrufen.
Devil
-
dachte ich auch, aber das Teil läuft dann auf Fehler, weil es halt nicht weiter runter geht.
-
Hi,
versuchs doch mal mit dem ON_UPDATE_COMMAND_UI - Handler.
Du gehst im Resource-Editor auf das Menuitem, das Du disablen willst, wählst über rechte Maustaste den Classwizard. Dann wählst Du bei Messages "UPDATE_COMMAND_UI" aus (Doppelklick) und schon hast Du einen Handler, in dem Du mit
pCmdUI->Enable( xxx);
das Menuitem disablen oder enablen kannst. xxx steht hier für einen logischen Ausdruck (oder auch ne boolsche Variable).
Hab ich eben ausprobiert, funktioniert.
Gruss
yeti
-
@yeti: du hast recht, da funktioniert natürlich. Ich kann das so in der Form schlecht verwenden, nennen wir es so. Warum ist das so?
Mein Child-Fenster in der MDI bestehen aus einem Rahmen und einer View. Ich übergeb dem Konstruktor Konstanten, so dass ich dort in der Klasse weiß, welches Fenster der User gerne sehen will. Sicher kennt du das verhaltgen aus der IDE heraus. Je nachdem welches Fenster oder Knoten du markierst, ändert sich auch oben das Menü. Und genau so brauche ich es.
Das heisst, wenn das Fenster aktiviert wird und je nachdem was der User im TreeView angeklickt hat. Sind ja schon mal zwei Werte. Bei einem Menü mit 50 Einträgen, hätte ich 50 UI-Handler und in jedem müsste ich die Abfrage setzen, was für ein menü und welcher Knoten. Das ist nicht besonders hilfreich und auch nicht wirklich OOP
Ich kann es echt so nicht gebrauchen. So langsam bekomme ich das Gefühl das die MFC 7 da ein Defekt hat. Anders kann ich mir das nicht erklären.
-
Hi,
dein Problem hat mir keine Ruhe gelassen. Google hat geholfen:
Ich habs mit ner SDI-Anwenduung versucht, aber es sollte auch mit MDI funktionieren:
1. Wenn Du nicht die ON_COMMAND_UPDATE_UI - Handler verwenden willst, musst Du direkt nach dem Erzeugen des Mainframe-Windows in InitInstance das automatische Menuhadnling ausschalten:
((CFrameWnd*)m_pMainWnd)->m_bAutoMenuEnable = FALSE;
2. Dann kannst Du wie folgt die Menuelemente ein/ausschalten (mein Beispiel hier schaltet File-New aus):
CWnd* pMain = AfxGetMainWnd(); CMenu* pMenu = pMain->GetMenu(); int ret = pMenu->EnableMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_GRAYED); pMain->DrawMenuBar();
Wichtig ist der Befehl "DrawMenuBar()", ohne den passiert nix!
Hoffe es hilft Dir,
Gruss
yeti
-
Hallo Yeti,
dein Einsatz hat sich gelohnt, vielen herzlichen Dank dafür. Es klappt. Da muss man erst mal drauf kommen. hatte auch gegoogelt, aber immer nur dieselben Beispiele gefunden. In der MSDN steht auch nix dazu. Also danke nochmal.