标题:关于命令消息路由的问题
只看楼主
toyix
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2008-7-14
结帖率:50%
 问题点数:0 回复次数:2 
关于命令消息路由的问题
书上说:由于CWnd::OnCommand 是个虚函数,可以在框架类中重写OnCommand函数,从而可以截获菜单消息使它不再往下(VIEW类)路由。

难道mfc,是用Cwnd类型的指针调用的OnCommand函数,所以当你重写框架类的这个函数时,才会被子类所截获?

不过我尝试了下 ,在CWnd::OnCommand 是虚函数的前期下 ,如果定义子类的对象,用。操作符调用OnCommand函数,也是调用子类的函数。
如果我说的不对
那么 OnCommand这个函数是如何被调用的?

我研究了很久  希望给我个答案   我QQ  494000816  希望高手可以加我   讨论下  谢谢

[[it] 本帖最后由 toyix 于 2008-11-17 22:56 编辑 [/it]]
搜索更多相关主题的帖子: 命令 路由 
2008-11-17 22:52
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
得分:0 
CWnd::OnCommand是在消息泵处理时调用.
消息中含有窗口类指针,由于是基于CWnd类的,它其实是把它当作父类调用,形如:
pWnd->WindowProc(nMsg, wParam, lParam);
WindowProc中调用窗口类的消息处理函数
OnWndMsg(message, wParam, lParam, &lResult);
它的实现代码:
BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
    LRESULT lResult = 0;
    union MessageMapFunctions mmf;
    mmf.pfn = 0;
    CInternalGlobalLock winMsgLock;
    // special case for commands
    if (message == WM_COMMAND)
    {
        if (OnCommand(wParam, lParam))
        {
            lResult = 1;
            goto LReturnTrue;
        }
        return FALSE;
    }
......
}
上面可以看到调用了if (OnCommand(wParam, lParam))

如果该函数被重写,则指向重写函数.
以上代码是MFC的代码,可以在调试中跟踪到.(微软造就了快速编程,也造就了一帮不知编程真象的人,其实多调试跟踪一下源码,很多东西是可以搞清楚的)

关于这点,为什么会调用到被重写后的子类函数代码,请再温习一下类继承的一些相关知识.
2008-11-18 00:01
toyix
Rank: 1
等 级:新手上路
帖 子:112
专家分:0
注 册:2008-7-14
得分:0 
谢谢您的解答感觉好像明白了很多


LRESULT AFXAPI AfxCallWndProc(CWnd* pWnd, HWND hWnd, UINT nMsg,
    WPARAM wParam = 0, LPARAM lParam = 0)
在这个函数里 调用lResult = pWnd->WindowProc(nMsg, wParam, lParam);


pWnd是CWnd类型的指针 ,又因为所重写函数为虚函数,所以子类有的就调用子类的 .   呵呵  谢谢

[[it] 本帖最后由 toyix 于 2008-11-18 10:29 编辑 [/it]]
2008-11-18 09:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-244867-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.241785 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved