MFC中传递消息的方法

2023-11-02

通过自定义消息实现进程间通信的方法
消息分为两种,即系统消息和用户(程序设计者)自定义消息。系统消息定义从0到0x3FF,可以使用0x400到0x7FFF定义自己的消息。Windows把0x400定义为WM_USER。如果想定义自己的一个消息,可以在WM_USER上加上一个值。
还有一种自定义窗口消息的方法是用RegisterWindowsMessage ()函数来注册这个消息。与在WM_USER上加上某个数相比,它的好处是不必考虑所表示的消息标识符是否超出工程的允许范围。
要想用消息实现进程间通信,则需要在这两个程序中定义或注册相同的消息,才能保证数据通信顺利进行。用户自定义消息的方法如下:
                 
#define WM_COMM           WM_USER+100
const UINT wm_nRegMsg=RegisterWindowMessage ("reg_data");
有了这两种定义的消息后,可以用如下的方法来发送消息。
pWnd->SendMessage(WM_COMM,NULL,(LPARAM)uMsg);
pWnd->SendMessage(wm_nRegMsg,NULL,(LPARAM)uMsg);
其中pWnd为接收这个消息的窗口句柄,uMsg为要通过消息发送的数据,是长整型。这两个消息的发送可以分别在一个发送函数里实现,其具体的做法见以后的实例。通过实验可知,这两种自定义消息的发送效果是一样的。
在接收消息的程序中,除与发送消息的程序需要定义相同的消息外,还需要定义相应的消息映射和消息映射函数,消息的映射方法如下:
ON_MESSAGE(WM_COMM,OnUserReceiveMsg)
ON_REGISTERED_MESSAGE(wm_nRegMsg,OnRegReceiveMsg)
与以上消息映射对应的函数定义如下:
void CDataRecvDlg::OnUserReceiveMsg(WPARAM wParam,LPARAM lParam)
{
       // 增加用户自定义程序代码

}
//--------------------------------------------------------------------
void CDataRecvDlg::OnRegReceiveMsg(WPARAM wParam,LPARAM lParam)
{
// 增加用户自定义程序代码

}
其中OnUserReceiveMsg()函数为WM_COMM消息的映射函数,OnRegReceiveMsg()函数为wm_nRegMsg消息的映射函数。可以看出,这两种消息的映射函数形式是一样的。
3.3.2   通过自定义消息实现进程间通信的实例
为说明以自定义消息实现进程之间的通信,作者用VC++
编写了这样的程序。有两个对话框程序,其中一个为发送程序,另一个为接收程序。在这两个程序中分别定义了两个消息WM_COMM和wm_nRegMsg,在CDataSendDlg类中增加了用于发送数据的两个函数,即void
CDataSendDlg ::OnSendUsermsg()和void CDataSendDlg::OnSendRegmsg()。它们的源代码如下:
void CDataSendDlg::OnSendUsermsg()
{
       UpdateData();                                                                     // 更新数据
       CWnd *pWnd=CWnd::FindWindow (NULL,_T("DataRecv"));     // 查找DataRecv进程
       if(pWnd==NULL){
               AfxMessageBox(TEXT("Unable to find DataRecv."));
               return;
       }
       UINT uMsg;
       uMsg=atoi(m_strUserMsg);
       pWnd->SendMessage(WM_COMM,NULL,(LPARAM)uMsg);     // 发送.
}
//--------------------------------------------------------------------
void CDataSendDlg::OnSendRegmsg()
{
       UpdateData();                                                                     // 更新数据
       CWnd *pWnd=CWnd::FindWindow(NULL,_T("DataRecv"));     // 查找DataRecv进程
       if(pWnd==NULL){
               AfxMessageBox("Unable to find DataRecv.");
               return;
       }
       UINT uMsg;
       uMsg=atoi(m_strRegMsg);
       pWnd->SendMessage(wm_nRegMsg,NULL,(LPARAM)uMsg); // 发送
}
在接收数据的程序中要做三件事:①定义自定义消息;②定义消息映射表;③定义消息映射函数。自定义消息的方法如前面所述。在CDataRecvDlg类中增加了两个用于接收数据的函数,即void
CDataRecvDlg::OnUserReceiveMsg()和void CDataRecvDlg:: OnRegReceiveMsg()。消息映射表如下:
BEGIN_MESSAGE_MAP(CDataRecvDlg, CDialog)
       //{{AFX_MSG_MAP(CDataRecvDlg)
       ON_MESSAGE(WM_COMM,OnUserReceiveMsg)
       ON_REGISTERED_MESSAGE(wm_nRegMsg,OnRegReceiveMsg)
       //}}AFX_MSG_MAP
END_MESSAGE_MAP()
消息映射表中的映射函数名的格式是一样的。其实它们可以 用同一个函数,为了说明方便,这里把它们的名字取为不一样。接收数据程序中的消息映射函数的源代码如下:
void CDataRecvDlg::OnUserReceiveMsg(WPARAM wParam,LPARAM lParam)
{
       m_strUserMsg.Format("%d\n",int(lParam));
       UpdateData(FALSE);     // 更新数据
}
//--------------------------------------------------------------------
void CDataRecvDlg::OnRegReceiveMsg(WPARAM wParam,LPARAM lParam)
{
       m_strRegMsg.Format("%d\n",int(lParam));
       UpdateData(FALSE);     // 更新数据

}

转载自:http://blog.sina.com.cn/s/blog_4ce06889010008sw.html



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MFC中传递消息的方法 的相关文章

  • MFC和ATL之间的根本区别是什么?

    假设我是only将它们用于 普通 GUI 程序 没有 COM 没有 ActiveX 没什么花哨的 我将看到 ATL 和 MFC 之间的根本区别是什么 以帮助我弄清楚使用哪一个 我在网上做了一些搜索 但最终没有一个答案真正回答了我的问题 ht
  • 如何正确捕获 Aero/DWM 上的特定窗口

    背景资料 我编写了这个 MFC 应用程序并使用了很长时间 当用户按下 Print Screen Alt Print Screen 键时 它几乎会自动将屏幕截图保存到硬盘 我一直推迟使用任何与 Aero 相关的东西 直到现在我已经使用 Win
  • 同时显示同一文档的多个视图

    如何说服 MFC 文档 视图体系结构让我同时显示同一文档的两个不同视图 例如 说我的CDocument子类代表某种描述的档案 我想要一个用户界面 其中该存档中的所有条目的名称都显示在CListView子类显示在左侧窗格中 而当前所选条目的详
  • C++ Builder vs Delphi vs MFC

    我正在学习MFC 发现它不太好用 我听说过很多关于 Delphi 的事 对 Delphi 的研究让我接触到了 C Builder C Builder 是否提供了 C MFC 的严肃且良好的替代方案 C Builder 比 MFC 更好吗 C
  • dll 中的 MFC LoadString 失败

    我在 dll 中有一个静态函数 它使用 LoadString 从资源加载字符串 当我从该 dll 调用此函数时 一切正常 但是 当我从其他模块 activeX 控件 调用此函数时 LoadString 失败并出现错误 ERROR RESOU
  • GetWindowRect 坐标不与屏幕相关

    我正在使用 Visual Studio 2008 C 工作 我有一个 MFC 对话框 里面有一个控件 我正在尝试在控件中放置另一个对话框 第二个对话框上的 SetWindowPos 显然使用屏幕坐标 因此我需要获取控件或父对话框的屏幕坐标
  • 如何将 unicode 字符变成小写字母

    我在 VC MFC 中将 unicode 字符转换为小写字母时遇到问题 我在 CString 变量中有 unicode 字符 所以 使用英语 MakeLower 工作正常 我得到小写字母 但它无法将 unicode 字符转换为小写 我确实尝
  • 如何向现有 Win32 C++ 项目添加 MFC 支持?

    我正在创建一个 C 应用程序 它使用 Qt 创建 GUI 但是 我需要使用依赖于 MFC 的第三方库 用于 CString 等 无论如何 是否可以将 MFC 添加到我的应用程序中以允许我使用这个库 或者我需要自己重写它 I saw 这个问题
  • 当窗口未最大化时缺少 WM_NCLBUTTONUP 消息的奇怪问题

    我有一个处理 WM NCLBUTTONUP 消息的窗口 以便处理标题栏中自定义按钮的点击 当窗口最大化时 这非常有效 但当窗口未最大化时 WM NCLBUTTONUP 消息永远不会到达 不过我确实收到了 WM NCLBUTTONDOWN 消
  • 如何找到激活时打开给定 HMENU 的菜单项(如果有)?

    我想用原型实现一个功能 Locates the menu item of the application which caused the given menu mnu to show up return true if the given
  • MFC:如何在一个函数中捕获对话框每个控件的设置焦点

    我有 n 个对话框 它们具有相同的基本对话框 每个对话框都有自己的控件 编辑框 组合框 列表控件 etc 在基本对话框中 如何设置每个控件的焦点消息 例如 给出一个消息框 text Hello I got focus my ID is d
  • 在Linux上运行MFC程序

    我有一个相当大的基于 MFC 的程序 我的任务是让它在 Linux 上运行 我已经解释过 这需要将程序重新编写为带有 STL 的直接 C 更多工作 或者重新编写为 Qt C 更少工作 现在我被告知 我需要编写包装器以使每个 MFC 类在 L
  • 如何将命名管道字符串从非托管代码空间发送到托管代码空间?

    我似乎遇到了命名管道 101 问题 我有一个非常简单的设置来连接从 C 非托管应用程序传输到 C 托管应用程序的单工命名管道 管道已连接 但我无法通过管道发送 消息 除非我关闭似乎刷新缓冲区并传递消息的句柄 就好像消息被屏蔽了一样 我尝试颠
  • 如何通过单击 MainFrame 内的按钮来更改 MFC 视图

    我想通过单击窗口内的按钮来更改呈现的视图像这样 https i stack imgur com 3IA2o png 我的项目设置 我制作了一个没有文档 视图支持的 MFC 项目 SDI 我在设计器中又创建了两个视图并向它们添加了类 新的视图
  • _CrtDumpMemoryLeaks( ) == 1 在第一行代码上?

    我正在开发一个 MFC Visual C 项目 据我了解MSDN http msdn microsoft com en us library d41t22sb 28v VS 100 29 aspx CrtDumpMemoryLeaks 应该
  • 实现批量记录获取

    在程序开始时 我需要将数据从 MS Access 数据库 mdb 读取到下拉控件中 这样做是为了每当用户在该控件中键入内容时 应用程序都可以自动完成 不管怎样 从数据库中读取数据花了很长时间 所以我想我应该实现批量行获取 这是我的代码 CS
  • 如何使用 MFC 禁用顶级菜单项并使其变灰

    我有一个对话框应用程序 我希望在对话框顶部有可单击的菜单项 这些项目不显示下拉菜单 但实际上运行关联的命令 我通过在对话框属性中设置 Popup False 并分配消息 ID 来做到这一点 但我的问题是 当项目可点击没有意义时 无法正确禁用
  • 捕获由纯 C++ dll 中的 MFC 应用程序生成的 Windows 消息

    首先 这可能吗 我有一个与某些硬件接口的第三方 dll 它是用MFC编写的 我 从 dll 供应商处 收到了一个示例 Visual Studio 2010 解决方案 该解决方案只有一个项目 调用相关第三方 dll 的 MFC 应用程序 ex
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 用于基于 MFC 的 GUI 应用程序的免费自动化测试工具

    我是 Windows 开发和测试平台的新手 我正在开发一个基于 MFC 的 GUI 应用程序 并正在寻找有助于 UI 自动化测试的工具 我搜索时出现了一大堆工具 但大多数似乎都不支持MFC 我考虑的选项是 A 编码 UI UI 自动化 看起

随机推荐

  • Web 前端开发技术 —— JavaScript

    Web 前端开发技术 JavaScript 总结 JavaScript 内容 文章目录 Web 前端开发技术 JavaScript 一 js 的引用方式与执行顺序 1 引用方式 在标签中直接写 js 代码 复用 js 代码 通过 impor
  • PL/SQL DEVELOPER执行计划的查看 (转)

    字号 订阅 这里 我学到的一个很重要的东西 就是用 PL SQL DEVELOPER去看一条 SELECT语句的执行计划 执行计划里面可以看到这条 SELECT语句的开销 I O操作开销等数值 可以很清晰地看到语句各个部分的执行效率 选中这
  • 电子科技大学操作系统期末复习笔记(二):进程与并发控制

    目录 前言 进程管理 进程基本知识 程序的顺序执行 前趋图 程序的并发执行 并发程序 进程的定义和特征 进程的特征和状态 操作系统内核 定义 功能 原语 原子操作的实现 操作系统控制结构 进程控制块PCB 进程组织 进程树 进程的创建 进程
  • openwrt路由器不断重启问题原因

    重新烧固件之后 openwrt不断重启 df h一看root的空间已满 这说明了原因是flash存储容量不够了 减掉一些不需要的功能重新编译烧固件 或者增加存储来解决吧
  • 解决 docker 容器无法通过 IP 访问宿主机问题

    问题起源 在使用 docker 的过程中我不幸需要在 docker 容器中访问宿主机的 80 端口 而这个 80 端口是另外一个容器 8080 端口映射出去的 当我在容器里通过 docker 的网桥 172 17 0 1 访问宿主机时 居然
  • 如何搭建从DNS服务器

    准备 两台主机 一台主 一台从 1 在从节点 vim etc named rfc1912 zones zone magedu com type slave masters 192 168 37 7 file slaves magedu co
  • m皇后(小白版)

    m皇后 牛客 题目链接 本题 https ac nowcoder com acm problem 15295 八皇后问题 题目链接 NOI http noi openjudge cn ch0205 1700 洛谷 https www luo
  • CSS in JS之styled-components

    代码已经关联到github 链接地址 觉得不错可以顺手点个star 这里会持续分享自己的开发经验 我们都知道 JSX是JS语法的扩展 增加了对HTML语法的支持 那距离all in js就只差一个CSS语法支持了 目前实现该功能的库比较出名
  • vue 使用 Animate.css 实现 联系我们 组件开发

    首先 要清楚 Animate css 是一个 css动画库 为我们封装好了动画效果 我们只需要根据需求选择对应的css写入到div上即可 animate css https animate style fade title 淡入淡出 fad
  • Tensorflow object detection API源码分析之如何构建模型

    模型的具体参数被定义在config文件中 如samples configs ssd mobilenet v2 coco config model ssd num classes 90 box coder faster rcnn box co
  • Obsidian中HTML本地图片无法显示问题

    问题分析 我之前在记笔记的markdown中插入图片时 都是用 img src imgs lw68 png width 15 这样的形式 好处是方便大小和位置的调节 但用Obsidian直接打开原先的markdown文件时 这些图片是无法显
  • 计算机如何执行(运行)程序

    1 1 计算机如何执行 运行 程序 当打开计算机时 主内存 RAM 是空的 计算机要做的第一件事就是将操作系统从硬盘加载到主存 RAM 中 操作系统被加载到主存 RAM 后 可以执行 运行 任何您希望运行的程序 应用程序软件 通常通过点击
  • [948]Pandas数据分组的函数应用(df.apply()、df.agg()、df.transform()、df.applymap()、df.groupby())

    文章目录 apply 数据聚合agg 数据转换transform applymap groupby apply 分组 分组 可迭代对象 其他轴上的分组 通过字典或者Series分组 通过函数分组 分组计算函数方法 多函数计算 agg 将自己
  • vue简单的倒计时组件

    例如想要获取今年的国庆倒计时 2023 10 1 可以先在组件中定义好时间 可以在props中给默认值 方便可以在组件中切换其他时间 默认给今年国庆 vue2语法 props date type String default 2023 10
  • 概率论 - 常见分布(及其分布表)

    分布表在对应的分布下边 离散型的分布 一 0 1分布 二 几何分布 三 二项分布 四 泊松分布 五 超几何分布 连续性的分布 一 均匀分布 二 指数分布 三 正态分布与标准正态分布 格格不入的三个分布 一 卡方分布 二 t 分布 三 F 分
  • RabbitMQ延时消息队列

    1 延时队列介绍 延时队列即放置在该队列里面的消息是不需要立即消费的 而是等待一段时间之后取出消费 那么 为什么需要延迟消费呢 我们来看以下的场景 网上商城下订单后30分钟后没有完成支付 取消订单 如 淘宝 去哪儿网 系统创建了预约之后 需
  • visual studio 2019 sql server localdb 数据库中文乱码解决方法

    今天使用localdb学习asp net core时 发现写入localdb数据库的中文为乱码 按照网上的方法解决 却无法显示 这里只有用sql语句更改了 参考这个 但我试了不成功 用sql语句更改可以 https www cnblogs
  • vue 生成条形码、二维码

    条形码 1 安装 cnpm install jsbarcode save 2 引入 import JsBarcode from jsbarcode 3 二维码容器
  • STM32理论 —— 定时器、时钟

    文章目录 1 定时器 1 1 分类与简介 1 1 1 分类与主要功能特点 1 1 2 三种常用的定时器简介 1 1 3 三种计数模式 1 1 4 定时器计数原理 1 1 5 如何快速定位定时器对应IO 引脚 1 2 时钟来源 1 3 通用定
  • MFC中传递消息的方法

    通过自定义消息实现进程间通信的方法 消息分为两种 即系统消息和用户 程序设计者 自定义消息 系统消息定义从0到0x3FF 可以使用0x400到0x7FFF定义自己的消息 Windows把0x400定义为WM USER 如果想定义自己的一个消