跟框架机制一样 也是寻寻觅觅了很久。。到最后知道的真想骂一句:低俗。。
现在说机制吧。。有个虚函数GetMessageMap在
CWnd和CCmdTarget都有定义(利用DECLARE_MESSAGE_MAP())。
和一个非虚函数GetThisMessageMap。
大家都还记得BEGIN_MESSAGE_MAP(theClass, baseClass)这个宏吧。。
example:我定义了一个类CXXOO继承CWnd。打算重写OnCreate(处理wm_create消息),那么就需要在类声明处放置DECLARE_MESSAGE_MAP(),定义处放置BEGIN_MESSAGE_MAP(CXXOO, CWnd)和END_MESSAGE_MAP(),把ON_WM_CREATE()
放置在2个宏中间 以上都是废话~~
example2:未重写~~
好,现在要处理了wm_create了。如example调用GetMessageMap时会调用CXXOO重写的那个,然后在theClass:: GetThisMessageMap的一个静态数组_messageEntries中找到了wm_create,继而调用你重写的OnCreate。如example2调用GetMessageMap依然调用CXXOO重写的,但确找不到,那就去找baseClass:: GetThisMessageMap中的那个静态数组,按继承图从下往上。(CCmdTarget应该没怎么定义,大部分的映射项应该都放在CWnd里。)
但微软在MFC里面加了个缓存机制,这是我们用win32API编写Windows程序时不会写的。。有机会再看那个怎么实现的吧就这样了。。