藏族的风俗文化:如何在MFC单文档中创建多视图

来源:百度文库 编辑:偶看新闻 时间:2024/07/06 16:14:35
如何在MFC单文档中创建多视图 2009-03-19 21:16
分类:VC++
字号:大大 中中  小
基本步骤如下:
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));

注:以上程序在vs2008上调试成功。
.net下c++,mfc 文档/视图结构 单文档多视图结构怎么创建? MFC单文档视图中如何生成类似对话框中的控件啊?谢谢大侠了!! 如何在MFC(单文档类型)的自定义类中在屏幕上输出?谢谢! MFC中怎么在单文档中导入对话框 在mfc单文档(SDI)中,多对话框中怎样公用一个变量m? 如何在word中创建窗体文档! 如何在WORD中创建主控文档 请问在mfc中如何在指定目录下创建一个文档又不改变现在的工作区所在的路径 在VC-MFC-单文档如何实现清屏菜单按扭 怎样在MFC中首先启动视图类窗口?? WTL的单文档中怎么显示2个视图? 那位大哥知道:如何在C++的MFC中实现改变单文档字体大小的方法不?小弟急用!在线等!谢谢啊!!!!!! 如何在视图上创建索引 关于MFC单文档画图 [求助]创建了一个MFC单文档的应用程序,怎样改变窗口大小? MFC 如何创建DLL 在sql中如何调用已经创建好的视图得到查询结果 SQL Server中如何创建可以被更新的视图? MFC方法中CView类如何创建滚动条 在sqlserver2000中创建视图时,能否创建计算字段,怎样创建? 在word文档中使用主控文档视图和使用文档的超级链接有什么区别? 我在MFC单文档程序中直接加入AnimateWindow函数,用到AW-CENTER,编译时告诉我这些都没有定义,为什么 如何在VC中创建不是基于MFC的EXcel表格的生成阿?用C语言的阿 如何在vb中建立视图????