千家信息网

MFC模拟实现自定义消息发送的方法

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章主要讲解了"MFC模拟实现自定义消息发送的方法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"MFC模拟实现自定义消息发送的方法"吧!在MFC框
千家信息网最后更新 2025年01月19日MFC模拟实现自定义消息发送的方法

这篇文章主要讲解了"MFC模拟实现自定义消息发送的方法",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"MFC模拟实现自定义消息发送的方法"吧!

在MFC框架下,有很多系统已经定义好的消息,例如ON_WM_LBUTTONDOWN()、ON_WM_MBUTTONDOWN()等等。我们在使用的时候只需要声明并调用就可以了,最简单的用法。

提升了一点难度的用法就是自己设置自定义消息,再提升一点难度的就是如何模拟系统消息了,一般情况下只是做普通的项目开发功能是用不到的。

自定义消息

在有些时候系统定义的消息不能完全满足程序的应用,这时候就需要进行消息自定义了,那么该如何实现自定义消息呢?

第一步:定义自定义消息名称以及ID

在MFC框架下,分配了WM_USER之后的消息都是开发人员可以自定义的消息ID。

假设,定义一个选中触发消息:

#define WM_USER_CLICKED WM_USER+1

这种写法就代表了定义了一个自定义消息,消息名称叫做:WM_USER_CLICKED,消息ID号是:WM_USER+1

在这里,温馨提示一句:在做大型的绘图开发程序当中,为了方便管理自定义消息,一般都不会直接使用WM_USER进行编号自增,而是使用自定义宏代替WM_USER,为了后续方便管理,格式如下:

#define  UIXML_WM_BASE   WM_USER + 20000#define  WM_USER_CLICKED1             UIXML_WM_BASE +0#define  WM_USER_CLICKED2             UIXML_WM_BASE+1#define  WM_USER_CLICKED3             UIXML_WM_BASE+2#define  WM_USER_CLICKED4             UIXML_WM_BASE+3

如果要是你的程序中只存在了一两个自定义消息,就没有必要写成上面的格式了。

这种格式的好处:

可以根据功能划分自定义消息区域。假设你目前正在开发一个仅供公司内部使用的基础框架类,在自定义消息的时候,需要区分哪些是自己开发使用的,哪些是对外开发者调用的。分工明确,不容易消息错乱。

第二步:发送自定义消息

想要在哪里触发自定义消息,就需要在哪里发送消息。

在MFC框架中,有两种发送消息机制:SendMessage、PostMessage。

::SendMessage(GetParent()->GetSafeHwnd() , WM_USER_CLICKED ,参数2 , 参数1);

只是举例子说明,具体的根据实际功能来确定~

第三步:自定义消息映射

ON_MESSAGE(WM_USER_CLICKED1, OnCustomClicked1)

参数一:定义的自定义消息

参数二:实际窗口中响应的映射消息

第四步:自定义消息实现

afx_msg LRESULT OnCustomClicked1(WPARAM  wParam , LPARAM lParam);

具体的操作应用可以在OnCustomClicked1中编写了,这要根据实际的需求应用了,这里不再做过多的说明,到这里,应该都知道该如何应用了吧~

模拟系统消息

简单的自定义消息方法已经在自定义消息中讲述了,下面来一个更深层次的提高吧!如何模拟系统消息,为了通俗易懂的讲解,这里我们模拟ComboBox控件CBN_SELCHANGE消息。

使用过MFC框架下控件开发的人都知道,该消息是由系统发送的,平时我们只是应用下就可以了,要是让自己写一个这样的触发消息,该如何实现呢?

前提条件:继承CWnd类模拟ComboBox控件,这时候,所有的控件消息都需要自己内部模拟,那么,想要让外部开发人员调用起来与系统的ComboBox中的消息一致,该怎么实现呢?

假设我们应用SendMessage进行消息发送,此时也是需要发送消息,但是需要发送命令消息:WM_COMMAND

WM_COMMAND在什么时候被触发呢?

1:当用户从菜单中选择命令项时

2:当控件向其父窗口发送消息时

3:当加速键击被翻译时

其实,在WINDOW9X以上都是在发送WM_NOTIFY,但是为了做成兼容基类,所以,依旧采用的是WM_COMMAND消息。

一旦指定了使用WM_COMMAND来进行消息发送,这时候wParam以及lParam该发送什么数据呢?

wParam参数

在发送自定义消息中,wParam参数是分成了高字节与低字节之分的,需要采用MAKEWPARAM宏进行发送。

该宏创建了一个32位的无符号值,用作消息中的wParam参数,该宏连接两个指定的16位值。

在传递参数时,高位是当前模拟发送的ID号,每个窗口甚至是每个控件都有属于自己的编号,不难获取到。

低位是需要触发的系统消息,前面说到了模拟的是CBN_SELCHANGE消息,所以wParam参数的写法,如下:

MAKEWPARAM( GetDlgCtrlID(),CBN_SELCHANGE)

LPARAM参数

对于这个参数,就当对来说简单了,只需要传递当前窗口的HWND,转换成LPARAM参数就可以了。

整体的模拟系统发送格式:

::SendMessage(pwnd->GetSafeHwnd(), WM_COMMAND, MAKEWPARAM( GetDlgCtrlID(),CBN_SELCHANGE), (LPARAM)GetSafeHwnd());

对于模拟系统发送消息来说,最重要的就是SendMessage的第二个参数以及第三个参数了。同样的道理,也可以使用PostMessage的方式发送。

消息发送出去之后,在外界的使用方式是如何呢?

既然我们模拟的是系统消息,在外部窗口调用的地方与MFC自带的控件消息方法是一致的

消息映射:

ON_CBN_SELCHANGE(ID_CUSTOMCOMBOBOXID, &CTestComboboxDlg::OnCbnSelchangeComboSd)

感谢各位的阅读,以上就是"MFC模拟实现自定义消息发送的方法"的内容了,经过本文的学习后,相信大家对MFC模拟实现自定义消息发送的方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

消息 参数 系统 开发 控件 方法 应用 框架 就是 时候 格式 功能 只是 实际 程序 学习 一致 两个 人员 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器登录物品指令 网络安全警察工资待遇怎么样 河南省网络安全法 服务器机柜卡位号 模块化程度高软件开发工作量 数据库改微信聊天时间 如何连接局域网数据库 广东系统软件开发收费报价表 华硕服务器z9pa u8开机 数据库管理服务器软件 观唐互联网科技有限公司 永大通力服务器故障代码 小迪网络安全十八期 计算机网络技术安全论文摘要 列举通信和网络技术哪些 小学网络安全工作情况汇报 武汉网络安全基地总体规划图 江苏一带一冷库软件开发 潍柴软件开发做什么 山东华拓互联网科技有限公司 浪潮服务器和华为服务器谁便宜 bash网络安全运维pan 违反网络安全法第四十七条 低维数据库 展板筑牢网络安全防线 数据库工程师历年真题 大华服务器设置摄像头离线报警 田新勇网络安全宣传周 湖南创新网络技术服务信息中心 网络安全涉及的行业分工
0