EnableMenuItem
-
Hi,
Ich hab eine kleine Bildverarbeitungsanwendung mit MDI geschrieben. Nun weicht meine "File Neu" - Funktionalität aber von der Standardimplementierung des Frameworks ab. Je nach zustand oder geöffnetem Filetyp ist da verhalten also ein anderes. Also habe ich einfach einen neuen Menupunkt mit eigener ID eingefügt. Dieser ist jetzt aber zu Programmbeginn (kein offenes Dokument) vom Framework deaktiviert, selbst wenn ich in ShowWindow explizit enable. In der MSD steht man soll dann mit dem Klassenassi einfach eine Funktion für diese ID angeben und es wäre dann aktiviert - ist es aber nicht.
Also habe ich jetzt einfach manuell eine Funktion "OnSetItemProp"
ON_UPDATE_COMMAND_UI( ID_OWN_FILE_NEW, OnSetItemProp)//ändern der Buttoneigenschaft ON_COMMAND( ID_OWN_FILE_NEW, OnOwnFileNew )
in den AFX - Messageblock eingefügt. In dieser geschieht jetzt folgendes:
void CMainFrame::OnSetItemProp( CCmdUI *pCmdUI ) { pCmdUI->Enable( TRUE ); if( pCmdUI->m_pMenu ) pCmdUI->m_pMenu->EnableMenuItem( pCmdUI->m_nIndex, MF_BYPOSITION | MF_ENABLED ); }
..und siehe da, der Button ist nicht mehr disabled. Leider läuft er jetzt aber auch nicht in die "OnOwnFileNew" hinein. Also habe ich dann in PretranslateMessage WM_COMMAND abgefangen und dort dann auf die Menuselektion reagiert.
Diese Variante funktioniert auch soweit. Das kann ja wohl aber kaum der Weisheit letzter Schluß sein oder?
Danke
-
Innerhalb von CDocument gibts doch OnNewDocument!
Reicht Dir diese Überschreibung nicht aus?
-
Nein, leider nicht, da er dort auch bei
((CPictviewApp*)AfxGetApp( ))->FileNew( ID_COPY_DOC );
vorbeikommt. Wei gesagt, je nach Programmzustand soll er ja anders reagieren. So soll er z.B. mal ein neues Dokument erstellen und den Inhalt aus dem vorherigen übernehemen, mal soll er vorher einen Dialog bringen, bei dem der Benutzer die Kreierungsdaten eingeben muß - denke es werden auch noch mehr.....
-
Innerhalb von CDocument::OnFileNew kannst Du doch verarbeiten, welche Einstellungen übernommen werden sollen, bzw. ob ein altes Bild neu übernommen werden soll usw.
Wenn alles nix hilft, kannst Du
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
innerhalb von CPictViewApp durch Deine eigene OnFileNew-Funktion ersetzen
-
Ja, die Funktion zu überschreiben ist für den Fall doch die beste Lösung. Aber gibt es irgendwo eine Quelle, wo beschrieben ist wie man das Framework bei solchen Problem "aushebeln" kann? Gibt es irgendwo eine Empfehlunsrichtlinie (außer der MSDN), wie man die Funktionalität bei MDI sinnvoll auf die einzelnen Klassen verteilt?