CSplitterWnd: Mehrere panes in einer SDI Anwendung
-
hm da bin ich grade etwas überfragt wie du das meinst!
Kannst du etwas näher erleutern wie du dir das vorstellst?Danke schonmal im vorraus
-
Achtung - ungetestet und ohne Garantie:
if (!m_splitterWnd.CreateStatic( this, 2, 1 )) return false; if (!m_splitterWnd.CreateView( 0, 0, RUNTIME_CLASS(CSplitterWnd), CSize(cr.Width(), cr.Height()/1.11), pContext )) return false; if (!m_splitterWnd.CreateView( 1, 0, RUNTIME_CLASS(CSIView), CSize(cr.Width(), cr.Height()), pContext )) return false; m_splitterWnd2 = *dynamic_cast<CSplitterWnd*>(m_splitterWnd.GetPane(0,0)); if (m_splitterWnd2) { CRect cr2; BOOL r = FALSE; m_splitterWnd2->GetClientRect(&cr2); r = m_splitterWnd2.CreateStatic(m_splitterWndcChat, 1, 2); r = m_splitterWnd2.CreateView(0,0,RUNTIME_CLASS(CSIView), CSize(cr2.Width()/2,cr.Height()), pContext); r = m_splitterWnd2.CreateView(0,1,RUNTIME_CLASS(CSIView), CSize(cr2.Width(),cr.Height()), pContext); }(btw solltest du im zweiten Teil auch jeden einzelnen Fehler überprüfen (statt des "r=..." ist die "if(!...) return false" von oben sicherer))
-
Hi und danke für deine schnelle Antwort!
Hat leider nicht geklappt:MainFrm.cpp(124) : error C2680: 'CSplitterWnd': Ungültiger Zieltyp für dynamic_cast Der Zieltyp muss ein Zeiger oder ein Verweis auf eine definierte Klasse sein MainFrm.cpp(130) : error C2664: 'CSplitterWnd::CreateStatic': Konvertierung des Parameters 1 von 'CSplitterWnd' in 'CWnd *' nicht möglich Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werdenAlso GetPane(...) liefert ein CWnd* zurück, und CreateStatic möchte auch tatsächlich als ersten Parameter ein CWnd* in den Rachen geschoben bekommen

Und beim ersten Splitter klappts ja auch mit CreateStatic(this,.....);
Habe auch schonmal nach diversen Beispielen im Netz gesucht aber wirklich findig bin ich nicht geworden!Achja und selbstverständlich werden noch Kollisionsabfragen vorgenommen wenn alles läuft, die r Variable ist nur zum Testen da dass ich im Debugger schnell sehen kann ob was schief geht.
Nur erstmal muss der 2te splitter da irgendwie rein
-
Ups, mein Fehler - es muß natürlich "dynamic_cast<CSplitterWnd&>(...)" lauten. *korrigiert das Beispiel*
-
Habe nochmal etwas nachgeforscht:
m_splitterWnd2.CreateStatic(&m_splitterWnd,1,2,WS_CHILD | WS_VISIBLE | WS_BORDER,m_splitterWnd.IdFromRowCol(0,0)); m_splitterWnd2.CreateView(0, 1, RUNTIME_CLASS(CSIView), CSize(100, 100), pContext); m_splitterWnd2.CreateView(0, 0, RUNTIME_CLASS(CSIView), CSize(100, 100), pContext);Für den zweiten Splitter ist wohl diese Verwendung von CreateStatic die richtigere (ich schätze mal darauf wolltest du auch hinaus oder?)
Habe zusätzlich mal die Größe des Splitter fest angegeben, aber geändert hat sich leider wirklich nichts! Er wird nicht angezeigt! Die Funktionen retunieren alle 1 laut msdn in ordnung.bin schon wieder voll confused

-
Ja, das ist einer der Punkte - der andere ist, daß der äußere Splitter an der Stelle keinen CSIView einbauen sollte, sondern einen CSplitterWnd (den du dann als inneren Splitter verwendest).
-
Wenn du sowas hier meinst:
m_splitterWnd2.CreateView(0, 1, RUNTIME_CLASS(CSplitterWnd), CSize(100, 100), pContext); m_splitterWnd2.CreateView(0, 0, RUNTIME_CLASS(CSplitterWnd), CSize(100, 100), pContext);das geht auch nicht ^^
Hatte ich auch eben getestet. Irgendwie is diese ganze splitter geschichte total verwirrend
-
Eventuell nochmal nen Bild damit man sich vorstellen kann wie ich das eigentlich meitne:
http://hogranch.com/files/Bitmaps/mirc.gif
Sollte ziemlich genau so aussehen, nur als SDI halt aber das ist ja
relativ egal nehme ich mal an. Und es geht jetzt auch nur um das WindowSplitten
-
Keiner mehr nen Rat?
-
// CMainFrame::OnCreate(...) if(!m_splitterWnd.CreateStatic(this, 1, 2)) { MessageBox("Error setting up splitter frames!", "Error", MB_OK | MB_ICONERROR); return 0; } if(!m_splitterWnd.CreateView(0, 1, RUNTIME_CLASS(CSIView), CSize(100, 100), pContext)) { MessageBox("Error setting up splitter frames!", "Error", MB_OK | MB_ICONERROR); return 0; } if(!m_splitterWnd2.CreateStatic(&m_splitterWnd, 2, 2, WS_CHILD | WS_VISIBLE, m_splitterWnd.IdFromRowCol(0, 0))) { MessageBox("Error setting up splitter frames!", "Error", MB_OK | MB_ICONERROR ); return 0; } // CMainFrame::OnSize(UINT nType, int cx, int cy) if(nType != SIZE_MINIMIZED) { m_splitterWnd.SetRowInfo(0, cy, 0); m_splitterWnd.SetColumnInfo(0, cx - 100, 0); m_splitterWnd.SetColumnInfo(1, 100, 0); // ... ;) m_splitterWnd.RecalcLayout(); m_splitterWnd2.RecalcLayout(); } }Sry kann sein das nen paar Fehler drin sind... hatte keine Zeit das zu testen

-
Huhu!
Selbe SPiel wie immer! Lässt sich alles compilieren und starten nur der 2te splitter wird halt nicht angezeigt!
so langsam bin ich schon am verzweifeln