MFC消息映射机制


在《VC++深入解析》的第四章简单绘图中,作者介绍了MFC消息映射机制,本文对其进行简要概括。


1、视图窗口始终覆盖在框架类窗口之上。


框架窗口就像一面墙,而视图类窗口就像墙纸,它始终挡在这面墙的前面。那么此时对这面墙的所有操作,其实都是在这面墙纸上进行的。因此所有的操作,包括鼠标单击、鼠标移动等操作都只能由视图类窗口捕获,而框架类窗口收不到消息。


2、消息响应函数原型


在视图类添加鼠标左键点击相应的消息响应函数之后,在CView类的头文件中,有如下这段代码:

DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

在上述代码中,DECLARE_MESSAGE_MAP()为宏,afx_msg为限定符,也是一个宏,该宏表示这个函数是一个消息响应函数的声明。

3、ON_WM_LBUTTONDOWN消息映射宏


在CView类的源文件中,有如下这段代码:
IMPLEMENT_DYNCREATE(Cchapter4View, CView)

BEGIN_MESSAGE_MAP(Cchapter4View, CView)
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &Cchapter4View::OnFilePrintPreview)
	ON_WM_CONTEXTMENU()
	ON_WM_RBUTTONUP()
	ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

在上述代码中,BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()这两个宏之间定义CView类的消息映射表,其中有一个ON_WM_LBUTTONDOWN这个消息映射宏,它的作用就是把鼠标左键按下的消息(WM_LBUTTONDOWN)与一个消息响应函数关联起来。通过这种机制,一旦有消息产生,程序就会调用相应的消息响应函数来进行处理。

4、消息响应函数的定义

void Cchapter4View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	MessageBox(_T("View Clicked!"));
	CView::OnLButtonDown(nFlags, point);
}

综上2-4,一个MFC消息响应函数在程序中有三处相关信息:函数原型、函数实现和用来关联消息和消息响应函数的宏。

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值