Splitter anpassen
-
Ich beschreib mein Problem nochmal, vielleicht könnt ihr mir dann helfen.
Ich hab um einen StaticSplitter an die Größenänderung des Fensters anzupassen (d.h. dass die Grenze sich relativ mitverändert) den Code in OnSize geschrieben.
Das Programm stürzt jedoch mit einer Access Violation ab.
Wie kann ich den Splitter anpassen ohne den Fehler zu bekommen?void CMainFrame::OnSize(UINT nType, int cx, int cy) { CFrameWnd::OnSize(nType, cx, cy); // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen CRect rect; GetClientRect(rect); m_wndSplitter.SetRowInfo(0,rect.Height(),1); m_wndSplitter.SetColumnInfo(0,rect.Width()*3/4,1); m_wndSplitter.SetColumnInfo(0,rect.Width()/4,1); m_wndSplitter.RecalcLayout(); }Ich hab echt keine Ahnung woran es liegen könnte!
-
Hast du schonmal den Debugger benutzt um die Codezeile zu finden wo es abstürzt ?
Nein: Dann mach das. Sollen wir sonst raten.
-
Natürlich hab ich den Debugger benutzt, es stürzt genau an dieser Zeile ab:
m_wndSplitter.SetRowInfo(0,rect.Height(),1);Wenn ich die SetRow Zeile weglasse dann stürzt es bei
m_wndSplitter.SetColumnInfo(0,rect.Width()*3/4,1);ab.
Der Debugger springt dann zu folgendem Code:
void CSplitterWnd::SetRowInfo(int row, int cyIdeal, int cyMin) { ASSERT_VALID(this); ASSERT(row >= 0 && row < m_nMaxRows); ASSERT(cyIdeal >= 0); ASSERT(cyMin >= 0); m_pRowInfo[row].nIdealSize = cyIdeal; m_pRowInfo[row].nMinSize = cyMin; }und setzt eine Markierung bei m_pRowInfo[row].nIdeal ...
-
Kann mir keiner helfen?
-
Hat wirklich keiner eine Idee wie man den Splitter anpasst, irgendwas?
-
Das OnSize des MainFrames kommt bevor der Splitter vollständig ist. Der Splitter wird erst bei OnClientCreate aufgebaut
und ist beim ersten Durchlauf des OnSize vom MainFrame noch nicht fertig.
Vielleicht ist es auch besser das OnSize des Splitters abzufangen.
Ich habe leider keine bessere Abfrage gefunden, aber vieleicht hilft es ja.void CMainFrame::OnSize(UINT nType, int cx, int cy) { if(!m_wndSplitter.IsIconic() && m_wndSplitter.IsWindowVisible()) { m_wndSplitter.SetRowInfo(0,rect.Height(),1); m_wndSplitter.SetColumnInfo(0,rect.Width()*3/4,1); m_wndSplitter.SetColumnInfo(0,rect.Width()/4,1); m_wndSplitter.RecalcLayout(); } }