MFC界面分割以及挂载
- virtual BOOL Create(
- CWnd* pParentWnd,//分割窗口的父窗口框架
- int nMaxRows, //最大的行 最大为2
- int nMaxCols, //最大的列 最大为2
- SIZE sizeMin, //规定一个窗口的最小尺寸,要是小于这个尺寸,分割的窗口就不会显示
- CCreateContext* pContext, //上下文
- DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT,
- UINT nID = AFX_IDW_PANE_FIRST
- );
- virtual BOOL CreateStatic(
- CWnd* pParentWnd,
- int nRows,
- int nCols,
- DWORD dwStyle = WS_CHILD | WS_VISIBLE,
- UINT nID = AFX_IDW_PANE_FIRST
- );
- virtual BOOL CreateView(
- int row,
- int col,
- CRuntimeClass* pViewClass,
- SIZE sizeInit,
- CCreateContext* pContext
- );
创建动态分割窗口的步骤为:
1. 在父框架类中定义一个CSplitterWnd类型的成员对象。
2. 重载父框架类的CFrameWnd::OnCreateClient成员函数。
3. 在重载的CFrameWnd::OnCreateClient函数中调用CSplitterWnd成员对象的Create函数。
在CFrameWnd::OnCreateClient添加如下代码
return m_wndSplitter.Create(this,2, 2, CSize(10, 10), pContext);
二、静态分割的实现过程
创建静态分割窗口的步骤为:
1. 在父框架类中定义一个CSplitterWnd类型的成员对象。
2. 重载父框架类的CFrameWnd::OnCreateClient成员函数。
3. 在重载的CFrameWnd::OnCreateClient函数中调用CSplitterWnd成员对象的CreateStatic成员函数,然后可以调用CSplitterWnd成员对象的CreateView成员函数为每个窗格创建视图。
- CRect m_crect;
- GetClientRect(&m_crect);
- if (!m_wndSpliter.CreateStatic(this,2,1))
- {
- return FALSE;
- }
- if (!m_wndSpliter.CreateView(0,0,RUNTIME_CLASS(CmyWindowView),CSize(m_crect.Width(),m_crect.Height()/2),pContext))
- {
- return FALSE;
- }
- if (!m_wndSpliter.CreateView(1,0,RUNTIME_CLASS(CmyWindowView),CSize(m_crect.Width(),m_crect.Height()/2),pContext))
- {
- return FALSE;
- }
- return TRUE;
三、综合实例
下面的这个实例是从网上看来的,记录一下,以便以后好查找。实现过程基本是按照作者的思路来的。
添加视图类
需要为3个窗格添加3个视图类。CLeftFormView、CTopListView、CBottomEditView,其基类分别为CFormView、CListView和CEditView。(注意是MFC类)
1、CLeftFormView类的实现
A、 添加对话框资源模板:添加CLeftFormView类之前,首先要向工程中添加CLeftFormView视图中对话框模板,如下图所示:
对话框模板的ID为“IDD_DIALOG1”,其Style属性设置为“Child”,Bolder属性设置为“None”。
B、添加CLeftFormView类。执行“Insert”→“New Class”菜单命令,弹出“New Class”对话框,在其中的Name编辑框中输入类名“CLeftFormView”,在Base Class列表框中选择基类“CFormView”选项,在Dialog ID列表框中选择“IDD_DIALOG1”对话框资源。单击Ok即可实现CLeftFormView类的添加。
C、添加CLeftFormView类的相关资源:利用Class Wizard在CLeftFormView中,为对话框模板的4个编辑控件分别添加CString类型的成员变量m_Num、m_Name、m_Magor、m_Home,并为“提交”按钮添加BN_CLICKED消息响应函数OnSubmit()。
2、CTopListView类的实现
同样使用“New Class”对话框,添加CTopListView类,将其基类选择类型为CListView。然后使用Class Wizard重载该类的PreCreateWindow()函数,在其中定义列表视的类型,代码如下:
- BOOLCTopListView::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: Add your specialized code hereand/or call the base class
- cs.style=cs.style|LVS_REPORT;// 设置成报告列表的显示形式
- return CListView::PreCreateWindow(cs);
- }
使用Class Wizard重载CTopListView类的OnInitialUpdate()函数,在其中添加列表的表头,代码如下:
- voidCTopListView::OnInitialUpdate()
- {
- CListView::OnInitialUpdate();
- // TODO: Add your specialized code hereand/or call the base class
- CString m_ColumnLabelStr[]={"学号","姓名","专业","籍贯"}; //表头字段
- CListCtrl & listctrl=GetListCtrl();//获取列表的控件
- DWORD dwStyle =listctrl.GetExtendedStyle();
- dwStyle|= LVS_EX_FULLROWSELECT; // 选中某行使整行高亮(只适用与report风格的listctrl)
- dwStyle |= LVS_EX_GRIDLINES;
- dwStyle |=LVS_EX_UNDERLINEHOT;
- listctrl.SetExtendedStyle(dwStyle);//列表风格
- int width[6]={80,80,110,150};
- for(int i=0;i<4;i++)
- {
- listctrl.InsertColumn(i,m_ColumnLabelStr[i],LVCFMT_LEFT,width[i]);//设置表头
- }
- }
3、CBottomEidtView类的实现
同样使用New Class对话框,添加CBottomEditView类,将其基类选择为“CEditView”。而后使用Class Wizard重载该类的OnInitialUpdate()函数,在其中实现初始化设置,代码如下
- void CBottomEditView::OnInitialUpdate()
- {
- CEditView::OnInitialUpdate();
- //TODO: Add your specialized code here and/or call the base class
- CEdit &mEdit=GetEditCtrl(); //获取编辑视图的控件
- mEdit.SetWindowText("等待用户输入学生的信息!");//设置显示信息
- mEdit.EnableWindow(FALSE);//编辑控件不可编辑
- }
静态分割窗口的实现
窗口的分割过程中是首先在主框架CMainFrame中,将窗口分割成上下两个窗格,对应的视图分别为CGuoView和CBottomEditView。而后,再在CGuoView视图中将窗格分为左右两个窗格,对应的视图分别为CLeftFormView和CTopListView,实现过程如下。
1、 在CMainFrame类的头文件中,声明一个CSplitterWnd类的成员变量m_wndSplitter1,用于第一个窗口的分割
CSplitterWnd m_wndSplitter1; //用于产生第一次的静态的分割
2、 使用Class Wizard重载CMainFrame类的OnCreateClient()函数,在其中实现第一次的窗口分割
- BOOLCMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
- {
- //TODO: Add your specialized code here and/or call the base class
- CRect rect;
- GetClientRect(&rect); //产生第一次静态分割
- m_wndSplitter1.CreateStatic(this, //父窗口指针
- 2,1); //行数与列数
- m_wndSplitter1.CreateView(0,0, //窗格的行列序数
- RUNTIME_CLASS(CGuoView),//视图类
- CSize(rect.Width(),rect.Height()-rect.Height()/5),pContext);//父窗口创建参数
- m_wndSplitter1.CreateView(1,0,RUNTIME_CLASS(CBottomEditView),
- CSize(rect.Width(),rect.Height()/5),pContext);
- //不在调用基类的OncreateClient函数
- return true;
- }
包含相应的头文件,在MainFrame.cpp文件的开始加入下列语句
#include "GuoView.h"
#include "BottomEditView.h"
3、 在视图窗口类CGuoView的头文件中声明一个CSplitterWnd类的成员变量m_wndSplitter2,用于第二次窗口分割。
protected:
CSplitterWnd m_wndSplitter2; //用于第二次窗口的分割
4、 使用Class Wizard重载CGuoView类的OnCreateClient()和OnSize()函数,实现窗口第二次分割并设置窗格的大小。
- int CGuoView::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if(CView::OnCreate(lpCreateStruct) == -1)
- return-1;
- //TODO: Add your specialized creation code here
- CRectrect;
- GetClientRect(&rect); // 获得窗口的创建信息指针
- CCreateContext *pContext=(CCreateContext *)lpCreateStruct->lpCreateParams;
- m_wndSplitter2.CreateStatic(this,1,2);//产生第二次的静态分割
- //为第一个窗格产生视图
- m_wndSplitter2.CreateView(0,0,//窗口的行列序数
- RUNTIME_CLASS(CLeftFormView),//视图类
- CSize(rect.Width()/4,rect.Height()),//
- pContext);
- //为第二个窗格产生视图
- m_wndSplitter2.CreateView(0,1,RUNTIME_CLASS(CTopListView),CSize(1,1),pContext);
- return0;
- }
至此,窗口的分割完成,编译运行程序,就会发现三叉窗口已经实现。如果在编译连接程序的时候出现如下面的错误:
c:\documents and settings\chenqi\桌面\guo\guoview.h(23) :error C2143: syntax error : missing ';' before '*'
c:\documents and settings\chenqi\桌面\guo\guoview.h(23) :error C2501: 'CGuoDoc' : missing storage-class or type specifiers
c:\documents and settings\chenqi\桌面\guo\guoview.h(23) :error C2501: 'GetDocument' : missing storage-class or type specifiers
则可以在CGuoView类头文件的前面加上这么一句class CGuoDoc; 就没有问题了。
MFC界面分割以及挂载的更多相关文章
- MFC界面相关源码
这是这4篇MFC界面的相关源码.建议学习Visual C++的看看这2本微软官方出的教材. [MFC Windows程序设计(第2版,修订版)](美)Jeff Prosise著 [Windows程序设 ...
- C++做四则运算的MFC计算器(一)MFC界面创建
学习最有效的方法就是实战,这两篇文章写了做MFC加减乘除计算器的过程. 第一写前台MFC界面搭建,第二写后台计算原理及代码. MFC编程参考教程:http://www.jizhuomi.com/sch ...
- windows核心编程课程实践---多线程文件搜索器(MFC界面)
课上完了连老师见都没见一面QAQ....记录一下该小项目 效果如下: 1.实现文件搜索功能,并封装为类 1)首先是文件搜索类Rapidfinder的构造函数和析构函数和文件信息初始化函数和文件路径规格 ...
- MFC 窗口分割与通信
一.关于CSplitterWnd类我们在使用CuteFtp或者NetAnt等工具的时候,一般都会被其复杂的界面所吸引,在这些界面中窗口被分割为若干的区域,真正做到了窗口的任意分割. 那么我们自己如何创 ...
- 为MFC界面添加一个Log Window
前言 由于早期的图像处理程序基于VC6.0,MFC也是采用VC6.0开发的.在实际处理中,我不仅需要界面的显示,有很多时候,我需要算法处理的过程中的信息,比如每个阶段的耗时,处理的图像大小,以及如果需 ...
- VC6.0中MFC界面换肤简例
利用VC中的MFC进行界面设计时,发现界面上的各控件无法简易地进行调整,比如字体大小.颜色.格式等. 为了改变外观,小小地美化一下,今天决定动手一试. 网上提供的库和方法不计其数,我选择了SkinMa ...
- MFC窗口分割以及各窗口间的通讯
一个偶然的机会又重新接触了MFC窗口的分割,自己结合资料重新写了一个窗口分割的程序,现将具体流程跟大家分享一下: 1.我们先创建一个MFC单文档类的程序,具体分割方式先将单文档整个客户区分成两行一列, ...
- 【转】MFC界面更新实现方法
原文网址:http://www.cnblogs.com/skywatcher/p/3572311.html 1.更新窗口 即采用UpdateWindow()函数立即发送WM_PAINT消息更新整个窗口 ...
- MFC界面更新实现方法
1.更新窗口 即采用UpdateWindow()函数立即发送WM_PAINT消息更新整个窗口. void CEditTestDlg::OnBnClickedBtnSysUpdate() { CStri ...
随机推荐
- webviewplugin
https://blog.csdn.net/qq_39197547/article/details/85007418 https://www.cnblogs.com/pjl43/p/9866753.h ...
- 我最喜欢的Mybatis 3.5新特性!超实用!
Mybatis 3.5 发布有段时间了,终于支持了 Optional ,这么实用的特性,竟然还没人安利……于是本文出现了. 新特性比较简单,但非常实用,因为能大量简化恶心的判空代码. WARNING ...
- GitHub 常用的几条命令
初始化仓库 git init 下载仓库 git clone 仓库地址 将所有违背跟踪的文件添加到本地仓库 git add . 查看状态 git status 执行提交 git commit -m pr ...
- mysql5.7.21下载及安装步骤
以前都是用的5.6的数据库,现在想着换个新版本数据库.跟上时代的步伐,于是安装了一天才安装好.具体步骤如下: 1.官网下载mysql解压zip版,由于客户端安装版都是32位的,我的电脑是64位系统,所 ...
- JS实现打开本地文件或文件夹 ActiveXObject
IE浏览器打开C盘,测试可用. 如果浏览器报错提示:ActiveXObject is not defined Internet 选项 -> 安全 - >安全级别,调低级别 function ...
- mysql中data和datatime的区别
1.显示格式的区别 Date显示格式:YYYY-MM-DD:DateTime显示格式:YYYY-MM-DD HH:mm:ss. 2.显示范围的区别 Date显示范围是1601-01-01 到 9999 ...
- hadoop配置项笔记 - streaming
stream.map.input.ignoreKey 作用:是否忽略key,只传递值. 默认值:false 我的设置:按需要更改 stream.map.input.field.separator st ...
- 承接微信小程序外包 H5外包就找北京动点软件开发团队
承接小程序外包 微信小程序外包 H5外包 就找北京动点软件 长年承接微信小程序.微信公众号开发 全职的H5开发团队,开发过几十款微信小程序公众号案例 欢迎来电咨询,索取案例! QQ:372900288 ...
- day1——分割数组
// 小白一名,0算法基础,艰难尝试算法题中,若您发现本文中错误, 或有其他见解,往不吝赐教,感激不尽,拜谢. 领扣 第915题 今日算法题干//给定一个数组 A,将其划分为两个不相交(没有公共元素) ...
- 【Redis】windows下redis服务的安装
下载地址: https://github.com/MicrosoftArchive/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择,这里我们 ...