这一章开始进入MFC的世界了,以一个Wizard生成的单文档类型工程为例,将MFC程序的基本框架进行了剖析,让我们看到了WIN32的影子。

新建立的单文档类型工程Test,包括如下几个类(继承关系也一并列出):

CTestApp----从CWinApp---CWinThread---CCmdTarget---Cobject继承而来,代表应用本身

CAboutDlg----CDialog---CWnd---CCmdTarget---Cobject,帮助对话框

CMainFrame----CFrameWnd---CWnd---CCmdTarget---Cobject 框架类,主窗口(窗口、菜单、工具栏、状态栏)

CTestView---CView---CWnd---CCmdTarget---Cobject 视类,用于数据的显示,外部输入的响应

CTestDoc---CDocument---CCmdTarget---Cobject 数据,在MFC里Document就是数据的意思,MVC的思想是将数据本身与数据的显示分离开来,CView用于数据的显示。CFrameWnd\CView\CDocument组成了文档三人组,在多文档应用里,每打开一个文档即会创建一个三人组。

在工程里,我们没法直接找到WinMain的身影,这是因为这部分对于所有APP都是一样的,FrameWork当然代劳之,在连接阶段将完成WinMain的加入。下面是该MFC程序的生死流程:

在工程里,我们发现有一个很重要的全局变量CTestApp theApp,全局变量的构造必然在main函数执行之前,在其基类CWinApp的构造函数里有如下这句:

CWinApp::CWinApp()

{

......

AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();

pModuleState->m_pCurrentWinApp = this;

}

这里便将我们定义的对象CTestApp交给了FrameWork了。

在WinMain中我们会看到如下代码(为了便于理解,稍做了修改)

int AFXAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLint, int nCmdShow)

{

......

CWinApp *pApp = AfxGetApp(); //Get the point of theApp object

pApp->InitInstance(); //InitInstance is virtual func, so

return(pApp->Run());

}

注意到虚函数InitInstance,我们之前WIN32程序里的一系列动作(设计窗口类、注册、创建窗口、显示、更新、消息循环)都蕴含其中。

在InitInstance中有如下关键代码:

BOOL CTestApp::InitInstance()
{
<span style="white-space:pre"> </span>......// Register the application's document templates.  Document templates//  serve as the connection between documents, frame windows and views.CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CTestDoc),RUNTIME_CLASS(CMainFrame),       // main SDI frame windowRUNTIME_CLASS(CTestView));AddDocTemplate(pDocTemplate);// The one and only window has been initialized, so show and update it.m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();return TRUE;
}

这里使用了MFC的“动态创建”技术来创建三人组对象,并使用CSingleDocTemple管理三者。有了窗口类对象才有窗口一说,切勿本末倒置。接下来进入“设计、注册窗口类以及创建窗口”的环节,在第一章WIN32编程里,我们不是还需要指定窗口类名称么,这里怎么没有传递该信息进去?对于单文档类型这种已知的窗口类型,MFC当然知道。

m_pMainWnd指向的是主窗口对象,View窗口是其子窗口。

pApp->Run其实就是我们的消息循环了。

若我们未对主窗口、视类窗口的窗口过程函数进行修改,那么MFC会调用其默认的。但实际情况,我们程序员的主要职责便是改写窗口过程函数。

至此,这便是一个MFC程序的典型框架。

接下来看一些细枝末节的东西:

(1)在CTestApp中响应来自菜单ID_APP_ABOUT的命令消息,所有继承自CCmdTarget的类均可以响应命令消息。

(2)在CTestDoc中有一个Serialize的虚函数,该函数用于文档的“读写”,这里的读写是针对对象级的,读取时可以使用MFC的动态创建技术实现对象的恢复。

本章的最后举了一个在主窗口、视类窗口显示一个按钮的例子,用于说明主窗口的工作区以及主窗口、视类窗口之间的关系。CButton m_btn是谁的成员不重要,重要的是调用其Create时,使用的父窗口是谁。

int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CView::OnCreate(lpCreateStruct) == -1)return -1;// TODO: Add your specialized creation code herem_btn.Create("按钮",WS_CHILD | BS_DEFPUSHBUTTON,CRect(0,0,100,100),GetParent(),123);
//  m_btn.Create("按钮",WS_CHILD | BS_DEFPUSHBUTTON,CRect(0,0,100,100),this,123);m_btn.ShowWindow(SW_SHOWNORMAL);return 0;
}

《VC++深入详解》第三章相关推荐

  1. 第三章 UT单元测试——CPU与内存使用率限制

    系列文章目录 第一章 UT单元测试--GoogleTest通用构建说明 第二章 UT单元测试--GTest框架实例 第三章 UT单元测试--CPU与内存使用率限制 文章目录 系列文章目录 前言 一.环 ...

  2. 慕课软件质量保证与测试(第三章.单元测试)

    慕课金陵科技学院.软件质量保证与测试.第三章.黑盒测试.单元测试 0 目录 3 黑盒测试 3.9 单元测试 3.9.1课堂重点 3.9.2测试与作业 4 下一章 0 目录 3 黑盒测试 3.9 单元测 ...

  3. 《构建之法》前三章读后感

    通过第一章讲述的概论,理解到软件工程到底是什么,又为何要叫软件工程,他对我们的生活又有什么影响. 通过一些实例我也认识到客户需求分析的重要,就阿超那样的四则运算一样,渐渐的功能和需求就多了. 在第二章 ...

  4. 走向.NET架构设计—第三章—分层设计,初涉架构(后篇)

    走向.NET架构设计-第三章-分层设计,初涉架构(后篇) 前言:本篇主要是接着前两篇文章继续讲述! 本篇的议题如下: 4. 数据访问层设计 5. 显示层设计 6. UI层设计   4.  数据访问层设 ...

  5. 软考中项第三章 信息系统集成专业知识

    第三章 信息系统集成专业知识 信息系统的生命周期可以分为立项.开发.运维及消亡四个阶段 立项阶段:概念阶段或需求阶段,这一阶段根据用户业务发展和经营管理的需要,提出建设信息系统的初步构想,然后对企业信 ...

  6. 构建之法前三章读后感—软件工程

    本教材不同于其他教材一贯的理知识直接灌溉,而是以对话形式向我们传授知识的,以使我们更好地理解知识点,更加清晰明确. 第一章 第一章的概述中,书本以多种方式,形象生动地向我们阐述了软件工程的内容,也让我 ...

  7. 关于对《Spring Security3》翻译 (第一章 - 第三章)

    原文:http://lengyun3566.iteye.com/category/153689?page=2 翻译说明 最近阅读了<Spring Security3>一书,颇有收获(封面见 ...

  8. C++ API 设计 08 第三章 模式

    第三章 模式 前一章所讨论的品质是用来区分设计良好和糟糕的API.在接下来的几个章节将重点关注构建高品质的API的技术和原则.这个特殊的章节将涵盖一些有用的设计模式和C++ API设计的相关习惯用法. ...

  9. 敏捷整洁之道 -- 第三章 业务实践

    敏捷整洁之道 -- 第三章 业务实践 0. 引子 1. 计划游戏 1.1 三元分析 1.2 故事和点数 1.3 故事 1.4 故事估算 1.5 对迭代进行管理 1.6 速率 2. 小步发布 3. 验收 ...

  10. 第三章 信息系统集成专业技术知识

    第三章 信息系统集成专业技术知识 知识点 1.信息系统的生命周期有哪几个过程 2.信息系统开发的方法有几种:各种用于什么情况的项目. 3.软件需求的定义及分类: 4.软件设计的基本原则是什么: 5.软 ...

最新文章

  1. More than Moore的探索
  2. linux 插件 概念,服务端概念功能介绍
  3. 《剑指offer》第四题(二维数组中的查找)
  4. Request_获取请求行数据_方法介绍
  5. queue double java_一文弄懂java中的Queue家族
  6. eclipse中安装spring Tool自动补全插件,命名空间
  7. React组件复用的方式
  8. 【Java数据结构】栈和队列
  9. 渗透测试实践(工具使用总结)
  10. 配置eclipse编写html/js/css/jsp/java时自动提示
  11. 蓝桥杯2013c++真题:排它平方数
  12. 传智播客 C/C++学习笔记 在向指针所指空间copy数值,要分配内存
  13. linux下安装zmap和zgrab
  14. 特殊字符保存到SQL数据库的问题
  15. MySQL自增id溢出
  16. VM虚拟机安装及使用
  17. 按揭月供计算器(等额本息)
  18. VideoProc for Mac(全能影片处理软件)
  19. MySQL数据库企业级开发技术
  20. linux设备驱动之pci设备的I/O和内存

热门文章

  1. php计算两个坐标(经度,纬度)之间的方位角
  2. 闰年计算-第13届蓝桥杯Scratch选拔赛真题精选
  3. 批处理之批量修改文件扩展名
  4. 小程序swiper 自定义样式修改
  5. 系分 - 案例分析 - 需求分析
  6. 大整数乘法(Karatsuba算法的字符串形式的C++实现)
  7. Android调用高德地图直接导航的简单实例
  8. 2018字节跳动(今日头条那个)一面凉经
  9. 基于Python的微信朋友圈数据可视化分析之地点
  10. with open和open