现在的位置: 首页 > 综合 > 正文

记录一些对mfc理解以前比较模糊的东西

2013年06月11日 ⁄ 综合 ⁄ 共 1490字 ⁄ 字号 评论关闭

对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.




【上篇】
【下篇】

抱歉!评论已关闭.