1.3.1 应用程序对象

MFC应用程序的核心就是基于CWinApp类的应用程序对象,CWinApp提供了消息循环来检索消息并将消息调度给应用程序的窗口。当包含头文件<afxwin.h>,可以将CWinApp以及其它MFC类引入程序。一个MFC应用程序有且只有一个应用程序对象,此对象必须声明为全局范围内有效,以便在程序的开始即被实例化。

应用程序类被命名为CMyApp,其实例化为:

 CMyApp myapp;

CMyApp

CMyApp继承CWinApp,且没有声明任何数据成员,只是覆盖了一个从CWinApp类中继承来的函数InitInstance,InitInstance在应用程序创建之后、窗口创建之前被调用。事实上,最小的MFC应用程序也必须从CWinApp派生出一个类并覆盖CWinApp::InitInstance创建一个窗口

InitInstance

InitInstance为虚函数,默认操作仅包含一个返回值,其目的是为应用程序提供一个自身初始化的机会,InitInstance是执行程序每次开始时都需要进行初始化工作的最好地方。例如本例程的初始化如下:

 BOOL CMyApp::InitInstance()

 {
m_pMainWnd = new CMainWindow; m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE;
}

CMyApp::InitInstance

构造一个CMainWindow(CFrameWndàCMainWindow)对象,并将其地址复制到应用程序对象的m_pMainWnd数据成员中。在窗口创建之后,InitInstance通过CMainWindow指针调用ShowWindow和UpdateWindow来显示该窗口。ShowWindow和UpdateWindow是所有窗口对象共用的CWnd的成员函数。

ShowWindow

 BOOL ShowWindow( int nCmdShow )

ShowWindow

如果窗口原来可见,则返回非零值;如果CWnd原来是隐藏的,则返回0

根据Windows程序设计协议,应用程序将存储在应用程序对象的m_nCmdShow的变量传递给WinMain的nCmdShow参数,nCmdShow值通常为SW_SHOWNORMAL。

UpdateWindow

UpdateWindow立即重新绘制窗口来完成ShowWindow启动的作业,工作完成后,InitInstance返回TRUE以便应用程序继续运行。

其它CWinApp可覆盖函数

我们现在知道InitInstance是能够被覆盖的CWinApp成员函数之一,可以通过它来定义应用程序对象的操作,下面我们查看一下CWinApp有多少可以被覆盖的成员函数,如下图:

即使是被定义成可覆盖函数,但是诸如WinHelp和ProcessWndProException这样的函数。例如:我使用ExitInstance在应用程序终止后清屏,如果使用InitInstance分配了内存或其它资源,ExitInstance将是释放资源的绝佳的地方。ExitInstance默认操作是做一些框架结果要求的清除事务,如果覆盖了它就必须确保要调用基类版本。

MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(02)的更多相关文章

  1. MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(03)

    1.3.2 MFC如何使用应用程序对象 MFC程序没有main函数,没有WinMain函数,到底是什么启动了程序的运行? 一个MFC提供的源代码中(Winmain.cpp)包含了一个AfxWinMai ...

  2. 我的第一个MFC的ArcGIS Engine程序

    原文 http://blog.csdn.net/zzahkj/article/details/9003518 (第一版,以VC++6.0+AE9.3为例) 首次,学习MFC,写个笔记,MFC还是挺好学 ...

  3. MFC通过ODBC连接mysql(使用VS2012编写MFC)

    原创文章,转载请注明原文:MFC通过ODBC连接mysql(使用VS2012编写MFC) By Lucio.Yang 1.ODBC连接mysql 首先ODBC是什么呢? 开放数据库互连(Open Da ...

  4. visual2017专业版MFC编程环境搭建及第一个MFC程序的创建

    1.MFC介绍及环境搭建 MFC全程为Microsoft Foundation class Library,即微软的基本类库,MFC实际上是一个庞大的文件库,它由指向文件和源文件组成. 首先,打开vi ...

  5. MFC (如何通过点击botton打开一个文件夹/文件)

    1.建一个MFC的工程,类型为基于对话框.在工具箱里拖进去一个button按键,如下图. 2.双击button1按键就可以进入到点击button1后要执行操作的代码,编写如下代码实现网页/文件夹或者文 ...

  6. 第一个c程序和vs2017 在打开MFC rc文件时找不到rcdll.dl

    第一个c程序 #include<stdio.h> int main() { ; ; printf_s("请输入两个数字:"); scanf_s("%d,%d& ...

  7. 第一个MFC实例:计算圆周长和圆面积

    一.基于Microsoft MFC的编程方法 MFC是微软基础类库(Microsoft Foundation Class)的缩写.与API不同,MFC不是Windows操作系统的组成部分,而是微软公司 ...

  8. MFC小程序02————— 不规则窗体小应用程序

    什么不说了.先上程序截图: 执行结果是有一棵有星星在闪烁的圣诞树.还会循环播放背景音乐. 之前也是在网上看到类似的一个程序.然后自己近期也在学MFC.所以就模仿着写了一个, 当中使用的是GDI+来显示 ...

  9. fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC

    出现如下错误: fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires ...

随机推荐

  1. Openstack+Kubernetes+Docker微服务实践之路--服务发布

    结合上文,我们的服务已经可以正常运行了,但它的访问方式只能通过服务器IP加上端口来访问,如何通过域名的方式来访问到我们服务,本来想使用Kubernetes的Ingress来做,折腾一天感觉比较麻烦,I ...

  2. phpstorm 设置Utf8编码

    点击file 再点击setting 找到file Encoding gbk改成utf-8就ok了

  3. javascript高级编程3第三章:基本概念 本章内容 语法 数据类型 流控制语句 函数

    3.1 语法 ECMAScript的语法大量借鉴了C及其他类C语言的语法. 3.1.1 区分大小写 3.1.2 标识符 所谓标识符,就是值变量.函数.属性的名字,或者函数的参数.标识符可以是按照下列格 ...

  4. MemCache缓存multiget hole详解

    multiget 是什么 multiget 指的是从 memcache(或其他分布式缓存) 一次性获得多个键值,一般由 memcached client 自行实现. multiget hole是什么 ...

  5. physx之刚体运动

    [线性速度与角速度] PxRigidBody的速度由线性速度和角速度构成, 可以分别通过setLinearVelocity和setAngularVelocity进行设置.需要注意的是, 刚体的角速度总 ...

  6. Sql获取周、月、年的首尾时间。

    ,) -- 本周周一 ,,,)) -- 本周周末 ,) -- 本月月初 ,,,)) -- 本月月末 ,,) -- 上月月初 ,,)) -- 上月月末 ,) -- 本年年初 ,,,)) -- 本年年末 ...

  7. Numpy Study 2----* dot multiply区别

    使用numpy时,跟matlab不同: 1.* dot() multiply() 对于array来说,* 和 dot()运算不同 *是每个元素对应相乘 dot()是矩阵乘法 对于matrix来说,* ...

  8. 改造laravel的登录流程,仅使用一个token登录laravel

    背景:最近使用lavavel来改造目前的系统,但是之前的老系统还不能立马下线,这时就出现了双系统共存的状态,需要解决的一个问题就是一次登录2个系统. 第一步 修改中间件App\Http\Middlew ...

  9. 对Android开发者有益的40条优化建议

    下面是开始Android编程的好方法: 找一些与你想做事情类似的代码 调整它,尝试让它做你像做的事情 经历问题 使用StackOverflow解决问题 对每个你像添加的特征重复上述过程.这种方法能够激 ...

  10. 比较ID和Name

    早期的HTML使用name(名称)属性来标示每个元素,但考虑到名称会存在重复性,所以从HTML4版本开始W3C就不再使用name属性,而是使用ID作为元素的唯一标识符,但在某一反面依旧使用,如常用的: ...