1.定义CSplitterWnd类型变量
在MainFrm.h文件中加入如下代码:
protected:
CSplitterWnd m_wndSplitter;
定义Splitter变量用于分割客户区窗口,本例中将客户区分割为两列一行。
2.构建分割后各分区的视图
本例中构建一个CTreeView视图和CFormView视图
(1)Insert->New Class..构建Base class为CTreeView文件名称为MyTreeView的树视图;
(2)在资源视图中添加对话框资源,右击->Properties->Style:Child,Border:None。右击->ClassWizard...创建类名为:CMyFormView,Base class:CFormView的视图。
需要注意的是,基于CTreeView和CFormView的视图类向导自动添加了两个允许视图运行时创建的两个宏:DECLARE_DYNCREATE(CMyTreeView)和IMPLEMENT_DYNCREATE(CMyTreeView, CTreeView),前者一般声明在头文件构造函数下方,后者声明在源文件构造函数实现代码上方。如若使得继承与CDialog类的对话框资源也可以运行时创建,就需要在类文件中分别添加这两个宏。
3.构建分割视图
在MainFrm.cpp文件中的OnCreateClient()函数中添加如下构建分割视图的代码:
m_wndSplitter.CreateStatic(this,1,2);
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMyTreeView),CSize(200,100),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMyFormView),CSize(100,100),pContext);
RUNTIME_CLASS即执行运行时创建。
4.分别为TreeViw和FormView添加初始化及用户所需代码
对于FormView由于对应的是对话框资源,其相关操作与对话框操作类似。下面主要分析TreeView。
.cpp文件中初始化代码:
void CMyTreeView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
m_pCtrTree = &GetTreeCtrl();//获取视图的CTreeCtrl控件便于以后操作
(CWnd*)m_pCtrTree->ModifyStyle(0,TVS_LINESATROOT| TVS_EDITLABELS |TVS_HASBUTTONS |TVS_HASLINES ,0);
/*m_list 为CImageList对象IDB_TREE 为16*(16*4)的位图,每个图片为16*16共4个图标*/
m_list.Create(IDB_TREE,16,4,RGB(0,0,0));
m_pCtrTree->SetImageList(&m_list,TVSIL_NORMAL);
HTREEITEM hItem,hSubItem;
hItem = m_pCtrTree->InsertItem("Windows 资源管理器",0,1,TVI_ROOT);//在根结点上添加
hSubItem = m_pCtrTree->InsertItem("文件",0,1,hItem);//在根结点上添加一个子结点
hSubItem = m_pCtrTree->InsertItem("文件",0,1,hItem,hSubItem);//在根结点上添加一个子结点,排在上面的子节点后面
hSubItem = m_pCtrTree->InsertItem("文件",0,1,hItem,hSubItem);
hItem = m_pCtrTree->InsertItem("文件夹",2,2,TVI_ROOT,hItem);
hItem = m_pCtrTree->InsertItem("文件夹",3,3,TVI_ROOT,hItem);
}
5.两视图间交互操作
交互主要是数据的交互,有两种解决方式:一种是以Document为中间媒介,数据都有Document进行管理,方便实现数据交互;二是通过MainFrm中定义的CSplitterWnd变量在本视图中获取另一视图的指针,并作强制类型转换成其对应视图变量后,访问视图中的数据。本例采用第二种方式。
void CMyTreeView::OnMouseMove(UINT nFlags, CPoint point)
{
CMainFrame* Wnd1 = (CMainFrame*)AfxGetMainWnd();//首先获取主框架
CString str;
str.Format("x = %d,y = %d ",point.x,point.y);
CWnd* m_pWndFormView;
m_pWndFormView= Wnd1 ->m_wndSplitter.GetPane( 0, 1 );//由主框架中m_wndSplitter变量获取FormView.
((CMyFormView*)(m_pWndFormView))->m_edit = str;//设置FormView中变量的值
((CMyFormView*)(m_pWndFormView))->UpdateData(FALSE);//更新显示数据
CTreeView::OnMouseMove(nFlags, point);
}
6.编译运行结果
如图: