Framefenster interagieren
-
Guten Tag, liebe Community,
ich beschreibe mein Problem kurz.
Ich habe nun eine SDI-Applikation in zwei Frames aufgeteilt (mithilfe CSplitterWnd). Das linke Fenster ist von CFormView abgeleitet und mit Buttons versehen. Diese Buttons sollen das rechte Fenster, das von CScrollView abgeleitet ist, beeinflussen. Wenn ich also auf ein Button klicke, soll z. B. das rechte Fenster neugeladen werden. Leider komme ich auf keine Lösung. Die Einbettung des zweiten Fensters auf das erste (also z. B. CFensterZweiView cv in die Klasse CFensterEinsView) nutzt leider nichts; in diesem Fall wird ein ASSERT mit pWnd=NULL geworfen (z. B. bei cv.Invalidate()). Vermutlich muss ich die View-Klasse des zweiten Fensters im ersten irgendwie initialisieren; leider weiß ich nicht, wie. Ich konnte nirgends eine Lösung finden und hoffe auf eure Hilfe.
Vielen Dank im Voraus.Euer Alexander-Sascha
-
Hallo,
um Dir helfen zu können, benötige ich noch ein paar genauere Informationen.
Funktionieren die beiden Views bereits, werden sie angezeigt?Fehlt Dir nur der Zugriff auf die rechte View?
Gruss
Frank
-
Hallo 0xFFFFFF,
ja, sie werden beide problemlos angezeigt. In CMainFrame sieht es so aus:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext) { CRect cr; GetClientRect( &cr); if ( !m_mainSplitter.CreateStatic( this, 1, 2 ) ) { MessageBox( "Error setting up splitter frames!", "Init Error!", MB_OK | MB_ICONERROR ); return FALSE; } if ( !m_mainSplitter.CreateView( 0, 0, RUNTIME_CLASS(CToolsView), //Das linke Fenster CSize(cr.Width()/4, cr.Height()), pContext ) ) { MessageBox( "Error setting up splitter frames!", "Init Error!", MB_OK | MB_ICONERROR ); return FALSE; } if ( !m_mainSplitter.CreateView( 0, 1, RUNTIME_CLASS(CFensterZweiView), //Zweites Fenster CSize(cr.Width()*3/4, cr.Height()), pContext ) ) { MessageBox( "Error setting up splitter frames!", "Init Error!", MB_OK | MB_ICONERROR ); return FALSE; } m_bInitSplitter = TRUE; return TRUE; }
Dies funktioniert soweit vollkommen in Ordnung. Beide Fenster sind bei Programmstart sichtbar und funktionieren, ich habe sie einzeln ausgetestet. Nur, wenn ich jetzt das eingebettete CFensterZweiView beim Klickereignis benutze, löst der Debugger, wie oben beschrieben, einen Assert aus, also erst nach dem Klick auf das Button im linken Fenster. So wie es aussieht, muss ich das vorhandene rechte Fenster initialisieren; die reine Einbettung jedoch erzeugt ein neues Fenster, das nicht existiert (weswegen wohl pWnd=0).
Vielen Dank für deine Mühe und danke im Voraus für deine Antwort.
-
Hallo Frank,
eine Ergänzung, um mögliche Missverständnisse beiseite zu räumen und deine Frage nochmal kurz und knapp zu beantworten: mir fehlt nur der Zugriff auf das rechte Fenster, genauer gesagt der Zugriff auf das rechte Fenster für das linke Fenster.
-
Hallo,
um Zugriff auf die rechte View zu bekommen, kannst du über das Dokument gehen
oder über das Splitter Fenster.
Ich würde über den Splitter gehen.
Mal etwas Code. Vielleicht hilft der dir weiter...void CToolsView::OnButtonClick() { CSplitterWnd* pSplitter = DYNAMIC_DOWNCAST(CSplitterWnd, GetParent()) // hole das Splitter Fenster ASSERT(pSplitter != NULL); // Debug check // Wenn Du an das rechte Fenster Nachrichten senden möchtest // dann würde ich es so machen... CWnd* pRight = pSplitter->GetPane(0, 1); // Handle auf rechte View ASSERT(pRight != NULL); pRight->SendMessage(...); // oder in dieser datei CFensterZweiView includieren CFensterZweiView* pRight = DYNAMIC_DOWNCAST(CFensterZweiView, pSplitter->GetPane(0, 1)); ASSERT(pRight != NULL); pRight->DoReload(); }
So bekommst Du einen gültigen Zugriff auf die rechte View.
Gruss
Frank
-
Hallo Frank,
das ist es.
Vielen Dank, du hast mir sehr geholfen.Mit freundlichen Grüßen
Alexander-Sascha