Ein erstes Halloo... und auch mein erstes Problem: CSplitterWnd
-
Hallo zusammen...
Im Zusammenhang mit einem 1-Jährigen Praktikum sammle ich nun seit 3 Wochen autodidaktisch erste Erfahrungen mit C++ und der MFC-Library.
Von meinem Arbeitgeber habe ich den Auftrag bekommen eine bestehende Software um folgende Option zu erweitern:
Daten-Strukturen welche von einem von 'unserer'-Firma produzierten Gerät gespeichert werden, mit der bereits existierenden Software in ein Verzeichnis auf dem Computer geholt werden sollen nun aus diesem Verzeichnis in zwei unterschiedlichen Ansichten in der Software präsentiert werden:
1. Die aktuellen, von der Pumpe gerade geladenen Files, geordnet nach kriterien
2. Auflistung des ganzen Standard-Verzeichnisses (inkl. Unter-Ordnern)Dies beiden Ansichten habe ich jeweils mit einer von CTreeView abeleiteten Klassen erstellt.
Diese Ansichten sollten nun etwa folgendermassen geordnet werden:*********************** *----*----------------* *-1--*----------------* *----*----Standard----* ******----Ansicht-----* *----*----------------* *-2--*----------------* *----*----------------* ***********************Für diese habe ich in der von meinem Anwendungs-Assistenten generierten Klasse CMainFrm::OnCreateClient() folgenden Code geschrieben:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext) { CRect rect; GetClientRect(rect); int ColOneWidth = rect.Width() / 4; int ColOneHeight = rect.Height() / 2; int ColTwoWidth = rect.Width() - ColOneWidth; //Statischer Splitter kreieren if(!m_wndSplitter.CreateStatic(this, 1, 2)) //1 Zeile und 2 Spalten { TRACE0("Failed to create first static splitter\n"); return FALSE; } //Eingenesteter statischer Splitter mit 2 Zeilen und 1 Spalte in der ersten Spalte des statischen Splittes if(!m_wndSplitter2.CreateStatic(&m_wndSplitter, 2, 1, WS_CHILD | WS_VISIBLE, m_wndSplitter.IdFromRowCol(0, 0))) { TRACE0("Failed to create nestes static splitter\n"); return FALSE; } //Linke-Untere Ansicht in erster Spalte und zweiter Zeile integrieren if(!m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CMyLeftSubTree), CSize(ColOneWidth, ColOneHeight), pContext)) { TRACE0("Failed to create CMyLeftSubTree\n"); } //Linke-Obere Ansicht in erster Spalte und erster Zeile integrieren if(!m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CMyLeftTree), CSize(ColOneWidth, ColOneHeight), pContext)) { TRACE0("Failed to create CMyLeftTree\n"); } //Rechte Ansicht in zweiter Spalte des statischen Splitters erstellen if(!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CStandardView), CSize(ColTwoWidth, rect.Height()), pContext)) { TRACE0("Failed to create CStandardView\n"); } return TRUE; }Mein Problem liegt nun darin, dass die Ansichten eigentlich jeweils an der richtigen Position wären, ich beim ersten Starten der Anwendung die zwei linken Ansichten mit dem Balken jedoch erst aufziehen muss...
Weiss jemand woran das liegen könnte?
Vielen Dank
Ratio
-
In dem Moment in dem OnCreateClient abläuft ist die Fenstergröße doch noch gar nicht gesetzt und bekannt.
Du musst die Fenstergrö0ße später anpassen oder anders errechenn.
-
Halloo...
Danke erst mal für deine Antwort.
Ich habe eben etwas mit den Ansichten herumgespielt und bemerkt, dass sobald ich nur noch ein einzelnes statisch in zwei Spalten geteiltes Fenster habe (also den eingenesteten Splitter entfernt habe), ich die Spalten-Breite auf die bereits in meinem Code verwendete Art und Weise verändern und gestalten kann.
In einem weiteren Schritt habe ich in der PreCreateWindow-Methode die Fenster-Grösse mit der gesamten Bildschirm-Grösse initialisiert. Das Ergebnis beim Starten der Anwendung (ohne eingenesteten statischen Splitter) blieb das selbe.
Nun habe ich den Splitter wieder wie im obigen Code eingefügt, und beim Starten der Applikation habe ich nun jedoch wieder das Problem wie ich es im ersten Beitrag bereits beschrieben habe. Der eingenestete Splitter erscheint nicht in der übergebenen Grösse sondern muss zuerst aufgezogen werden.
Werde natürlich selbst weiter nach der Ursache suchen, aber wäre auch froh falls jemand eine weitere Vermutung hätte dies hier schreiben könnte...
Vielen Dank
Ratio
-
Hallo...
Beinahe hätte ich vergessen des Rätsels-Lösung zu meinem Problem zu posten. Möglicherweise schlägt sich ja noch jemand anderes mit einem ähnlichen Problem herum...
Ich poste einfach mal den Code, welcher mir eine Ansicht mit drei Fenstern erstellt, wobei zwei davon übereinander auf der linken Seite des dritten Fensters erzeugt werden.
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext) { CRect rect; GetClientRect(rect); int ColOneWidth = rect.Width() / 8; int ColOneHeight = rect.Height() / 2; int ColTwoWidth = rect.Width() - ColOneWidth; //Statischer Splitter kreieren if(!m_wndSplitter.CreateStatic(this, 1, 2)) //1 Zeile und 2 Spalten { TRACE0("Failed to create first static splitter\n"); return FALSE; } //Beide Spalten des Haupt-Splitters formatieren m_wndSplitter.SetColumnInfo(0, ColOneWidth, 10); m_wndSplitter.SetColumnInfo(1, ColTwoWidth, 10); //Ansicht in zweiter Spalte des Haupt-Splitters erstellen if(!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CStandardView),CSize(0, 0), pContext)) { TRACE0("Failed to create CStandardView"); return FALSE; } //Eingenesteter statischer Splitter mit zwei Zeilen und einer Spalte //in der ersten Spalte des Haupt-Splitters erstellen if(!m_wndNestedSplitter.CreateStatic(&m_wndSplitter, 2, 1, WS_CHILD | WS_VISIBLE, m_wndSplitter.IdFromRowCol(0, 0))) { TRACE0("Failed to create nested static Splitter\n"); return FALSE; } //Ansicht in erster Zeile des eingenesteten Splitters erstellen if(!m_wndNestedSplitter.CreateView(0, 0, RUNTIME_CLASS(CMyLeftTree), CSize(0, rect.bottom / 2), pContext)) { TRACE0("Failed to create CMyLeftTree"); return FALSE; } //Ansicht in zweiter Zeile des eingenesteten Splitters erstellen if(!m_wndNestedSplitter.CreateView(1, 0, RUNTIME_CLASS(CMyLeftSubTree), CSize(0, 0), pContext)) { TRACE0("Failed to create CMyLeftSubTree\n"); return FALSE; } return TRUE; }Folgendes ist mir im Umgang mit CSplitterWnd-Objekten aufgefallen. Wen ein CSplitterWnd-Objekt einmal definiert wurde (bsp. Spaltenbreite des ersten statischen Splitters), muss die Grösse eines in einem solchen Objekt eingebauten zweiten Objektes nicht mehr zwingend angegeben werden, d.h. es kann für die bereits definierte Grösse 0 übergeben werden.
Man liest sich...
Gruss Ratio