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

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





侯捷的<深入浅出MFC>相信大家都已经很熟悉了,论坛上也有很多介绍,这里我就不多说了。 而的<MFC深入浅出>,听说的人可能就少得多。原因听说是这本书当时没有怎么宣传,而自从1999年第1版后,似乎也没有重印过,现在市面上根本找不到,所以大部分人都不知道。我手里现在恰好有一本,是从图书馆借的。这本书全名为<MFC深入浅出——从MFC设计到MFC编程>编著,华中理工大学出版。此书极佳! 我这本书是1999年9月第一版,印数居然只有5000册。这么好的书只印5000册,而市面上都让一堆破烂玩意充斥着…… 这本书在写作目的上和侯捷的那本<深入浅出MFC>很相像。都是具体介绍MFC的原理和MFC的设计的。 看有的帖子说这本书难,这倒没有感觉到。当然,我看这本书的时候已经学完MFC的很多东西了,也看过侯捷那本。不过,这本书确实不大适合入门。而比较适合精通。 和侯捷那本书比起来,这两本书的风格很不一样。侯捷的那书的特点是剖了很多MFC的源代码,喜欢用代码说明问题,包括自己模拟MFC的方面实现一个类似的构架(什么什么仿真),而的那本书不是这样,他用了很多的图表,具体介绍了MFC干很多事的时候的具体过程,比如MFC创建的时候及退出的时候具体的调用函数的过程(具体函数的调用关系)。这觉得这部分极为重要,这也就是我推崇这本书的原因。而侯捷的那本书这部分内容非常少。这想,这可能是由于侯捷觉得,这部分内容不需要单独介绍,大家自己剖代码就可以解决问题。这确实不错,的那本书中的内容如果自己剖MFC的源代码,内容都可以找到。但这是一个非常花工夫的事情,更不要说MFC的实际代码中要考虑各种各样的问题(保护,检查),代码的思路不可能非常清楚,这无疑增加了读代码的难度。和自己花时间一点一点剖MFC代码相比,看看这本只有266页的书无疑有效得多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值