2016-11-29 5 views
0

Ich habe eine CDialogEx-Klasse namens Eigenschaften, in denen ich die ON_COMMAND-Nachricht behandeln. Nun sollte ON_COMMAND aufgerufen werden, wenn ich auf den Menüpunkt ID_EDIT_PROPERTIES klicke (als Untermenü im Hauptmenü). Der Event-Handler-Assistent hat diesen Code für mich geschrieben, aber wenn ich die Anwendung starte, bleibt der Menüeintrag ausgegraut. Ich habe versucht, es manuell zu aktivieren, indem Sie EnableMenuItem aufrufen, wenn ON_UPDATE_COMMAND_UI geschieht, aber ohne Erfolg.MFC-Menüelement bleibt grau

Jede Hilfe würde sehr geschätzt werden.

+1

Ich habe herausgefunden, dass es behandelt wird, wenn ich die Document-Klasse meines Projekts anvisiere. Dies ist ein einfacher Workaround, wie es scheint. Aber ich bin immer noch neugierig, warum ich nicht aus der CDialogEx-Klasse damit umgehen kann. – Michen

+0

Wird Ihr 'ON_UPDATE_COMMAND_UI'-Handler jemals aufgerufen? –

+0

AFAIK, Der Befehlshandler wird nicht für Dialoge aufgerufen. (siehe https://support.microsoft.com/en-us/kb/242577) – Max

Antwort

0

Pro m_bAutoMenuEnable, Wenn dieses Datenelement aktiviert ist (dies ist die Standardeinstellung), werden Menüelemente ohne Handler ON_UPDATE_COMMAND_UI oder ON_COMMAND automatisch deaktiviert, wenn der Benutzer ein Menü aufruft.

0

Ich gebe zu, dass ich nicht ii weiß es ist anders für CDialogEx, aber für CDialog fand ich, dass die UPDATE_COMMAND_UI nicht immer funktionierte, wenn ich das WM_KICKIDLE Ereignis behandelt.

In Ihrem OnKickIdle Ereignishandler einen Aufruf:

CWnd::UpdateDialogControls

Es ist ein kurzes Tutorial darauf here.

Verzeihen Sie mir, wenn CDialogEx diese Informationen ersetzt und ich werde die Antwort entfernen.

0

Sie müssen nur wissen, wie Menüpunkte die Aktivierung/Deaktivierung behandelt wird:

  • Wenn es weder ON_COMMAND ist noch ON_UPDATE_COMMAND_UI Handler das Element deaktiviert ist.
  • Wenn kein Handler ON_UPDATE_COMMAND_UI vorhanden ist, aber ON_COMMAND im aktuellen aktiven Dokument oder in der aktuellen Ansicht (oder sogar im "Mainframe") vorhanden ist, wird das Element aktiviert.
  • Wenn ein Handler ON_UPDATE_COMMAND_UI vorhanden ist, wird das Aktivieren/Deaktivieren des Elements vom Handler bestimmt (pCmdUI->Enable(bEnableState)).

Denken Sie auch daran, dass:

  • Sie nicht EnableMenuItem() selbst nennen können, statt pCmdUI->Enable(bEnableState) in einem ON_UPDATE_COMMAND_UI Handler aufrufen. Dies betrifft nicht nur den Menüpunkt, sondern auch alle anderen "Befehl" -Typ-Objekte (mit gleicher ID), zB Hauptmenü, Kontextmenü, Werkzeugleiste oder Bewehrungsschaltfläche.
  • Wo der Handler abgelegt wird, hängt vom Anwendungsdesign ab und hängt von den Daten ab, die Sie verarbeiten oder darstellen. Sie kann in die Mainframe-Klasse (wenn sie von einigen "globalen" Daten oder Einstellungen abhängt), in die Dokumentenklasse (wenn sie von einigen Daten oder Einstellungen im Dokument abhängt oder diese ändert - möglicherweise alle Ansichten betreffen) oder in die view class (-es) (abhängig von oder nur in der aktuellen Ansicht).

In Ihrem Fall, wenn ich richtig verstehe, das Element deaktiviert ist, da der Handler in der CDialogEx abgeleitete Klasse ist, aber keine Instanz dieser Klasse hat noch erstellt wurde, dh es gibt keine ON_COMMAND Handler für Ihre ID_EDIT_PROPERTIES Befehl.