最近觉得需要总结一些东西,所以有空看到好的文章,自己有好的思路准备写出来和收藏起来。供大家学习
可以说这个是MFC基础,但是也是学习C++的一部分。
首先看一张图:
程序进入主函数---->注册窗口类(RegisterClass)--->创建窗口(CreateWindow)---->抓取消息并安排分发给相应的窗口函数(GetMessage那个循环)----->写一个处理所有消息和命令的窗口函数WNDPRO()
下面看更详细的一个图,详细到各个函数。
看看这几个函数是怎么写的:
------------------------------------------------------------------------
程序进入主函数---->注册窗口类(RegisterClass)--->创建窗口(CreateWindow)---->抓取消息并安排分发给相应的窗口函
数(GetMessage那个循环)----->写一个处理所有消息和命令的窗口函数WNDPRO()
////
一个差不多完整的窗口消息机制就这样了!
但是在MFC中我们把这些函数封装了起来,注意!它对win32那些起相应功能的部分并不是僵硬的封装,首先强调这一点!GetMssage()和TranslateMessage()封装到了CWinApp中,这个类负责程序的初始化运行和结束,将RegisterClass放在了InitApplication函数中。将CreateWindow放在了InitInstance中,这是两个函数都是虚函数,其中initInstance是个空的虚函数,必须要重载,所以在我们自己程序的App文件中都重写了initInstance这个函数,当然我们说了这个并不是僵硬的封装,我们在这个函数中不像在win32程序中用createwindow()创建主窗口而是直接利用封装好了的类创建想要的种类的主窗口,比如常用的初始化CFrameWnd类的对象,当然我们也可以创建CDloalg类的对象,这些窗口都是派生于基类CWnd,初始化这些类的一个实例就会调用他们的create函数,在这个函数产生窗口之前会引发注册注册Wind这个窗口类型以及它的窗口过程,然后创建这个注册好类型的一个窗口。我只是大致的说一下这个过程,以便wind32中窗口注册创建流程对应,实际在mfc中这个流程的的情况要复杂的很多,我说的只是大致的,详细的去读深入浅出。
InitApplication在每个程序中只运行一次做一次,我们的窗口类只用注册一次所以把它放在里面
InitInstance 每一个这个类的实例都会运行一次,我们每一个窗口都需要创建所以.....
注:MFC中每一个程序都有一个AP类文件CMyApp,它们都是派生自CWinApp,在这个类中中它调用了InitApplication和InitInstance两个虚函数.由于每一个窗口初始化方式都可能不同,所以我们在自己的App文件CMyApp,都会重载InitInstance函数来初始化自己的窗口,这样基类中调InitInstance()其实是调用用户自己重载的那个初始化函数。所以我们的每个窗口就不一样了。这就是虚函数的多样性。可以去看深入潜出mfc中MFC六大关键技术仿真那章,写得非常好!
注:上面的GetMssage()和TranslateMessage()这些抓取和分派消息的函数被封装到了CWinApp类的Run函数中。
注:CWnd类作为所有窗口类的基类,里面封装了创建窗口的函数(窗口类用的是注册了的Wnd),也封装了窗口过程函数WindowProc和DefWindowProc,当消息出发时消息被捕捉然后被发送到WindowProc中(前面的流程略,可以看看AfxWndProc这个函数),如果定义了messagemap(BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间的东西,WindowProc这个函数就会让OnWndMsg()这个函数去处理,去找消息对应的函数。如果不是就让系统默认的DefWindowProc去处理。所以我们在遇到没有在消息影射宏里进行映射并且在DefWindowProc函数中没有的情况下就重写他的窗口过程自己进行消息的捕捉和处理,最好重载DefWindowProc这个函数,否则那个messagemap就没什么用了,要在这个函数中自己接收消息然后指定给它处理函数才行。因为重写的这个函数中没有OnWndMsg这个函数。
By the way!消息触发被发现并发送到该类时寻找该类的窗口过程,如果类中没有就去寻找上层类的,一层一层,如果都没进行重写那就找到了CWnd的WindowProc中。虚函数就是有用!
MFC程序对win32的封装总结(窗口类的注册,窗口的创建,窗口的窗口过程指定) 这篇文章中我会告诉说明MFC中是如何把这win32程序的几个关键函数封装到它的框架里的。
想更了解MFC对win32的封装可以查看深入浅出mfc,可以着重看一下第六章,或者进入这个网址:
http://www.vczx.com/tutorial/mfc/mfc1.php和
http://www.diybl.com/course/3_program/vc/vc_js/2008520/117199.html
我觉得这篇文章很不错,虽然有些地方还不够深入,但是对于一些MFC初学者还是挺有帮助的。