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

深入浅出MFC学习笔记(第三章:MFC六大关键技术之仿真:消息映射)

 
阅读更多

消息映射机制

SDK编程中,一般处理消息的方法就是使用switch/case判断消息的类型,然后进行响应。更模块化的方法是使用第一章介绍的消息映射表的方法,把消息和消息处理函数关联起来。

应该为每个需要处理消息的类构建一个消息映射表,并将基类与派生类的消息映射表连接起来。当窗口函数比较消息时,就沿着这条继承路线传递下去。为了实现这个目的我们仍然使用两个宏,完成这个功能复杂的构建。

首先定义一个数据结构:

//消息映射表元素类型。

structAFX_MSGMAP_ENTRY

{

UINTnMessage;

UINTnCode;

UINTnID;

UINTnLastID;

UINTnSig;

AFX_PMSGpfn;

};

structAFX_MSGMAP

{

AFX_MSGMAP*pBaseMessageMap;//指向基类的本结构。

AFX_MSGMAP_ENTRY*lpEntries;//本类的消息映射表。

};

在定义一个宏:

defineDECLARE_MESSAGE_MAP\

staticAFX_MSGMAP_ENTRY_messageEntries[];\

staticAFX_MSGMAPmessageMap;\

virtualAFX_MSGMAP*GetMessageMap()const;

该宏相当于在类中声明两个static数据成员和一个虚成员函数。

它们的定义由以下三个宏实现:

#defineBEGIN_MESSAGE_MAP(class_name,base_class)\

AFX_MSGMAP*class_name::GetMessageMap()const\

{return&class_name::message;}\

AFX_MSGMAPmessageMap=\

{&base_class::messageMap,class_name::_messageEntries}\

AFX_MSGMAP_ENTRY_messageEntries[]=\

{

#defineON_COMMAND(id,memFunc)\

WM_COMMAND,0,id,id,AFx_sig_vv\

,(AFX_PMSG)memFunc},\

#defineEND_MESSAGE_MAP()\

{0,0,0,0,AfxSig_end,(AFX_PMSG)0}\

CView为例,下面的代码:

classCWnd:publicCWnd

{

public:

DECLARE_MESSAGE_MAP()

};

BEGIN_MESSAGE_MAP(CView,CWnd)

ON_COMMAND(CViewid,0)

END_MESSAGE_MAP()

展开后变为:

classCView:publicCWnd

{

public:

staticAFX_MESSAGE_ENTRY_messageEntries[];

staticAFX_MSGMAPmessageMap;

virtualAFX_MSGMAP*GetMessageMap()const;

};

AFX_MSGMAP*CView::GetMessageMap()const

{

return&CView::messagemMap;

}

AFX_MSGMAPCView::messageMap=

{

&(CWnd::messageMap),

(AFX_MSGMAP_ENTRY*)&(CView::_messageEntries)

};

AFX_MSGMAP_ENTRYCView::_messageEntries[]=

{

{WM_COMMAND,0,122,122,1,(AFX_PMSG)0},

{0,0,0,0,0,(AFX_PMSG)0}

}

为了验证整个消息映射表,我们在每个类的消息映射表中添加了一个空的消息,这是为了做点标记,用于标示消息映射表的最后一个消息。MFC当然不是这样实现的。

/*CCmdTarget是消息传递的终点,因此在实现时需要特殊处理,这一点容易出错,要特别注意。

classCCmdTarget:publicCObject

{

DECLARE_DYNCREATE(CCmdTarget)

DECLARE_MESSAGE_MAP()

public:

CCmdTarget()

{

//cout<<"CCmdTargetconstructor!"<<endl;

//CreateObject();

}

~CCmdTarget()

{

//cout<<"CCmdTargetdestructor!"<<endl;

}

public:

};

IMPLEMENT_DYNCREATE(CCmdTarget,CObject)

AFX_MSGMAPCCmdTarget::messageMap=

{NULL,CCmdTarget::_messageEntries};

AFX_MSGMAP_ENTRYCCmdTarget::_messageEntries[]=

{

{0,0,10,0,AfxSig_end,0},

{0,0,0,0,AfxSig_end,0}

};

AFX_MSGMAP*CCmdTarget::GetMessageMap()const

{

return&CCmdTarget::messageMap;

}

以下为包含动态创建、类型识别、消息映射的完整代码:


分享到:
评论

相关推荐

    深入浅出MFC读书笔记3

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

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

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

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

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

    深入浅出MFC学习笔记

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

    深入浅出MFC读书笔记2

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

    MFC 深入浅出 + 学习笔记

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

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

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

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

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

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

    深入浅出MFC(PDF)

    《深入浅出MFC》是一本专为程序员设计的详细指南,主要讲解Microsoft Foundation Classes (MFC) 库的使用和开发技术。MFC是微软公司提供的一个C++类库,它封装了Windows API,使得开发者能用面向对象的方式来编写...

    深入浅出MFC--侯捷 深入浅出MFC--侯捷 深入浅出MFC--侯捷

    《深入浅出MFC》是侯捷先生撰写的一本关于Microsoft Foundation Classes (MFC) 的经典著作。MFC是微软公司开发的一个C++类库,它封装了Windows API,为开发者提供了一种更加面向对象的方式来编写Windows应用程序。...

    深入浅出MFC 2e

    - **第3章 MFC六大关键技术之仿真** - **MFC类层次结构**:介绍MFC中的类组织结构。 - **MFC程序初始化过程**:分析MFC程序启动时的初始化流程。 - **RTTI**:讨论MFC中执行期类型识别的应用。 - **动态生成...

    《深入浅出MFC (第二版)》(候捷 著)

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

    深入浅出MFC第一章例子

    《深入浅出MFC》是面向Windows编程领域的一本经典著作,主要讲解了Microsoft Foundation Classes (MFC)库的应用,这个库是微软为简化Windows应用程序开发而提供的C++类库。MFC是基于Windows API的封装,使得开发者...

Global site tag (gtag.js) - Google Analytics