中易网

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

答案:2  悬赏:40  
解决时间 2021-03-15 12:34
如何在MFC单文档中创建多视图
最佳答案
基本步骤如下:
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));
全部回答
直接把对应的视图替换掉就可以了,
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎么向家人要50元钱 帮忙扯个理由 我是学生
翻译普通话的白话发音
活动内容和活动有求有什么区别
胖子日语怎么读
路下乡我想知道这个在什么地方
錯疑的意思是什么?錯疑的释义是什么啊?
停车场(龙泉南路)(龙泉南路与龙泉路交叉口南2
2015年广安职业技术学院速录专业分数线是多少
you go to fuck your father seven color是什
河北医科大学临床学院多少分,我是河北理科考
新的电冰箱为什么要空置8小时
木门距地面多高
征兵体检 初检不合格
买汽车装饰品(坐垫,脚垫等)应该去那家店
和合康源健康体验馆丰南分店这个地址在什么地
推荐资讯
以防万一含义是什么
为什么会突然认为自己喜欢一个人
正格广告传媒地址有知道的么?有点事想过去
顺天合意保健院我想知道这个在什么地方
九龙镇马王社区地址在哪,我要去那里办事
今天看见了秦皇岛职业技术学院的东校区,好破
java流程图生成器
能源定义?
奥迪q7柴油版空气减震能单独调高度吗?
内蒙古海拉尔区牙克石市的结婚风俗有什么?
三国志13威力加强版 怎么结拜
吊灯怎么调高低
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?