MFC学习(二)
WinApp封装了程序的主入口WinMain,WinMain就和C语言的main函数地位一样,是Win32程序的入口。在MFC的封装中,一个程序启动,Windows调用WinMain,这个WinMain函数现在由MFC事先写好藏好了,你不能也不需要修改,在这个预定义的WInMain里面会调用CWinApp的IniInInstance函数。在InitInstance函数,CMainFrame的对象被创建,文档模板被创建,主窗口通过ShowWindow(SW_SHOW)被显示出来。
CMainFrame是个框架,是你整个应用程序的主窗口,负责管理应用程序的菜单,工具栏,状态栏等。中间的区域是客户区,由View类来管理,View类也是一个窗口,是MainFrame的子窗口。OnDraw函数负责绘制客户区的内容,你调用View类的UpdateWindow,或者在Document类中调用UPdateAllViews等等,MFC会自动调用OnDraw。他还会被Window调用,Windows在需要刷新窗口的时候发送给窗口WM_PAINT消息,MFC事先预定义了,在响应WM_PAINT消息的时候会调用OnDraw。 那么什么时候窗口会发送WM_PAINT消息呢,比如窗口从最小化还原,比如窗口被用户改变了大小等等。
程序在进入WinMain函数之前做很多事情,初始化DOS头,分配函数表,初始化全局变量,之后才进入WinMain。
MFC对Windows API进行封住请。MFC编译器链接器把源文件编译成PE文件格式,存储在磁盘上。程序执行的时候,从PE文件头开始执行,在进入Winmain函数之前,进行一系列的必备的初始化。
MFC对这个过程进行封装,提供给编程人员的第一个裸露程序入口就是CWinApp的InitInstance(),其实程序的入口依然是WinMain()函数。
每个程序都有一个进程,每个进程至少有一个线程就是主线程。CWinThread类是MFC用来封装线程的。这个主线程就是在WinMain函数中创建的,包括UI线程和工作者线程。因此每个MFC程序至少使用一个CWinThread派生类。被MFC程序员熟知的CWinApp应用类就从这里派生。
InitInstance是CWinThread的一个虚函数,它是在实例创建时首先被调用的。应用程序总是要重载这个虚函数,进行系统设置,创建运行环境。主窗口一定要在InitInstance()中创建,因为该函数退出后就进入该线程的消息循环。
MFC执行流程:_tWinMain(WinMain别名)-》AfxWinMain-》初始化线程,调用InitInstance初始化窗口,调用Run函数进入消息循环。
MFC中DoDataExchange的作用:将界面上的控件与一个变量或对象关联。
MFC学习(二)的更多相关文章
- MFC 学习笔记
		MFC 学习笔记 一.MFC编程基础: 概述: 常用头文件: MFC控制台程序: MFC库程序: 规则库可以被各种程序所调用,扩展库只能被MFC程序调用. MFC窗口程序: 示例: MFC库中类的简介 ... 
- emberjs学习二(ember-data和localstorage_adapter)
		emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ... 
- ReactJS入门学习二
		ReactJS入门学习二 阅读目录 React的背景和基本原理 理解React.render() 什么是JSX? 为什么要使用JSX? JSX的语法 如何在JSX中如何使用事件 如何在JSX中如何使用 ... 
- MFC 学习之 鼠标移动到Toolbar按钮上显示提示信息(tooltip),状态栏也随之改变
		1.在ResourceView里加入Toolbar资源,命名IDR_TOOLBAR1 2.在主程序的.h文件中加入变量: CToolBar m_toolbar;CImageList ... 
- TweenMax动画库学习(二)
		目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ... 
- Hbase深入学习(二) 安装hbase
		Hbase深入学习(二) 安装hbase This guidedescribes setup of a standalone hbase instance that uses the local fi ... 
- Struts2框架学习(二) Action
		Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ... 
- Python学习二:词典基础详解
		作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ... 
- Quartz学习--二  Hello Quartz! 和源码分析
		Quartz学习--二 Hello Quartz! 和源码分析 三. Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ... 
- SpringCloud学习(二):微服务入门实战项目搭建
		一.开始使用Spring Cloud实战微服务 1.SpringCloud是什么? 云计算的解决方案?不是 SpringCloud是一个在SpringBoot的基础上构建的一个快速构建分布式系统的工具 ... 
随机推荐
- yii2:引用项目外的文件或类
			yii2:引用项目外的文件或类 以项目:frontend为例,文件目录如下: frontend/ frontend/controllers frontend/views fronte ... 
- Apache Tomcat 服务因 0 (0x0) 服务性错误而停止
			操作系统:Windows Server 2003 SP2/win7 64JDK 版本为 6.0 update 6 安装在 D:\Java 目录下Tomcat 版本为 6.0.16 安装 D:\Tomc ... 
- Xcode删除无用的Symbols信息
			open ~/Library/Developer/Xcode/iOS\ DeviceSupport 进入后对不需要的版本手动Delete. 
- xcrun: error: active developer path (/Users/XJW/Desktop/Xcode.app/Contents/Developer) does not exist, use `xcode-select --switch path/to/Xcode.app` to
			问题: 装了双xcode 删掉低版本 (注意:低版本xcode 开启过项目 ) 创建git时报错 解决方法: sudo xcode-select -switch /Applications ... 
- 剑指offer--33.丑数
			本来用数组做标志位,但是测试数据有第1500个,859963392,惹不起哦 ------------------------------------------------------------- ... 
- L144
			Puny Dwarf Planet, Named 'Goblin,' Found Far Beyond PlutoA scrawny dwarf planet nicknamed "the ... 
- PostgreSQL java读取bytes字段
			写入bytea: File img = new File("/tmp/eclipse.png"); fin = new FileInputStream(img); con = Dr ... 
- ng 自定义过滤器的创建和使用
			过滤器的本质就是一个方法,参数就是输入的值以及给过滤器指定的参数,返回值就是处理后要显示的值. ①过滤器创建var app = angular.module();app.filter(‘名称’,fun ... 
- I.MX6 recovery mode hacking
			/******************************************************************************** * I.MX6 recovery m ... 
- IOS Quartz 2D 学习(1)
			IOS提供两种创建图形的途径: 1.OpenGL. 2.Quartz.Core Animation.UIKit图形支持. UIKit的图形系统 1.视图绘画周期: DrawRect方法,在任何时候,当 ... 
