学习笔记之深入浅出MFC 第2讲 窗口类注册与窗口的诞生
来源:互联网 发布:淘宝申请客服介入 编辑:程序博客网 时间:2024/05/08 04:15
我们知道,MFC应用程序的所有操作都是在一个窗口平台进行的。所以,在一开始,Windows程序必须做一些初始化的工作,就是产生应用程序工作的这个舞台----窗口。在本次笔记中,我们就总结一下窗口是怎么创建的。
Windows窗口的功能我们都有些了解了,大致可以分为两大类:窗口的属性和窗口的行为。所谓的窗口的属性,主要是指窗口的外貌,比如窗口的边框、颜色、标题、位置等等;而窗口接受消息后的反应就是其行为(具体就是指窗口函数本身)。在创建窗口时首先必须利用API函数RegisterClass设定属性(即注册窗口类),然后用CreateWindow创建窗口。
窗口类牵扯的范围很广,具体的窗口创建过程如下图所示:
具体的流程是这样的:
当Windows的外壳“shell”(文件管理器或资源管理器)侦测到使用者意欲执行一个Windows程序,于是调用加载器把该程序加载,然后调用Cstartup code,后者再调用WinMain,开始执行程序。WinMain的四个参数由操作系统传递进来。
在WinMain函数中,主要实现三个工作,分别是窗口的注册(RegisterClass)、窗口的创建(CreateWindow)和消息的传递工作。其中,RegisterClass被封装在InitApplication函数之中,CreateWindow被封装在InitInstance函数之中。
下面我们分别来看一下封装有RegisterWindow和CreateWindow这两个函数的函数都包括哪些内容。
1、封装有注册窗口类InitApplication函数
从上面代码可以看到,首先定义一个大的窗口类的结构体,其中存放这各种窗口的属性信息,并且在wc.lpfnWndProc中指明了窗口函数WndProc。然后就是使用RegisterClass(&wc)完成窗口的注册并返回注册结果。
2、封装有创建窗口类的InitInstance函数
这个函数中主要包括三个部分,分别是创建窗口函数CreateWindow、显示窗口函数ShowWindow和更新窗口函数UpdateWindow。注意,CreateWindow只产生窗口,并不显示窗口,所以稍后我们必须利用ShowWindow将它显示在屏幕上。而且我们希望先传送一个WM_PAINT给窗口,以驱动窗口的绘图操作,所以调用UpdateWindow。
此处关于两个函数(InitApplication和InitInstance)的名称的意义有必要说明一下:
窗口类只需注册一次,即可供同一程序的后续每一个实例(instance)使用,所以我们把RegisterClass这个操作安排在“只有第一个实例才会进入”的InitApplication函数中。产生窗口,是每一个实例(instance)都得进行的操作,所以我们把CreateWindow这个操作安排在任何实例都会进入的InitInstance函数中。这个地方如果使用过MFC创建过软件的朋友会有体会,在MFC中会有一个CWinApp文件和DLG文件,而initApplication函数就放在CWinApp中,InitInstance放在DLG文件中,窗口文件DLG可以创建多个,但是应用文件APP只有一个。
WinMain函数中除了注册窗口、创建窗口之外,还有一个消息循环的部分,可以说到上两步已经完成了窗口属性的操作,接下来消息循环就是针对窗口的动作的设置了。
下一节我们主要讲解消息循环。
- 学习笔记之深入浅出MFC 第2讲 窗口类注册与窗口的诞生
- 深入浅出MFC:窗口类的注册与窗口的诞生
- 窗口类之注册与窗口之诞生
- 窗口类之注册与窗口之诞生
- MFC 窗口类的诞生
- VC窗口类注册与诞生
- 学习笔记之深入浅出MFC 第3讲 消息循环
- MFC注册窗口类
- MFC程序开发-窗口的诞生
- MFC学习之第五天 异形窗口
- 学习笔记之深入浅出MFC 第5章 Windows程序的生与死
- 窗口类的诞生(注册自己的窗口类一)
- 窗口类的诞生(注册自己的窗口类二)
- MFC学习笔记之窗口刷新的步骤
- MFC笔记:主窗口与副窗口
- 《深入浅出MFC》——窗口的生命周期
- MFC程序对win32的封装总结(窗口类的注册,窗口的创建,窗口的窗口过程指定)
- MFC小笔记之窗口
- Spring IllegalArgumentException 异常
- Git在Windows下搭建本地远程仓库及一些问题小结
- 证明:gcd(m,n)=gcd(n mod m,m)成立,m,n为正整数,m>0. 【Euclid算法证明】
- 静态变量static和extern外引用
- dota百大定理
- 学习笔记之深入浅出MFC 第2讲 窗口类注册与窗口的诞生
- angular-ng-repeat不允许collection中存在两个相同Id的对象
- [疯狂Java]JDBC:ResultSet的升级RowSet、离线的CachedRowSet、离线分页查询
- android bitmap compress
- POJ | 1331 Multiply进制转换
- Android NDK学习教程(一)--第一个NDK程序
- 北邮OJ 1010. 16校赛-Binary Strings
- C#获取当前user的documents目录
- ICPCCamp 2016 Day 3 - F Similar Subsequence (dp)