MFC六大机制(二)窗口创建机制

首先,是创建自己定义的框架窗口类的对象,通过框架窗口类对象调用成员虚函数Create。

Create函数主要做了三件事:

1、在创建窗口前,先注册窗口,由于在之前窗口类名还是空的,但是,必须要指明到底是基于哪一类窗口的,所以要在注册窗口前指明,这里就是用了一个全局变量,其实就是一个字符串给它赋值,还有一点比较重要的是,在注册窗口时,窗口处理函数只被赋了默认窗口处理函数,学过WIN32的人都知道,这肯定不行的,至少关闭窗口时,是退不出程序的,要自己自定义窗口处理函数进行处理。不用着急,估计它后面肯定会对它进行修改的,至于哪里进行修改,我们拭目以待。好了,注册完窗口后,别忘了创建窗口时,窗口类名也不能为空,因此,也做了同样的操作,给一个字符串它。

2、埋下一个钩子,这个钩子是针对WM_CREATE消息的,WIN32 API 为SetWindowHookEx,它的第一个参数为WH_CBI,表示勾的是WM_CREATE消息,那么它的钩子处理函数的第一个参数就跟它对应,是HCBT_CREATEWND。

然后呢,就把自己创建的框架窗口类对象地址存放到当前程序线程信息的一个成员里面。

3、创建窗口,在调用WIN 32 的创建窗口函数时,就会产生一个WM_CREATE消息,之前埋下的那个钩子就发挥作用了,就会把这个WM_CREATE消息勾走,就马上调用自定义的钩子处理函数了。在这钩子处理函数里,主要做了两件事:第一,就是框架窗口类对象和窗口句柄的绑定,从这里看出,用对象来表示窗口有多么的扯淡,唯一标识窗口的最终还是句柄。那么它是如何绑定的呢?在钩子处理函数的参数中,钩子码是HCBT_CREATEWND,那么wParam就是刚刚创建成功的窗口句柄,就这样窗口句柄就拿到了,然后就把这个句柄存放到框架窗口类对象的一个成员m_hWnd中,那么现在就可以通过对象来得到句柄了,但是从句柄拿到对象就不行了,那么,是怎么做到这一步呢,我们往下看,MFC中,首先创建一个映射类对象,把这个对象地址存放到当前程序线程状态信息的一个成员里面,然后把它(映射类对象地址)取出来,通过它来调用映射类的一个成员函数SetPermanent,这个函数主要是通过下标访问元素的方式来实现句柄找对象(m_permanentMap[(LPVOID)h] = permOb;)。第二,就是处理函数的修改,就是在这里做的,主要通过调用WIN 32 的API   SetWindowLong(hWnd, GWL_WNDPROC,(DWORD)afxWndProc);来进行修改的。

好了,到这里,窗口创建机制的大致过程已经告一段落了。

最后,我要说的是,希望想学MFC的你要学会使用调试工具,要多调试,只有多调试,才能逐渐的明白里面的原理,才能弄明白其中的奥妙,当你明白了,MFC就那么回事,已经不再是那么的神奇,那么的蛋疼了。

posted @ 2014-01-06 00:04  the beginner of C++  阅读(922)  评论(0编辑  收藏  举报