客户区窗口动态分割示例

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.编译运行结果

如图:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值