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

目录
  • 自定义消息
    • 第一步:定义自定义消息名称以及ID
    • 第二步:发送自定义消息
    • 第三步:自定义消息映射
    • 第四步:自定义消息实现
  • 模拟系统消息
    • wParam参数
    • LPARAM参数

在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)

看着这个方法是不是很熟悉?与自带的ComboBox方式是不是一模一样?后续的使用方式都是一致的啦!

到此这篇关于MFC模拟实现自定义消息发送的文章就介绍到这了,更多相关MFC自定义消息发送内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Visual C++中MFC消息的分类

    标准(窗口)消息:窗口消息一般与窗口内部运作有关,如创建窗口,绘制窗口,销毁窗口,通常,消息是从系统发到窗口,或从窗口发到系统.发送函数SendMessage()或者PostMessage().除WM_COMMAND之外,所有的以WM_开头的消息.从CWnd派生的类,都可以接受到这类消息.注意:标准消息并不需要我们指定处理函数名称,是默认的对应关系. 宏名称 对应消息 消息处理函数 ON_WM_CHAR WM_CHAR OnChar ON_WM_CLOSE WM_CLOSE OnClose ON

  • MFC对话框自定义消息映射的方法

    本文实例讲述了MFC对话框自定义消息映射的方法.分享给大家供大家参考.具体实现方法如下: 1.定义消息: 复制代码 代码如下: #define WM_MYMSG (WM_USER+100) 2.定义消息响应函数: LPESULT CSLYARDlg::OnMymsg(WPARAM wParam, LPARAM lParam) { // TODO return 0; } 3.在窗口类头文件的AFX_MSG中声明消息响应函数: // Generated message map functions /

  • MFC自定义消息的实现方法

    一.概述: 消息机制是windows程序的典型运行机制,在MFC中有很多已经封装好了的消息,如WM_BTN**等.但是在有些特殊情况下我们需要自定义一些消息去完成一些我们所需要的功能,这时候MFC的向导不能帮助我们做到这一点.对此,我们可以通过添加相应的代码去完成这个功能. 二.实现方法: 添加自定义消息操作如下: 1. 建立MFC工程,如基于对话框的应用程序,Test. 2. 在资源中添加要处理的消息的值,即在CTestDlg.h中添加 如下代码. (因为很多MFC的消息是在WM_USER内的

  • MFC模拟实现自定义消息发送

    目录 自定义消息 第一步:定义自定义消息名称以及ID 第二步:发送自定义消息 第三步:自定义消息映射 第四步:自定义消息实现 模拟系统消息 wParam参数 LPARAM参数 在MFC框架下,有很多系统已经定义好的消息,例如ON_WM_LBUTTONDOWN().ON_WM_MBUTTONDOWN()等等.我们在使用的时候只需要声明并调用就可以了,最简单的用法. 提升了一点难度的用法就是自己设置自定义消息,再提升一点难度的就是如何模拟系统消息了,一般情况下只是做普通的项目开发功能是用不到的. 在

  • java模拟post请求发送json的例子

    java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main.utils; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; public class HttpUtilTest { Log log = new Log(this.getClass());//初始化

  • express+mockjs实现模拟后台数据发送功能

    前言: 大多数时候,前端会和后端同时进行开发,即在我们开发完页面的时候,很可能还不能立马进入联调阶段,这个时候,为了保证我们接口的有效性和代码的功能完整,我们可能需要模拟数据. 模拟数据方法 1.通过js变量模拟后台数据 优点:不需要服务器 缺点:需要造很多变量,同时还要将变量在我们的有效代码中使用,最后还得删除 2.通过ajax请求json文件 优点:只需要配置路径,就可以访问,进入联调阶段不用修改大量的js代码 缺点:ajax存在跨域问题,通常无法请求本地文件,即使火狐也存在不能访问不同文件

  • fiddler使用方法之Fiddler显示IP,Fiddler中文乱码解决方法以及fiddler模拟发送get/post请求

    Fiddler是一个HTTP的调试代理,以代理服务器的方式,监听系统的Http网络数据流动,是我们常用的抓包工具之一 今天为大家分享一下几个使用Fiddler的小技巧 一.Fiddler抓包中文乱码问题 解决方法: 1.打开windows注册表,找到  HKEY_CURRENT_USER\Software\Microsoft\Fiddler2 2.在右栏空白处点击右键新建,选字符串值,加上HeaderEncoding,然后值输入 GBK(建议设置为UTF-8) 温馨提示: HeaderEncod

  • Android中发送Http请求(包括文件上传、servlet接收)的实例代码

    复制代码 代码如下: /*** 通过http协议提交数据到服务端,实现表单提交功能,包括上传文件* @param actionUrl 上传路径 * @param params 请求参数 key为参数名,value为参数值 * @param file 上传文件 */public static void postMultiParams(String actionUrl, Map<String, String> params, FormBean[] files) {try {PostMethod p

  • 使用UrlConnection实现后台模拟http请求的简单实例

    使用UrlConnection实现后台模拟http请求的简单实例 这两天在整理看httpclient,然后想自己用UrlConnection后台模拟实现Http请求,于是一个简单的小例子就新鲜出炉了(支持代理哦): public class SimpleHttpTest { public static String send(String urlStr, Map<String,String> map,String encoding){ String body=""; Str

  • java利用java.net.URLConnection发送HTTP请求的方法详解

    一.前言 如何通过Java发送HTTP请求,通俗点讲,如何通过Java(模拟浏览器)发送HTTP请求. Java有原生的API可用于发送HTTP请求,即java.net.URL.java.net.URLConnection,这些API很好用.很常用,但不够简便: 所以,也流行有许多Java HTTP请求的framework,如,Apache的HttpClient. 目前项目主要用到Java原生的方式,所以,这里主要介绍此方式. 二.运用原生Java Api发送简单的Get请求.Post请求步骤

  • URLConnection发送HTTP请求的方法_动力节点Java学院整理

    如何通过Java发送HTTP请求,通俗点讲,如何通过Java(模拟浏览器)发送HTTP请求. Java有原生的API可用于发送HTTP请求,即java.net.URL.java.net.URLConnection,这些API很好用.很常用,但不够简便: 所以,也流行有许多Java HTTP请求的framework,如,Apache的HttpClient. 目前项目主要用到Java原生的方式,所以,这里主要介绍此方式. 运用原生Java Api发送简单的Get请求.Post请求 HTTP请求粗分为

  • 微信公众平台开发——群发信息

    1.目的 完成在微信公众号中群发消息.这里只是完成简单的文字发送.也可以发送语音图片等,只是发送数据格式不同而已,下面有链接,可以查询数据类型的数据发送格式. 2.群发短信的流程 获取测试公众账号(有账号的可以不用测试账号,不过正式的账号限制比较多) 用户关注上面的公众账号 通过appid和appsecret获取我们的access_token 通过access_token群发短信 3.获取测试公众账号 + 关注公众号 1).公众测试账号获取 访问上面的连接,选择"接口测试号申请"获得直

  • 木马下载器前仆后继,AOTU病毒群卷土重来(专杀4月15日升级到1.4版)

    以下是这两天极度猖獗的AUTO病毒最新变种的分析报告: 一.行为概述 该EXE是病毒下载器,它会: 1) 参考系统C盘卷序列号来算出服务名,EXE 和DLL 的文件名. 2) 在每一个驱动器下放置AUTO病毒autorun.inf 和自身副本auto.exe 并加系统和隐藏属性. 3) 在系统system32 下放置自身副本"随机名.exe "和释放出来的"随机名.dll" 并将它们伪装成具有隐藏属性的系统文件. 4) 修改系统键值,将系统隐藏文件选项删除,造成用户

随机推荐