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)


Anmelden zum Antworten