《VC++深入详解》第三章
这一章开始进入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++深入详解》第三章相关推荐
- 第三章 UT单元测试——CPU与内存使用率限制
系列文章目录 第一章 UT单元测试--GoogleTest通用构建说明 第二章 UT单元测试--GTest框架实例 第三章 UT单元测试--CPU与内存使用率限制 文章目录 系列文章目录 前言 一.环 ...
- 慕课软件质量保证与测试(第三章.单元测试)
慕课金陵科技学院.软件质量保证与测试.第三章.黑盒测试.单元测试 0 目录 3 黑盒测试 3.9 单元测试 3.9.1课堂重点 3.9.2测试与作业 4 下一章 0 目录 3 黑盒测试 3.9 单元测 ...
- 《构建之法》前三章读后感
通过第一章讲述的概论,理解到软件工程到底是什么,又为何要叫软件工程,他对我们的生活又有什么影响. 通过一些实例我也认识到客户需求分析的重要,就阿超那样的四则运算一样,渐渐的功能和需求就多了. 在第二章 ...
- 走向.NET架构设计—第三章—分层设计,初涉架构(后篇)
走向.NET架构设计-第三章-分层设计,初涉架构(后篇) 前言:本篇主要是接着前两篇文章继续讲述! 本篇的议题如下: 4. 数据访问层设计 5. 显示层设计 6. UI层设计 4. 数据访问层设 ...
- 软考中项第三章 信息系统集成专业知识
第三章 信息系统集成专业知识 信息系统的生命周期可以分为立项.开发.运维及消亡四个阶段 立项阶段:概念阶段或需求阶段,这一阶段根据用户业务发展和经营管理的需要,提出建设信息系统的初步构想,然后对企业信 ...
- 构建之法前三章读后感—软件工程
本教材不同于其他教材一贯的理知识直接灌溉,而是以对话形式向我们传授知识的,以使我们更好地理解知识点,更加清晰明确. 第一章 第一章的概述中,书本以多种方式,形象生动地向我们阐述了软件工程的内容,也让我 ...
- 关于对《Spring Security3》翻译 (第一章 - 第三章)
原文:http://lengyun3566.iteye.com/category/153689?page=2 翻译说明 最近阅读了<Spring Security3>一书,颇有收获(封面见 ...
- C++ API 设计 08 第三章 模式
第三章 模式 前一章所讨论的品质是用来区分设计良好和糟糕的API.在接下来的几个章节将重点关注构建高品质的API的技术和原则.这个特殊的章节将涵盖一些有用的设计模式和C++ API设计的相关习惯用法. ...
- 敏捷整洁之道 -- 第三章 业务实践
敏捷整洁之道 -- 第三章 业务实践 0. 引子 1. 计划游戏 1.1 三元分析 1.2 故事和点数 1.3 故事 1.4 故事估算 1.5 对迭代进行管理 1.6 速率 2. 小步发布 3. 验收 ...
- 第三章 信息系统集成专业技术知识
第三章 信息系统集成专业技术知识 知识点 1.信息系统的生命周期有哪几个过程 2.信息系统开发的方法有几种:各种用于什么情况的项目. 3.软件需求的定义及分类: 4.软件设计的基本原则是什么: 5.软 ...
最新文章
- More than Moore的探索
- linux 插件 概念,服务端概念功能介绍
- 《剑指offer》第四题(二维数组中的查找)
- Request_获取请求行数据_方法介绍
- queue double java_一文弄懂java中的Queue家族
- eclipse中安装spring Tool自动补全插件,命名空间
- React组件复用的方式
- 【Java数据结构】栈和队列
- 渗透测试实践(工具使用总结)
- 配置eclipse编写html/js/css/jsp/java时自动提示
- 蓝桥杯2013c++真题:排它平方数
- 传智播客 C/C++学习笔记 在向指针所指空间copy数值,要分配内存
- linux下安装zmap和zgrab
- 特殊字符保存到SQL数据库的问题
- MySQL自增id溢出
- VM虚拟机安装及使用
- 按揭月供计算器(等额本息)
- VideoProc for Mac(全能影片处理软件)
- MySQL数据库企业级开发技术
- linux设备驱动之pci设备的I/O和内存