`
tansitongba
  • 浏览: 503653 次
文章分类
社区版块
存档分类
最新评论

深入浅出MFC学习笔记(第三章:MFC六大关键技术之仿真:命令传递) .

 
阅读更多

命令传递(Commandrouting

消息如果是仅仅从派生类流向父类,那就非常简单了。然而MFC用来处理消息的C++类,并不是单线发展的。document/view也具有处理消息的能力。因此,消息应该有横向流动的机会。

MFC对消息循环的规定为:

1:若是一般的windows消息(WM_xx)则一定是由派生类流向基类。

2:如果是WM_COMMAND消息,就非常复杂了。要区分接受者的类型:

1:接受者若为Frame窗口:处理次序为:View->Frame窗口本身->CWinApp类。

2:接受者若为View:处理次序为:View本身->Document;

3:接受者若为Document:处理次序为:Document本身->Documenttemplate

因此,接下来我们的任务就是仿真以上的消息传递路线。

以下为需要添加的函数:

全局函数AfxWndProc,它是整个消息循环的起始点,本来应该在CWinThread::Run中被调用,每调用一次就推送一个消息。模拟windows的disPatch函数。

LRESULTAfxWndPro(HWNDhWnd,UINTnMsg,WPARAM

wParam,LPARAMlParam,CWnd*pWnd)

{

cout<<"AfxWndProc()"<<endl;

returnAfxCallWndProc(pWnd,hWnd,nMsg,wParam,lParam);

}

LRESULTAfxCallWndProc(CWnd*pWnd,HWNDhWnd,UINTnMsg,

WPARAMwParam,LPARAMlParam)

{

cout<<"AfxCallWndProc"<<endl;

LRESULTlResult=pWnd->windowProc(nMsg,wParam,lParam);

returnlResult;

}

全局函数AfxCallWndProc用于调用接受消息的类的消息处理函数。pWnd->WindowProc调用哪个函数,取决于pWnd指向的对象类型。

如果pWnd指向CMyFrameWnd对象,则调用CFrameWnd::WindowProc。因为CFrameWnd斌没有改写WindowProc,因此调用的是CWnd::WindowProc。。

如果pWnd指向CMyView对象,那么调用CView::windowProc。而CMyView没有改写WIndowProc所以调用的是CWnd::WindowProc

CWnd::windowProc中,首先判断消息是否为WM_COMMAND消息,

如不是,则传递给父类进行处理。

如果是WM_COMMAND消息,CWnd::windowProc调用OnCommand。此函数为虚函数。有以下几种情况:

1:如果this指向CMyFrameWnd对象,则调用的是CFrameWnd::OnComamnd

2:如果this指向CMyView对象,那么调用的是CView::OnCommand。因为CView并没有改写OnComamnd所以调用的是CWnd::OnCommand

boolCFrameWnd::OnComamnd(WPARAMwParam,LPARAMlParam)

{

cout<<"CFrameWnd::OnCommand()"<<endl;

returnCWnd::OnCommand(wParam,lParam);

}

boolCWnd::OnComamnd(WPARAMwParam,LPARAMlParam)

{

cout<<"CWnd::OnComamnd()"<<endl;

returnOnCmdMsg(0,0);

}

OnCmdMsg仍然是虚函数,

1:如果this指向CMyFrameWnd对象,那么调用的是CFrameWnd::OnCmdMsg

2:如果this指向CMyView对象,则调用CView::OnCmdMsg

3:如果this指向CMyDoc对象,则调用CDocument::OnCmdMsg

4:如果this指向CMWinApp对象,则调用CWinApp::nCmdMsg。因为CWinApp没有改写OnCmdMsg因此调用的是CCmdTarget::OnCmdMsg

BoolCFrameWnd::OnCmdMsg(UINTnID,intnCode)
{

cout<<"CFrameWnd::OnCmdMsg()"<<endl;

CView*pView=GetActiveView();

if(pView->OnCmdMsg(nID,nCode))//处理则返回否则继续传递。

returntrue

if(CWnd::OnCmdMsg(nID,nCode))

returntrue;

CWinApp*pApp=AfxGetApp();

if(pApp->OnCmdMsg(nID,nCode)

returntrue;

returnfasle;

}

boolCView::OnCmdMsg(UINTnID,intnCode)

{

cout<<"CView::OnCmdMsg()"<<endl;

if(CWnd::OnCmdMsg(nID,nCode))

returntrue;

boolbHandled=false;

bHandled=m_pDocument->OnCmdMsg(nID,nCode);

returnbHandled;

}

BoolCDocument::OnCmdMsg(UINTnID,intnCode)

{

cout<<"CDocument::OnCmdMsg()"<<endl;

if(CCmdTarget::OnCmdMsg(nID,nCode))

returntrue;

returnfalse;

}

真正的消息传递路径是从OnCmdMsg开始的。在每个类的OnCmdMsg函数中,会调用其他类的OnCmdMsg函数,从而决定每个消息的传递路径。

如果消息在前一个OnCmdMsg中被处理,就不会继续传递。如果没有被处理,则会继续沿着路径传递下去。无论如何,最终消息的比对是在CCmdTarget类中进行的,只是调用GetMessageMapthis指针不同,会决定调用哪个类的消息映射表。理解这一点很重要!!!

boolCCmdTarget::OnCmdMsg(UINTnID,intnCode)

{

cout<<"CCmdTarget::OnCmdMsg()"<<endl;

for(pMessageMap=GetMessageMap();pMessageMap;

pMessageMap=pMessageMap->pBaseMessageMap()

{

If(找到)

//执行消息处理函数。

}

}

分享到:
评论

相关推荐

    深入浅出MFC读书笔记3

    深入浅出MFC读书笔记3 在MFC中,Document-View架构是一个非常重要的概念。本文将对Document-View架构中的关键组件进行深入探讨,并对其实现思路进行详细的解析。 首先,让我们来看一下Document的概念。在MFC中,...

    《深入浅出MFC》高清第二版(书签)_深入浅出MFC_c++mfc_

    《深入浅出MFC》是一本专为C++程序员深入理解Microsoft Foundation Classes (MFC) 库而编写的经典教程。MFC是微软提供的一套C++类库,用于简化Windows应用程序开发,它将Windows API封装成易于使用的C++类。这本书的...

    《深入浅出MFC》第三章MFC关键技术仿真 vs2013代码

    总之,《深入浅出MFC》第三章的内容涵盖了MFC的核心概念和技术,是Windows开发人员理解和掌握MFC编程的宝贵资源。通过学习这一章,开发者可以构建功能丰富的Windows应用程序,并对MFC有深入的理解。

    深入浅出.MFC.pdf深入浅出.MFC.pdf4

    深入浅出.MFC.pdf深入浅出.MFC.pdf深入浅出.MFC.pdf

    深入浅出MFC学习笔记

    ### 深入浅出MFC学习笔记:关键知识点解析 #### 一、Windows消息机制与回调函数 在深入探讨MFC之前,我们先来理解Windows操作系统中的消息机制及其核心组成部分——回调函数。 ##### 1.1 Windows消息机制概述 ...

    深入浅出MFC读书笔记2

    深入浅出MFC读书笔记2是对MFC框架的进一步学习和理解,主要涵盖了MFC的基础概念、类库结构以及程序构建的关键要素。MFC(Microsoft Foundation Classes)是微软为Windows平台开发的应用程序提供的一种类库,它基于...

    深入浅出 MFC (第二版) 高清晰

    第三章 MFC六大关键技术之仿真 第二篇 欲善工事先利其器 第四章 Visual C++ 集成开发环境 第三篇 浅出MFC程序设计 第五章 总观Application Framework 第六章 MFC程序的生死因果 第七章 简单而完整:MFC骨干程序 第四...

    深入浅出.MFC.pdf深入浅出.MFC.pdf2

    深入浅出.MFC.pdf深入浅出.MFC.pdf深入浅出.MFC.pdf

    MFC 深入浅出 + 学习笔记

    文件`深入浅出MFC笔记(配合原书的好笔记).doc`可能是作者阅读侯捷的《深入浅出MFC》后所做的详细笔记,可能包含了对书中关键概念的理解、例子的解析以及个人的实践心得。这种学习方式对于巩固理论知识和提高实际编程...

    《深入浅出MFC》读书心得

    MFC 是 Windows 程序设计的基础,深入浅出 MFC 是学习 Windows 程序设计的不二之选。 《深入浅出MFC》读书心得涵盖了 Windows 程序设计的方方面面,包括程序结构、头文件、makefile、消息循环等知识点,为开发者...

    深入浅出MFC 深入浅出MFC 深入浅出MFC

    《深入浅出MFC》是一本专注于Microsoft Foundation Classes (MFC) 的技术书籍,MFC是微软为Windows应用程序开发提供的一套C++类库。它将Windows API进行了封装,使得开发者能够更方便地构建Windows桌面应用程序。MFC...

    深入浅出.MFC.pdf深入浅出.MFC.pdf3

    深入浅出.MFC.pdf深入浅出.MFC.pdf深入浅出.MFC.pdf

    深入浅出.MFC.pdf深入浅出.MFC.pdf5

    深入浅出.MFC.pdf深入浅出.MFC.pdf深入浅出.MFC.pdf

    深入浅出MFC.pdf

    《深入浅出MFC》是一本专注于Microsoft Foundation Classes (MFC) 的技术书籍,MFC 是微软为Windows应用程序开发提供的一套C++类库。它将Windows API进行了封装,使得开发者能够更方便地构建基于Windows操作系统的...

    深入浅出MFC简体中文版(附源码

    《深入浅出MFC简体中文版》是一本专注于Microsoft Foundation Classes (MFC) 的技术专著,旨在帮助读者深入理解和应用这一强大的Windows应用程序开发框架。MFC是微软为C++开发者提供的一种库,它封装了Windows API,...

    剖析MFC六大关键技术视频教程(23集)

    资源名称:剖析MFC六大关键技术视频教程(23集)资源目录:【】剖析MFC六大关键技术1.仿真【】剖析MFC六大关键技术10.序列号【】剖析MFC六大关键技术11.文档视图结构【】剖析MFC六大关键技术12.文档视图结构【】剖析...

    深入浅出mfc-笔记

    ### 深入浅出MFC—笔记关键知识点解析 #### 一、Windows消息机制与回调函数 在深入了解MFC之前,我们首先需要理解Windows操作系统的基本工作原理,尤其是消息驱动模型以及回调函数的概念。 **1.1 Windows消息机制...

Global site tag (gtag.js) - Google Analytics