MFC---视图和窗口
视类窗口
- 视类窗口是指程序运行后,显示信息的那一部分。对应的类是CTestOneView(TestOne表示项目名称)类,CTestOneView类是派生于CView类,而CView类又派生于CWnd类。他们的继承关系可以通过查找类的定义来查看继承关系。
- 视图类CView,拥有窗口的客户区域,负责显示文档数据,接受用户的输入,提供文档与用户的通信。视类窗口只是主框架窗口中空白的部分。
主框架窗口
- 主框架窗口是指程序运行后,程序的整个界面。对应的类是CMainFrame,CMainFrame类派生于CFrameWnd类,而CFrameWnd类又又派生于CWnd类。
- 主框架窗口就是整个应用程序外框所包括的部分,主框架窗口是视类窗口的一个父窗口。
文档
文档类CDcoument,负责维护应用程序所需要的数据,提供一系列可对这些数据进行操作的方法,并且能够为视图提供所需的数据。
新建一个MFC单文档应用程序,项目名称为SDITest。从项目结构中可以看到SDITest程序中还有一个CSDITestDoc类,它派生于CDocument类,CDocument类的基类是CCmdTarget,而CCmdTarget又派生于CObject类,从而可知这个CSDITestDoc类不是一个窗口类,实际上是一个文档类。
MFC提供的文档/视(Document/View)结构,能够把数据本身与它的显示分离开,其中文档是指CDocument类,视类是指CView类。
数据的存储和加载由文档类来完成,数据的显示和修改则由视类完成,从而把数据的管理和显示方法分离开来。
下面介绍一下MFC单文档程序是如何将文档类对象、框架对象、视类对象组织在一起的。在源文件SDITest.cpp中找到CSDITestApp类的InitInstance函数定义,有下面这一段代码:
// 注册应用程序的文档模板。文档模板将用作文档、框架窗口和视图之间的连接
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CSDITestDoc),
RUNTIME_CLASS(CMainFrame), // 主 SDI 框架窗口
RUNTIME_CLASS(CSDITestView)
);
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
- 从上面的代码段中可知,定义了一个单文档模板对象指针pDocTemplate,这个对象把文档对象、框架对象、视类对象有机地组织在一起,形成了一个有机的整体,程序接着利用AddDocTemplate函数把这个单文档模板添加到文档模板中,从而把这三个类组织为一个整体。
文档、视和框架窗口间的关系和消息传送
文档相当于数据容器,视相当于查看数据的窗口或是和数据发生交互的窗口。一个完整的应用一般由四个类组成:CWinApp应用类,CFrameWnd框架窗口类,CDocument文档类,CView视类。
在程序运行时,CWinApp将创建一个CFrameWnd框架窗口实例,而框架窗口将创建文档模板,然后文档模板创建文档实例和视实例,并将两者关联。
通常情况下,我们只需对文档和视进行操作,框架的各种行为已经被MFC封装好了,不需人为干预,界面和逻辑分离,让开发人员将主要的精力放在程序的算法和功能实现上。
在应用中,一个视对应一个文档,但一个文档可以包含多个视。
一个应用中只用一个框架窗口,对多文档界面来说可能有多个MDI子窗口,每一个视都是一个子窗口;在单文档界面中父窗口即是框架窗口,在多文档界面中父窗口为MDI子窗口。
一个多文档应用中可以包含多个文档模板,一个模板定义了一个文档和一个或多个视之间的对应关系。同一个文档可以属于多个模板,但一个模板中只允许定义一个文档。同样一个视也可以属于多个文档模板。
接下来看看如何在程序中得到各种对象的指针:
- 全局函数AfxGetApp可以得到CWinApp应用类指针。
- AfxGetApp()->m_pMainWnd为框架窗口指针。
- 在框架窗口中:CFrameWnd::GetActiveDocument得到当前活动文档指针。
- 在框架窗口中:CFrameWnd::GetActiveView得到当前活动视指针。
- 在视中:CView::GetDocument得到对应的文档指针。
- 在文档中:CDocument::GetFirstViewPosition,CDocument::GetNextView用来遍历所有和文档关联的视。
- 在文档中:CDocument::GetDocTemplate得到文档模板指针。
- 在多文档界面中:CMDIFrameWnd::MDIGetActive得到当前活动的MDI子窗口。
一般来说,用户输入消息(如菜单选择,鼠标,键盘等)会首先发送视,如果视未处理则会发往框架窗口。所以定义消息映射时定义在视中就可以,如果一个应用同时拥有多个视而当前活动视没有对消息进行处理则消息会发往框架窗口。
各种视类
- CView类:最基本的视类只支持最基本的操作。
- CScrollView类:提供了滚动的功能,可以利用
void CScrollView::SetScrollSizes( int nMapMode, SIZE sizeTotal, const SIZE& sizePage = sizeDefault, const SIZE& sizeLine = sizeDefault )设置滚动尺寸和坐标映射模式。但是在绘图和接收用户输入时需要对坐标进行转换。 - CFormView类:提供用户在资源文件中定义界面的能力,并可以将子窗口和变量进行绑定。通过UpdateData函数让数据在变量和子窗口间交换。
- CTreeView类:利用TreeCtrl界面作为视界面,通过调用
CTreeCtrl& CTreeView::GetTreeCtrl( ) const得到CTreeCtrl的引用。 - CListView类:利用ListCtrl界面作为视界面,通过调用
CTreeCtrl& CTreeView::GetTreeCtrl( ) const得到CListCtrl的引用。 - CEditView类:利用Edit接收用户输入,它具有输入框的一切功能。通过调用
CEdit& CEditView::GetEditCtrl( ) const得到Edit&的引用。void CEditView::SetPrinterFont( CFont* pFont )可以设置打印字体。 - CRichEditView类:作为Rich Text Edit(富文本输入)的视类,提供了可以按照格式显示文本的能力,在使用时需要CRichEditDoc的支持。
MFC---视图和窗口的更多相关文章
- VC++环境下单文档SDI与OpenGL多视图分割窗口的实现-类似3DMAX的主界面
本文主要讲述如何在VC++环境下实现单文档SDI与OpenGL多视图分割窗口,最终的界面类似3DMAX的主界面.首先给出我实现的效果图: 整个实现过程网络上有很多零散的博文,请各位自行搜索,在基于对话 ...
- [Notepad++]Notepad++怎么实现双视图/双窗口?
作为windows下非常优秀的开源代码编辑器,Notepad++是工程师必备代码编辑器.相比较之下,老一辈文本编辑器如ultraedit,editplus,就显得繁琐.冗余.疲惫.我使用过Notepa ...
- MFC程序实现窗口分割,视图快捷插入控件和插入列表
将视图中插入列表: 1.创建一个MFC应用程序,在MFC Wizard中,生成的类选项,如图 2.选择CListView作为基类 3.在CXXView.cpp(XX为你的程序名)重写虚函数OnInit ...
- MFC单文档视图拆分窗口和相关链接
第一步:准备2个视图类(如CTViewOne, CTViewTwo) 第二步:在CMainFrame类的头文件中添加数据成员变量: //MainFrm.h protected: CSplitterWn ...
- MFC文档视图中窗口切换 (2012-05-11 18:32:48)
在文档试图应用程序,有时需要在工作区切换试图,以下就是如何切换试图了 .创建要切换的视图类,同时把构造函数,Create函数改变为public .在需要切换试图的动作响应中,加入切换代码,一般是在CM ...
- MFC视图切换大全总结
单纯视图之间的切换 单文档多视图切换是我在学习MFC中遇到的一个老大难问题,在今天总算是一一破解了.我觉得视图切换分为三个等级,第一是在未切分窗格的情况下切换视图类:第二是在分割窗格的一个窗格内实行视 ...
- Cocos2d-X 2.2嵌入MFC的子窗口
1.在cocos2dx目录下创建基于对话框的MFC工程,对话框中间放一个Picture控件 2.添加cocos2dx的相关头文件包含路径.库包含路径和依赖项,可以参考其他cocos工程设置 3.选中P ...
- MFC获取各窗口指针句柄
MFC在很多的对话框操作中,我们经常要用到在一个对话框中调用另一个对话框的函数或变量.可以用如下方法来解决. HWND hWnd=::FindWindow(NULL,_T("Sphere ...
- 学习:简单使用MFC创建对话框窗口
MFC介绍:微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows ...
- MFC之拆分窗口
7.3.1 多视图 许多文档只要求单个视图,但每个文档可支持一个以上的视图.为了帮助编程人员实现多个视图,文档对象保留它的视图列表.为添加和移去视图提供成员函数,例如,提供的UpdateAllView ...
随机推荐
- 人生苦短,我用JRebel
昨天看到团子推送的一篇关于热部署的文章,其中介绍了自研的Sonic插件在公司内部的应用.同时晒出来一张对比图: 团子表示我们的插件要比同类插件优秀哦.不过我定睛一看,好家伙,第一列的JRebel在图中 ...
- ArcMap操作随记(2)
1.空间校正 变换-仿射 仅发生偏移 橡皮页变化 形状改变 变换-投影 旋转,改变角度 变换-相似 改变大小.形状不变 2.计算行列号 Int(([POINT_Y]-1273.143242)/30)+ ...
- 阿里云服务器搭建vulhub靶场
阿里云服务器搭建vulhub靶场 环境 服务器:阿里云服务器 系统:centos7 应用:vulhub 步骤 vulhub需要依赖docker搭建,首先安装docker. 使用以下方法之一: # cu ...
- 阿里一面,说说你对Mysql死锁的理解
又到了金三银四的时候,大家都按耐不住内心的躁动,我在这里给大家分享下之前面试中遇到的一个知识点(死锁问题),如有不足,欢迎大佬们指点指点. 1.什么是死锁? 死锁指的是在两个或两个以上不同的进程或线程 ...
- 74CMS 3.4 反射型XSS漏洞
一. 启动环境 1.双击运行桌面phpstudy.exe软件 2.点击启动按钮,启动服务器环境 二.代码审计 1.双击启动桌面Seay源代码审计系统软件 2.因为74CMS3.4源代码编辑使用GBK编 ...
- unicode decode error解决办法
在使用flask编写博客程序时候,遇到了这个错误. 解决办法如下 添加如下代码 from flask import Flask, render_template import sys reload(s ...
- Excel批量转Word
平时的工作中,尤其是一些文职类工作中,常会遇到这样的问题: 我们有一个Excel文件,每一行都是一个人的信息,需要将每个人的信息填写到Word表格中:一个人,一张表,一个下午,真烦恼. 也是奇想突发, ...
- uoj450 【集训队作业2018】复读机(生成函数,单位根反演)
uoj450 [集训队作业2018]复读机(生成函数,单位根反演) uoj 题解时间 首先直接搞出单个复读机的生成函数 $ \sum\limits_{ i = 0 }^{ k } [ d | i ] ...
- 羽夏看Win系统内核——结语
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- 转:C++经典排序算法总结
转载至:https://www.cnblogs.com/fnlingnzb-learner/p/9374732.html 一.算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 非线性时间比 ...