MFC之旅——分析一个MFC程序运行脉络

之前学过的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一样。只是为了封装。。。导致这个深入学习过程非常麻烦。(所以封装也是有好有坏处的)

对于封装度。我个人觉得学习时最好是去使用封装度比较低的。。。这样能学到更多,更能学到一些代码编写上的精华。带给大家更多灵感。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值