如何在mfc单文档中创建多视图

2024-11-25 05:36:27
推荐回答(1个)
回答1:

基本步骤如下:
1.首先创建一个MFC单文档应用程序。
2.添加4个MFC类TopLView、BottomLView、TopRView、BottomRView,基类为CView。
3.添加一个MFC类CControlForm,基类为CFormView,对话框ID默认。
4.创建一个切分类,如MySplitter,基类为CSplitterWnd(默认基类选项中无此类,自己添加即可)。
5.在框架类Cmainframe的头文件中,添加2个MySplitter的变量(因为下面要进行两次切分操作)。
6.重写框架类Cmainframe的OnCreateClient函数,如下:
//第一次静态切分CreateStatic,一行两列
if
(!m_wndSplitter.CreateStatic(this,1,2))
return
FALSE;
//第二次静态切分(将第一次切分后的第二列再分为2*2)及所有的子视图创建(CreateView函数)。
if
(!m_wndSplitter.CreateView(0,
0,
RUNTIME_CLASS(CControlForm),
CSize(100,
100),
pContext)
||
!m_wndSplitter2.CreateStatic(&m_wndSplitter,2,2,WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0,
1))||
!m_wndSplitter2.CreateView(0,
0,
RUNTIME_CLASS(TopLView),
CSize(350,
240),
pContext)
||
!m_wndSplitter2.CreateView(1,
0,
RUNTIME_CLASS(BottomLView),
CSize(350,
240),
pContext)
||
!m_wndSplitter2.CreateView(0,
1,
RUNTIME_CLASS(TopRView),
CSize(350,
240),
pContext)
||
!m_wndSplitter2.CreateView(1,
1,
RUNTIME_CLASS(BottomRView),
CSize(350,
240),
pContext))
{
m_wndSplitter.DestroyWindow();
return
FALSE;
}
//
return
CFrameWnd::OnCreateClient(lpcs,
pContext);
//注释掉原有的响应函数
注意:记得在Mainfrm.h中添加以上五个视图类的头文件:
#include
"CControlForm.h"
#include
"TopLView.h"
#include
"TopRView.h"
#include
"BottomLView.h"
#include
"BottomRView.h"
6.
切分视图完成,结果如下:
其中,最左的视图为FormView类型,操作类似对话框(可以在Resource-Dialog看到其对应的对话框资源);右边四个的操作则类似普通视图。
补充内容:
a.
此时创建的各个子视图之间的分割条可以拖动,以改变视图其大小。如果想固定分割条,则需要重载MySplitter类的鼠标响应函数。可以通过一个Bool型变量来控制是否可以拖动分割条:
if
(Isvisable)
//Isvisable在构造函数中已被初始为FALSE
{
CSplitterWnd::OnLButtonDown(nFlags,
point);
}
b.
还可以通过重载MySplitter类的OnDrawSplitter函数来改变分割条的样式。以下为该函数代码:

#define
LP
RGB(128,128,128)
#define
RB
RGB(192,192,192)
//如果pDC

NULL则仅使分割窗口区域无效
if
(pDC
==
NULL)
{
RedrawWindow(rect,
NULL,
RDW_INVALIDATE|RDW_NOCHILDREN);
return;
}
ASSERT_VALID(pDC);
CRect
rc
=
rect;
switch(nType)
{
case
splitBorder:
//重画分割窗口边界
pDC->Draw3dRect(rc,LP,LP);
rc.InflateRect(-1,-1);
pDC->Draw3dRect(rc,RB,RB);
return;
case
splitBox:
pDC->Draw3dRect(rc,LP,LP);
rc.InflateRect(-1,-1);
pDC->Draw3dRect(rc,LP,LP);
rc.InflateRect(-1,-1);
pDC->FillSolidRect(rc,RGB(128,128,128));
pDC->Draw3dRect(rc,RB,RB);
return;
case
splitBar:
//重画分割条
pDC->FillSolidRect(rc,RGB(192,192,192));
rc.InflateRect(-1,-1);
pDC->Draw3dRect(rc,RB,RB);
return;
default:
ASSERT(FALSE);
}
//填充中间的部分
pDC->Draw3dRect(rect,
GetSysColor(COLOR_BTNSHADOW),
GetSysColor(COLOR_BTNHIGHLIGHT));