Floating Dock anhängig von der View ausschalten, MDI
-
Hallo,
ich versuche gerade in einer MDI App ein Floating Menü/Pannel ( abgeleitet von CDockablePane ) abhängig von der aktiven View zu deaktivieren /aktivieren.
Das Problem dabei ist, dass das Dock in MainFrm erstellt wird. Wenn ich versuche in MainFrame oder dem Dock in OnMDIActivate mit IsKindOf( RUNTIME_CLASS(xxx View) zu prüfen ob die gewünschte View aktiv ist bekomme ich ring include Probleme. Die Vorwärtsdeklaration der Klasse hilft dabei auch nicht.
In der View selbst klappt IsKindOf( RUNTIME_CLASS(xxx View) allerdings kann ich mich nicht zum Dock durchhangeln mit AfxGetApp()->....
Geht das nur mit einer eigenen Message aus der View?
Geht das Makro RUNTIME_CLASS(xxx View) nur in der eigenen Klasse? Das würde eigentlich keine Sinn machen, in allen anderen Klassen bekomme ich die include Probleme.Grüßle
Dean
-
Wo bitte bekommst Du Ringschlüsse?
Ein View hat Abhängigkeiten nur vom. Ein Mainframe braucht weder das eine noch das andere zu wissen.
Was willst Du machen, und wo? Code?
-
Hallo Martin,
eigentlich hast Du Recht.
Das Problem ist, das ein DockPane nur bei 2 Views gebraucht wird. Sonst soll es deaktiviert werden. Also erstelle ich das Dock aus MainFrm, auch nur da habe ich die Möglichkeiten zum Beispiel DockPane() aufzurufen und es wird ja in zwei verschiedenen Views gebraucht.
Ich habe mal Testweise eine neue AFC App angelegt, MDI, mit Floating Eigenschaftsfenster, der Rest ist in Default Einstellungen.
In MainFrm verwende ich
void CMainFrame::OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd) { CMDIFrameWndEx::OnMDIActivate(bActivate, pActivateWnd, pDeactivateWnd); if(pActivateWnd->IsKindOf(RUNTIME_CLASS(class CMFCApplication4View))) m_wndProperties.ShowPane(false, false, false); // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein. }
RUNTIME_CLASS(CMFCApplication4View)
führt in diesem Fall zu g:\tmp\mfcapplication4\mfcapplication4\mainfrm.cpp(374): error C2653: 'CMFCApplication4View': Keine Klasse oder NamespaceEine Vorwärtsdeklaration und ein include des Headers der View führt zu Ringincludes.
Jetzt könnte man das ganze Problem natürlich über einen versteckten Menüeintrag lösen. Allerdings stelle ich gerade fest, dass in VS 2012 im Resouceneditor an der Stelle im IDR_MAINFRAME nur ein Platzhalter ist. Die Menüeinträge werden nur im gestarteten Programm angezeigt. Da habe ich nichts zu dem ich einen Händler verknüpfen könnte. Füge ich jetzt hinter dem Platzhalter weitere Menüeinträge ein, kann ich einen Händler zuordnen diese werden aber nicht im Editor angezeigt, nur im Programm.
In der Resoucendatei steht auch nur Platzhalter.
-
CMDIFrameWndEx::OnMDIActivate(bActivate, pActivateWnd, pDeactivateWnd);
if(pActivateWnd->IsKindOf(RUNTIME_CLASS( CMFCApplication4View)))Natürlich ohne class vor der Klasse