对mfc的消息机制很不理解,花了一天时间粗看了下李久进和侯捷的深入浅出
又从网上搜了部分,http://www.cppblog.com/nacci/category/1784.html
理解和摘抄部分整理如下
1,rtti机制,这个就是每个类都定义一个静态变量,里面有父类的这个静态变量地址,然后判断是否有继承关系
就循环这判断父类的要比较的对比下就行了
BOOL CRuntimeClass::IsDerivedFrom(const CRuntimeClass* pBaseClass) const { //为了简洁,略去了不相关的代码 if (pBaseClass == NULL) return FALSE; // simple SI case const CRuntimeClass* pClassThis = this; while (pClassThis != NULL) { if (pClassThis == pBaseClass) return TRUE; pClassThis = pClassThis->m_pBaseClass; } return FALSE; // walked to the top, no match }
2,消息映射,对mfc的消息一直没怎么理清,command,notify,reflect,还有框架下的那一套分发机制行,一团浆糊,其实只要找准源码看就行了,以前一直找不到具体的代码,cwnd::oncommand onnotify之类的用vc自带的f12和行assist都只能找到声明,其实具体的定义在atlmfc\src\mfc\wincore.cpp里,看了里面的代码,最起码除了框架那部分是搞清楚了
其实只要找准源码,问题就不大了,mfc对于消息的几个宏都比较简单,最起码对习惯看c代码的人来说不难
BEGIN_MESSAGE_MAP
ON_COMMAND
NED_MESSAGE_MAP
通过cwinthread的run函数,我们看到
getmessagemap
dispatchmessagemap
可以知道,消息队列实际是由线程管理的,并根据操作系统提供的这么msg,得到响应的hwnd,然后去调用这个hwnd的wndproc函数
但是这个wndproc里面是怎么把消息在父子窗口间传来传去的呢?
这个消息的难点主要就是Notify,我们知道首先收到消息的是鼠标当前窗口,那么父窗口是怎么得到响应消息的呢,比如一个按钮点击事件
本来我的理解是“子窗口收到消息后,先发送通知消息给父窗口”,但是通过看onnotify代码,不是这样的,那可能就是windows内部处理掉
这个消息了,可是onnotify的消息只在父窗口的列表里存在么?????
,父窗口收到后,又去调用这个发射消息,然后才自己处理
绕来绕去啊
引自csdn VisualEleven的回帖,算是明白了,看来有时候多看看msdn是有好处的
控件的WM_NOTIFY,WM_COMMAND都是发送给该控件的父窗口的,由父窗口类处理
WM_NOTIFY:
Sent by a common control to its parent window when an event has occurred or the control requires some information.
WM_COMMAND:
The WM_COMMAND message is sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or when an accelerator keystroke is translated.