学习笔记之深入浅出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函数中除了注册窗口、创建窗口之外,还有一个消息循环的部分,可以说到上两步已经完成了窗口属性的操作,接下来消息循环就是针对窗口的动作的设置了。

下一节我们主要讲解消息循环。

0 0