Richtiges resizen eines Splitters ?!
-
Hi ;),
Nachdem Aufruf von CFrameWnd::OnSize(nType, cx, cy); hat sich das schon brav an die Restgröße angepasst.
Ja aber da ist es doch schon zu spät ich möchte die korrekte Darstellung doch schon beim Start der App.
Wenn Du das Layout in OnSize anpasst, dann wird es sich sowohl beim verkleinern als auch beim Vergrößern anpassen.Es geht nur darum dass die vorgenommenen Größenänderungen (mit der Maus verzogene Splittergrößen) erhalten bleiben.
Beim vergrößern/verkleinern soll es ins Verhältnis gesetzt werden (das funzt) aber die Größenänderungen werden auch rückgängig gemacht !!!Gruß
ShadowEater
-
Quatsch! In OnSize ist es nicht zu spät. OnSize wird auch beim Start der Applikation aufgerufen, es ist also auch der korrekte Zeitpunkt initial die Einstellungen festzulegen!
Wenn Du Proportional die Einstellungen immer bhalten willst, dann musst Du eben auch immer umrechnen. D.h. Du musst Dir die Verhältnisse zu einem Zeitpunkt x setzen/merken und jedesmal wenn OnSize aufgerufen wird gemäß diesen Verhältnissen dann wieder anpassen.
D.h. für Dich, nach dem Resizen eines Panes musst Du Dir die neuen Verhältnisse merken.
-
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!