Richtiges resizen eines Splitters ?!



  • Hi Martin,

    **zu 1)

    Warum fragst Du nicht Dein eingebettetes Splitter Window nach seiner Größe?

    **

    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
    {
    	CRect spRect;
    //------- Hauptsplitters erstellen ----------
    	m_Splitter_Main.CreateStatic(this, 4, 1); 
    	m_Splitter_Main.GetClientRect(spRect);
    
    //--- Größe der Zeilen des Hauptsplitters setzen ---
    	m_Splitter_Main.SetRowInfo(0, spRect.Height()/4, 10);
    	m_Splitter_Main.SetRowInfo(1, spRect.Height()/4, 10);
    	m_Splitter_Main.SetRowInfo(2, spRect.Height()/4, 10);
    	m_Splitter_Main.SetRowInfo(3, spRect.Height()/4, 10);
    
    	m_Splitter_Main.CreateView(1, 0, RUNTIME_CLASS(CTest_01View), CSize(0, spRect.Height()/4), pContext); 
    	m_Splitter_Main.CreateView(2, 0, RUNTIME_CLASS(CTest_01View), CSize(0, spRect.Height()/4), pContext); 
    
    	m_Splitter_Child_1.CreateStatic(&m_Splitter_Main, 1, 3, WS_CHILD | WS_VISIBLE, m_Splitter_Main.IdFromRowCol(0, 0)); 
    	m_Splitter_Child_1.CreateView(0, 0, RUNTIME_CLASS(CTest_01View), CSize(spRect.Width()/3, 0), pContext); 
    	m_Splitter_Child_1.CreateView(0, 1, RUNTIME_CLASS(CTest_01View), CSize(spRect.Width()/3, 0), pContext); 
    	m_Splitter_Child_1.CreateView(0, 2, RUNTIME_CLASS(CTest_01View), CSize(spRect.Width()/3, 0), pContext);
    
     	m_Splitter_Child_2.CreateStatic(&m_Splitter_Main, 1, 2, WS_CHILD | WS_VISIBLE, m_Splitter_Main.IdFromRowCol(3, 0)); 
     	m_Splitter_Child_2.CreateView(0, 0, RUNTIME_CLASS(CTest_01View), CSize(spRect.Width()/2, 0), pContext);
     	m_Splitter_Child_2.CreateView(0, 1, RUNTIME_CLASS(CTest_01View), CSize(spRect.Width()/2, 0), pContext); 
    
    	return TRUE;	
    }
    

    Hast Du das so gemeint, leider funktioniert Dein Vorschlag nicht !
    😢

    Gruß
    ShadowEater


  • Mod

    Das kann in OnCreateClient nicht gehen. In diesem Moment hat noch kein Fenster seine Größe!



  • Hi Martin,

    ich habs jetzt in OnSize(...) gepackt.
    Aus OnCreateClient (...) hab ich auch das Setzen der Größe des Hauprsplitters rausgenommen, da dies ja nun in OnSize(...) stattfindet !

    So sieht das ganze optisch aus :

    http://filehosting.at/images/download.php?file=ff7d17637e6608627d832c8a10783a9f

    Der letzte Splitter ist nun etwas höher aber noch nicht genau gleich hoch wie die anderen horiz. Splitter !
    Was kann ich denn noch tun ?

    /************************************************************************/
    /* Erstellen des Fensters der Anwendung							        */
    /************************************************************************/
    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
    {
    	CRect spRect;
    	CRect cr; 
    	GetClientRect(&cr);
    //------- Hauptsplitters erstellen ----------
    	m_Splitter_Main.CreateStatic(this, 4, 1); 
    
    	m_Splitter_Main.CreateView(1, 0, RUNTIME_CLASS(CTest_01View), CSize(0, cr.Height()/4), pContext); 
    	m_Splitter_Main.CreateView(2, 0, RUNTIME_CLASS(CTest_01View), CSize(0, cr.Height()/4), pContext); 
    
    	m_Splitter_Child_1.CreateStatic(&m_Splitter_Main, 1, 3, WS_CHILD | WS_VISIBLE, m_Splitter_Main.IdFromRowCol(0, 0)); 
    	m_Splitter_Child_1.CreateView(0, 0, RUNTIME_CLASS(CTest_01View), CSize(cr.Width()/3, 0), pContext); 
    	m_Splitter_Child_1.CreateView(0, 1, RUNTIME_CLASS(CTest_01View), CSize(cr.Width()/3, 0), pContext); 
    	m_Splitter_Child_1.CreateView(0, 2, RUNTIME_CLASS(CTest_01View), CSize(cr.Width()/3, 0), pContext);
    
     	m_Splitter_Child_2.CreateStatic(&m_Splitter_Main, 1, 2, WS_CHILD | WS_VISIBLE, m_Splitter_Main.IdFromRowCol(3, 0)); 
     	m_Splitter_Child_2.CreateView(0, 0, RUNTIME_CLASS(CTest_01View), CSize(cr.Width()/2, 0), pContext);
     	m_Splitter_Child_2.CreateView(0, 1, RUNTIME_CLASS(CTest_01View), CSize(cr.Width()/2, 0), pContext); 
    
    	return TRUE;	
    }
    
    /************************************************************************/
    /* Resizen des Splitters                                                */
    /************************************************************************/
    void CMainFrame::OnSize(UINT nType, int cx, int cy) 
    {
    	CFrameWnd::OnSize(nType, cx, cy);
    	CRect spRect;
    	m_Splitter_Main.GetClientRect(spRect);
    
    	if ((nType == SIZE_MAXIMIZED)||(m_Splitter_Main.IsWindowVisible() && nType == SIZE_RESTORED))
    	{
    
    		m_Splitter_Main.SetRowInfo(0, spRect.Height()/4, 10);
    		m_Splitter_Main.SetRowInfo(1, spRect.Height()/4, 10);
    		m_Splitter_Main.SetRowInfo(2, spRect.Height()/4, 10);
    		m_Splitter_Main.SetRowInfo(3, spRect.Height()/4, 10);
    
    		m_Splitter_Main.RecalcLayout();	
    	}
    }
    

    Danke für Deine Hilfe
    ShadowEater


  • Mod

    Ist Dir klar, dass Du bei der Berechnung die Breiten der Splitter nicht berücksichtigst? Evtl. kommt daher die Abweichung.



  • Ja,

    aber es kommt mir doch nur auf die Höhe an !

    Gruß
    ShadowEater


  • Mod

    Dann musst Du eben auch die Höhe der Zwischenräume/Trackbars berücksichtigen! Ist doch klar, sonst beliebt für das letzte Fenster einfach 3 Trackbar breiten zu wenig übrig.



  • Die Sache mit den 3 Trackbars leuchtet ein, aber wohet bekomm ich die Breite, einfach bei nem ScreenShot die Pixel abzählen und hardcoded dazuaddieren, oder
    gibt es eine Get...??? - Funktion ? 😕

    Gruß
    ShadowEater


  • Mod

    IMHO stehen die Maße nur in internen Variablen,

    int m_cxSplitter, m_cySplitter;         // size of splitter bar
    	int m_cxBorderShare, m_cyBorderShare;   // space on either side of splitter
    	int m_cxSplitterGap, m_cySplitterGap;   // amount of space between panes
    	int m_cxBorder, m_cyBorder;             // borders in client area
    


  • Sorry dass ich so spät antworte, aber in den internen Variablen steht nix, bzw. die gibts gar nicht !

    Gruß
    ShadowEater


  • Mod

    Diese Variablen sind in der CSpillterWnd Implementierung bei mir vorhanden!


Anmelden zum Antworten