对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
}
其实只要找准源码,问题就不大了,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.