MFC消息映射机制+SendMessage和PostMessage区别(非常详细)

消息映射机制原理

消息映射的实质其实是类A对类B的一种函数调用,类似于qt中的信号与槽机制。
MFC消息映射机制的具体实现方法是:在每个能接收和处理消息的类中,定义一个消息和消息函数静态对照表,也就是所说的消息映射表。在消息映射表中,消息与对应的消息处理函数指针是绑定在一起的。各个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态对照表中。当有消息需要处理时,程序只要搜索这个消息静态表,查看表中是否含有该消息ID,就可以知道该类能否处理此消息。如果能处理该消息,则同样依照静态表找到并调用对应的消息处理函数。
Windows程序是基于消息机制来编程处理的。

举例

假设我们给类添加一个打开文件的消息响应函数,MFC会在四处添加代码:

1)类头文件中

// 生成的消息映射函数
protected:
DECLARE_MESSAGE_MAP()
protected:
//afx_msg宏表示声明的是一个消息响应函数。
afx_msg LRESULT OpenFile(WPARAM wParam, LPARAM lParam);
//LRESULT数据类型长整型long 说明函数返回是某个结果

2)类源文件中

BEGIN_MESSAGE_MAP(CMainFrame, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
ON_MESSAGE(WM_OPENFILE, OpenFile)
END_MESSAGE_MAP()

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

3)还是在类的源文件中

LRESULT CMainFrame::OpenFile(WPARAM wParam, LPARAM lParam)
{
	this->OpenFile(this->m_strOpenFile, false);
	return 1;
}

4)标准头文件stdafx.h中

// 消息ID宏定义
#define WM_OPENFILE				WM_USER+514

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

PostMessage和SendMessage的区别

PostMessage 和SendMessage的区别主要在于是否等待其他程序消息处理。PostMessage只是把消息放入队列中,不管其他程序是否处理都直接返回,然后继续执行后续操作;而SendMessage必须等待其他程序处理消息后才返回,然后再继续执行。这两个函数的返回值也不同,PostMessage的返回值表示的是PostMessage函数执行是否正确,而SendMessage的返回值表示的是其他程序处理消息后的返回值。
postmessage需要马上返回
sendmessage需要阻塞等待
凡是由你设计而却由Windows系统调用的函数,统称callback函数(回调函数)。这些函数都有一定的类型,以配合Windows的调用操作。

进一步理解消息映射,A调用B的函数,那么A要不要等到B的过程执行完再继续呢?这就是消息队列机制了。PostMessage只是把调用要求放进一个等待队列里(消息队列),而SendMessage一定要等到B执行完消息映射函数才能继续,这也就是两个函数的本质区别。

很多人会被“消息”的假象迷惑,一定要记住,其实并不存在什么消息,消息映射机制只不过是一种跨对象的函数调用,不是A“发消息”让B做什么,而是B“自己决定”在A“执行发消息函数”的时候做什么!

重复一遍: PostMessage 是将消息发送到窗口的消息队列中,然后立即返回
SendMessage是将消息发送到窗口函数,在窗口函数处理完消息后才返回。
所以,PostMessage 是异步处理(不阻塞),而SendMessage是同步处理(阻塞)

sendmessage函数原型:

//函数原型
LRESULT SendMessage 
(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
参数 
hWnd:其窗口程序将接收消息的窗口的句柄
Msg:指定被发送的消息
wParam :指定附加的消息指定消息
lParam :指定附加的消息指定消息
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Minuw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值