MFC的消息映射机制

一、映射机制原理

Windows程序是基于消息机制来编程的。

MFC消息映射机制的具体实现方法是:在每个能接收和处理消息的类中,定义一个消息和消息函数静态对照表,即消息映射表在消息映射表中,消息与对应的消息处理函数指针是成对出现的,也就是他们是绑定在一起的。某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态对照表中。当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就可以知道该类能否处理此消息。如果能处理该消息,则同样依照静态表能很容易找到并调用对应的消息处理函数。

之所以没有采用:在基类中针对每种消息做一个虚函数(虚函数必须由一个虚函数表vtable来实现),当子类对消息响应时候,只要在子类中重写这个虚函数即可,是因为MFC类派生层次很多,如果在基类对每个消息进行虚函数处理,那么从基类派生的每个子类都将背负一个庞大的虚函数表,这样浪费内存,故MFC没有采取这种方式而采取消息映射方式。 

二、举例(vc视频中例子)

    假设我们给视类添加一个鼠标左键的消息响应函数,MFC会在三处添加代码:

1)视类的头文件

// 生成的消息映射函数

protected:

DECLARE_MESSAGE_MAP()

public:

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//afx_msg宏表示声明的是一个消息响应函数。

2)在视类的源文件

BEGIN_MESSAGE_MAP(CMFCTestView, CView)

// 标准打印命令

ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)

ON_WM_LBUTTONDOWN()

END_MESSAGE_MAP()

    在宏BEGIN_MESSAGE_MAP()END_MESSAGE_MAP()之间进行消息映射。ON_WM_LBUTTONDOWN()把消息WM_LBUTTONDOWN与它的响应函数OnLButtonDown()相关联。这样一旦有消息的产生,就会自动调用相关联的消息响应函数去处理。 

#define ON_WM_LBUTTONDOWN() \

{ WM_LBUTTONDOWN, 0, 0, 0, AfxSig_vwp, \

(AFX_PMSG)(AFX_PMSGW) \

(static_cast< void (AFX_MSG_CALL CWnd::*)(UINT, CPoint) > ( &ThisClass :: OnLButtonDown)) },

3)还是在在视类的源文件

    void CMFCTestView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

    MessageBox("View Clicked");

   CView::OnLButtonDown(nFlags, point);

}

    由上可见,一个MFC消息响应函数在程序中有三处相关信息:函数原型,函数实现,以及用来关联消息和消息响应函数的宏。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值