视类窗口

  • 视类窗口是指程序运行后,显示信息的那一部分。对应的类是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的支持。

最新文章

  1. FusionCharts参数说明 (中文)
  2. VclZip压缩文件夹
  3. 关于win10安装VisualSVN遇到的一个问题及解决办法
  4. VBA基础知识———常用语句
  5. 从mina中学习超时程序编写
  6. python2与python3的不兼容_urllib2
  7. JAVA基础---编码解码
  8. Android快速开发常用知识点系列目录
  9. angularjs i18n
  10. python学习笔记:1.初识python
  11. Oracle列转行函数版本不兼容解决方案
  12. Django | 页面数据的缓存与使用
  13. Linux JDK Tomcat Nginx MariaDB 安装,Nginx 多域名转发配置
  14. EventBus结合rxjava2和retrofit2网络获取
  15. [PC]两个蓝牙耳机同时输出相同音源
  16. bzoj 1420 Discrete Root - 原根 - exgcd - BSGS
  17. LoveIsIntheAir模板换背景
  18. 第四章 Spring.Net 如何管理您的类___统一资源访问接口
  19. 使用NPM在项目中引入【lodash】
  20. ffmpeg测试程序

热门文章

  1. iCloud开发: key-value Storage,CloudKit,iCloud Documents
  2. Ubuntu系统中防火墙的使用和开放端口
  3. rancher更新集群证书
  4. [SPDK/NVMe存储技术分析]005 - DPDK概述
  5. CVE-2017-7269(IIS远程代码执行)
  6. python溴事百科爬虫
  7. 什么是B树(B-树)?
  8. jQuery--基本事件总结
  9. java-servlet-cookie&sessions
  10. centos云服务器配置redis外网可访问