020-88888888

网站建设 APP开发 小程序

KNOWLEDGE/知识

分享你我感悟

您当前位置> 主页 > 知识

MFC自定义消息咋实现?添加代码完成特殊功能看这里

发表时间:2026-01-12 02:15:49

文章作者:小编

浏览次数:

MFC应用程序进行开发的阶段,使用系统事先定义好的消息,有时很难符合特定的需求,这样的情况下,就需要开发者自己去创建还要处理自定义的消息。

理解MFC消息映射基础

Windows消息经MFC框架封装成更利于使用的消息映射机制,从CCmdTarget派生的每一个类可拥有自身的消息映射表,此表用于关联消息ID及对应的处理函数,实现自定义消息需理解这一整套机制。

首先,要在类的头文件中声明消息处理函数,该函数必须具备afx_msg返回类型,并且包含特定参数,其次,在相应的CPP文件内,通过BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏来建立消息ID与处理函数之间的绑定关系。

定义消息标识符

对于自定义消息来讲,是要有一个拥有唯一性的整型ID的。为避免跟Windows系统消息发生冲突,应该采用WM_USER宏来予以定义。例如,#define WM_MYMSG (WM_USER + 100)。在WM_USER之后的那部分数值,是被系统特意保留供应用程序去运用的。

要是打算去界定那跨越进程进行通信的全局消息,那就应该去运用RegisterWindowMessage函数来做这事。这个函数会按照字符串参数进而生成出一个在系统范围之内独一无二的消息ID,凭借这个来确保不同的应用程序针对同一字符串注册所得到的是一样的ID。

声明与实现消息处理函数

于那有着对消息作出响应需求的类头文件里,声明消息处理函数,它的格式呈现这般模样:先是前缀afx_msg接着是 返回类型LRESULT 再加上函数名OnMyMessage 括号里有参数WPARAM wParamLPARAM lParam,这当中的wParam以及lParam是用于传递那些附加信息的。

 #define WM_MyMessage (WM_USER+100)

要在CPP文件当中去达成这个函数的实现,你能够于此地撰写具体的业务方面的逻辑,像是去对界面进行更新,或者是处理相关的数据,又或者是触发别的一些操作,最终,函数通常返回一个LRESULT值,依照需求可以是0,也可以是其他具有意义的数值。

添加消息映射条目

class CTestDlg : public CDialog
{ 
protected:
 ……
  // 生成的消息映射函数
  ……
  afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); // add lyw
  DECLARE_MESSAGE_MAP()
  ……

这是连接消息标识跟处理函数的关键步骤,在CPP文件的消息映射区域里,通过ON_MESSAGE宏去增添条目,像这样:ON_MESSAGE(WM_MYMSG, &CMyClass::OnMyMessage)

拿使用借助RegisterWindowMessage来进行注册的消息来讲,映射宏得变更成ON_REGISTERED_MESSAGE。像这样:ON_REGISTERED_MESSAGE(WM_MYMSG, &CMyClass::OnMyMessage)。一定要保证消息ID以及处理函数指针的准确无误性。

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
   ……
  ON_MESSAGE(WM_MyMessage, OnMyMessage)
END_MESSAGE_MAP()

发送自定义消息

在程序内部,能够借助PostMessage或者SendMessage函数来发送消息,PostMessage将消息放入队列后马上返回,处于非阻塞状态,SendMessage需等待消息处理完成之后才方可返回。

LRESULT CTestDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
  //MessageBox("recv msg success");
  //添加自己的消息处理
  ……
  return 0;  
}

在给其他应用程序的窗口发送消息这件事上,首先需要获取目标窗口的句柄。然后运用SendMessage或者PostMessage函数来进行操作,并且必须确保双方对于消息ID的定义完全一致,特别是在使用RegisterWindowMessage进行注册的情况下。

调试与注意事项

SendMessage( WM_MyMessage, 0, 0);

在开展调试自定义消息操作期间,可凭借Visual Studio拥有的调试工具,于消息处理函数开始之处设置断点,以查看消息是否被精准发送与接收,以及wParam和lParam参数的值是否符合预期。

得留意着,过度去运用自定义消息会使得代码结构变得松散开来。同时,跨进程做消息传递涉及到数据安全性以及兼容性方面的问题,所传递的指针在目标进程内部处于无效的那种情形,应该采用内存映射文件等进程间通信技术去传递复杂数据。

 PostMessage(WM_MyMessage, 0, 0); 

于实际项目当中,你是否遭遇过那样自定义消息来进行处理然而却未见其生效这样的情形,当出现此种状况的时候,你是以怎样的方式去开展排查以及解决那般问题的,能否在评论区域分享一下你的相关经验,要是你觉得这篇文章能够起到一定的帮衬作用的话,那就麻烦你给文章点个赞以此来给予支持哦 。

相关案例查看更多