SDI ohne Doc/View splitten
-
So, jetzt nochmal richtig:
Um eine SDI-Anwendung OHNE Doc/View-Unterstützung in 2 Wnds zu splitten, kann man NICHT genauso vorgehen wie bei einer Anwendung MIT Doc/View. Schreibt man
hier seinen Split-Code in die Methode OnCreateClient(), so werden die Statusleiste und die Symbolleiste gesplittet, der MainFrame jedoch nicht. Daher muss man seinen Code umschreiben:1. Man legt eine CSplitterWnd-Member-Variable in der Klasse CMainFrame an:
// Attribute public: CSplitterWnd m_pSplitterWnd;
2. Nun müssen wir so viele Klassen von CView-Klassen ableiten, wie wir später Panes (also Teilfenster) haben wollen. In diesem Beispiel sollen's 2 sein:
Einmal eine von CTreeView abgeleitet, einmal eine von CListView. Die View-Klassen sind dabei Äquivalente zu den Klassen CTreeCtrl und CListCtrl. Aber dazu später. Wir nehmen also den Klassen-Assistenten und leiten die beiden Klassen ab, hier heißen sie dann:CTreeView --> CTree CListView --> CList
3. Wir includieren die Header-Dateien dieser beiden Klassen in MainFrm.cpp:
#include "Tree.h" #include "List.h"
4. Nun schreiben wir in die CMainFrame-Methode ganz am Ende den Code zum Splitten:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { //Statusleisten etc. erstellen if(!m_pSplitterWnd.CreateStatic(this, 1, 2)) { TRACE0("Failed to create splitter bar "); return FALSE; //Fehler beim Createn } m_pSplitterWnd.CreateView(0, 0, RUNTIME_CLASS(CTree), CSize(175,100), NULL); m_pSplitterWnd.CreateView(0, 1, RUNTIME_CLASS(CList), CSize(500,100), NULL); return 0; }
Hier wird der MainFrame vertikal in 2 Panes gesplittet. Der linke Teil bekommt als View-Klasse CTree, der rechte CTree.
5. Nun müssen die View-Klassen (CTree & CList) noch initialisiert werden. Wir wollen nur kurz als Beispiel die List-View in 4 Spalten unterteilen. Dazu fügen wir dieser Klasse eine Antwort-Methode auf die Message WM_CREATE hinzu und fügen dort folgenden Code ein:
int CList::OnCreate(LPCREATESTRUCT lpCreateStruct) { if(CListView::OnCreate(lpCreateStruct) == -1) return -1; //wir holen uns ein CListCtrl-Objekt, um damit arbeiten zu können CListCtrl& lc = GetListCtrl(); lc.ModifyStyle(0, LVS_REPORT); //optional lc.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); //optional lc.InsertColumn(0, _T("Spalte 1"), LVCFMT_LEFT); lc.InsertColumn(1, _T("Spalte 2"), LVCFMT_LEFT); lc.InsertColumn(2, _T("Spalte 3"), LVCFMT_LEFT); lc.InsertColumn(3, _T("Spalte 4"), LVCFMT_LEFT); lc.SetColumnWidth(0,150); lc.SetColumnWidth(1,170); lc.SetColumnWidth(2,130); lc.SetColumnWidth(3,200); return 0; }
Wir dürfen das alles nicht in die OnInitialUpdate-Methode der View-Klasse schreiben, da diese 2x aufgerufen wird. Das hat - "Called by the framework after the view is first attached to the document" - was mit der Doc/View-Unterstützung zu tun: Wir haben aber keine.
So, das war's schon. Hoffe, diesmal ist nix schiefgegangen.
MfG
Happosai
-- Style korrigiert --
[ Dieser Beitrag wurde am 21.02.2003 um 13:32 Uhr von Happosai editiert. ]