Richtiges resizen eines Splitters ?!
-
Hmmm ok, das versteh ich, cx, xy merken leuchtet ein, wie ist dann die Umrechnungsformel wenn ich die Größe des Splitters proportional anpassen möchte ?
Gruß und vielen Dank
ShadowEater
-
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
-
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
-
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
-
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
-
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
-
Diese Variablen sind in der CSpillterWnd Implementierung bei mir vorhanden!