之前学过的Windows SDK编程,都在自己的一个cpp文件中,程序运行过程也是清晰易懂。但是MFC可就没那么清晰明了了。建立了一个MFC工程后,你会发现,什么WinMain,什么WndProc(不一定你要用这个名字)。都不存在的嘛。但是从本质上来说,在WIndows系统上最终,一定是SDK。MFC也就只是将SDK进行了一系列的封装。所以,WInMain这些,一定是存在的。下面就去MFC的源文件目录去探索一下MFC程序的运行过程吧!
1)一个最基本的SDK程序过程。
1>首先是进入WinMain
2>然后添加窗口类wndclass
3>RegisterClass注册窗口类
4>CreateWindow创建窗口
5>ShowWIndow显示窗口
6>UpdateWindow更新窗口
7>MSG LOOP消息循环(让系统调用对应WndProc处理消息)
2)MFC程序当然也包含这些步骤。
1>首先要找到WInMain。这个函数呢,就在MFC源文件目录的appmodul.cpp文件下面。
只是因为一个宏定义。
实际上之前我们WinMain执行的东西的东西在AfxWinMain函数中执行。
AfxWinMain函数的定义则在winmain.cpp中,正如文件名一样。它内部的代码确实是实现了WinMain中的功能呢!
实际上这两个指针是同一个地址。
(CWinApp是从CWinThread中派生出来的)
通过这里获取调用对象中成员函数的入口(对象首地址)
下面就来调用C***App类中的InitInstance()了。这里面的代码就是重点了。
先调用了基类的对应InitInstance函数。
然后会去调用
2>这个时候就进入窗口类填写和注册了。进入上面那个函数。这个函数里面,就调用了存在于wincore.cpp中的MFC的类注册封装的函数。
可以看到我们熟悉的窗口类填写。
后面还有一堆相关窗口类的注册
用这个函数进行注册。
到定义后,发现,这个函数只是对RegisterClass进行了封装
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
这里要注意了 ,那我们想修改窗口的属性怎么办呢?
在我们工程下的CMainFrame框架类中,
存在一个成员函数。
里面说明很清楚,在这里可以去定制修改窗口类。那这个修改是怎么实现的呢?很容易想到,一定是在注册之前,默认值填写完成之后。
这里的AfxDeferRegisterClass实际上是前面的类注册函数的宏定义。
(至于为什么要这样,我猜可能是不同人写的时候,名字不小心打错了吧!
3>然后是创建窗口。会通过这个成员函数来进行创建。
当然也是对CreateWindowEx进行的封装。这里我不懂的是为什么要使用Hook。而且Hook的参数既然是this指针。可能要使用这个类里面的某些信息吧。
4>显示窗口。更新窗口都在刚刚的***cpp的InitInstance函数中。
疑问:
这个ProcessShellCommand函数是CWinApp的成员函数,但是我没有在MFC的源文件目录下发现CWinApp类的定义文件。
5>剩下就是消息循环了。
在AfxWinMain中。
最后面有个Run方法。这里面应该就是消息循环了。寻找它的定义吧!搜索大法。
最终在thrdcore.cpp中找到了其定义。
上面的注释已经说明了这一点。这个for里面就是消息循环啦。
看到注释。进入看看。
继续进入。
最终在这个函数里面发现了熟悉的东西。
这样整个MFC程序的大概运行过程就出来了。还是和SDK一样。只是为了封装。。。导致这个深入学习过程非常麻烦。(所以封装也是有好有坏处的)
对于封装度。我个人觉得学习时最好是去使用封装度比较低的。。。这样能学到更多,更能学到一些代码编写上的精华。带给大家更多灵感。