SplitWnd bzw. WinSplit
-
hallo,
ich habe mir in meiner Anwendung mit WinSplit ein zweigeteiltes Fenster gebastelt. Jetzt möchte ich das eine der beiden Panes nochmals unterteilen, so dass ich später [linksoben], [linksunten] und [rechts] bekomme.
ich weis jedoch nicht so richtig wie ich anfangen soll.
ist es möglich meinen vorhandenen "Split" zu erweitern (wie z.B. in HTML);
oder mus ich in einem Pane eine weitere Klasse laden, die dies dann nochmal unterteilt???
Ich währe euch für Tipps oder Beispiele wirklich dankbar.
mfg
Thinux
-
Du hast wie es aussieht nicht im Geringstens den Splitter verstanden
Also, du kannst einen Splitter mit beliebig vielen Panes anlegen... musst de halt nur als Parameter bei CSplitterWnd::CreateStatic(...); übergeben... was du allerdings machen willst... überleg mal
wirst de drauf kommen
-
Um dein Hauptfenster in drei Teile zu unterteilen musst du zwei Splitter erstellen.
Hierzu gibt es in der MSDN ein Beispiel. Siehe hier:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcsample/html/_sample_mfc_VIEWEX.asp
-
richtig! wenn ichs verstanden hätt, würd ich ja nicht fragen.
-
also das hier war der ursprüngliche code:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { if (!m_wndSplitter.CreateStatic(this, 1, 2)) return FALSE; m_wndSplitter.SetInitialRatio(0.85); // left pane is 85% wide if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CTabView), CSize(100, 100), pContext) || !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CHotPropCtrl), CSize(100, 100), pContext)) { m_wndSplitter.DestroyWindow(); return FALSE; } return TRUE; }
(funktioniert!)
daraus hab ich versucht ein R1C1, R2C1, R1-2C2 gesplittetes Window zu kreiren, was mir nicht so ganz gelingt:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { if (!m_wndSplitterH.CreateStatic(this, 1, 2)) //1st splitt return FALSE; m_wndSplitterH.SetInitialRatio(0.85); // left pane is 85% wide if (!m_wndSplitterH.CreateView(0, 1, RUNTIME_CLASS(CTabView), CSize(100, 100), pContext)) //right pane { m_wndSplitterH.DestroyWindow(); return FALSE; } if (!m_wndSplitterV.CreateStatic(&m_wndSplitterH, 2, 1)) //2nd splitt return FALSE; m_wndSplitterV.SetInitialRatio(0.80); // top pane is 80% hight if (!m_wndSplitterV.CreateView(0, 0, RUNTIME_CLASS(CTabView2), CSize(100, 100), pContext) //left top pane || !m_wndSplitterV.CreateView(1, 0, RUNTIME_CLASS(CHotPropCtrl), CSize(100, 100), pContext)) /left bottom pane { m_wndSplitterV.DestroyWindow(); return FALSE; } return TRUE; }
schau doch bitte mal drüber und sagt mir wo der Fehler liegt.
...oder habt ihr eine bessere Lösung?Vielen dank!
mfg thinux
-
ps. vielen dank für den msdn-link. das sample kannte ich schon, und ich hab versucht das schema zu übernehmen, aber es funzt nicht...???
-
Änder mal die Zeile in:
if (!m_wndSplitterV.CreateStatic(&m_wndSplitterH, 2, 1,WS_CHILD | WS_VISIBLE | WS_BORDER,m_m_wndSplitterH.IdFromRowCol(0,1)))) //2nd splitt
return FALSE;könnte gehen, auf jedenfall mußt Dú die ID der Row mit angeben.
Gruß Matthias
-
Hier ein komplettes Beispiel.
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext) { // Unterteiltes Fenster erstellen m_wndSplitter.CreateStatic(this, 1, 2); // Erster Splitter erstellen // View für Splitter erstellen m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(100, 100), pContext); // Zweites Fenster erstellen m_wndSplitter2.CreateStatic(&m_wndSplitter,2,1,WS_CHILD | WS_VISIBLE | WS_BORDER,m_wndSplitter.IdFromRowCol(0,1)); // Views für Splitter zwei erstellen m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(100, 100), pContext); m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CLeftView), CSize(100, 100), pContext); return TRUE; }
Ein komplettes Beispiel war auch in dem genannten Link in der MSDN...
-
danke, aber ich bekomme immer noch den Fehler: "ErrorCode = 0x0C0000F1" ...
-
...ich glaub ich hab das problem umzingelt!
--> kann man in einem Pane denn keine Dialoge anzeigen?
(zB. so: !m_wndSplitterV.CreateView(1, 0, RUNTIME_CLASS(CDialog1), CSize(100, 100), pContext))oder muss ich meine CDialog nur richtig "präparieren"?
(includes sind gesetzt in der Class des Splitters und in MainFrm)