如何正确使用SendMessage进行发送消息

1、SendMessage的基本结构:

SendMessage(

HWND hWnd, //消息传递的目标窗口或线程的句柄。

UINT Msg, //消息类别(这里可以是一些系统消息,也可以是自己定义,下文具体介绍,)

WPARAM wParam, //参数1 (WPARAM 其实是与UINT是同种类型的,

LPARAM lParam); //参数2

其中一些参数的由来如下:

//typedef unsigned int UINT;

//typedef UINT WPARAM;

//typedef LONG LPARAM;

//typedef LONG LRESULT;

2、用法实例:

 1 void CTextShow::OnBnClickedGraybtn()
 2 {
 3     // TODO: 在此添加控件通知处理程序代码
 4     MyDib dib(FilePathStr);
 5     dib.BitmapToIplImage();
 6     int width=dib.GetWidth();
 7     int height=dib.GetHeight();
 8     IplImage* src=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
 9     cvCvtColor(dib.pIplImage,src,CV_RGB2GRAY);
10     cvSmooth(src,src,CV_MEDIAN,11);
11     cvThreshold(src,src,40,255,CV_THRESH_BINARY);
12     ::SendMessage(this->m_hWnd,WM_SHOWIMAGE,0,(LPARAM)src);
13 }

实现在新建对话框中,点击灰度按钮,能将图片转化二值图,其中SendMessage就是二值图给显示出来;点击后,发给带参数的消息(WM_USER+1)给主窗口,WM_SHOWIMAGE就是自定义消息的标识符,首先需要新建对话框设置为主窗口,在CTextShow的构造函数加入:

1 AfxGetApp()->m_pMainWnd=this;

所以SendMessage中this->m_hWnd就是主窗口,而将其改为GetDlgItem(IDC_PICShOW)->m_hWnd,其中IDC_PICSHOW是显示图片控件的ID,不知道为什么显示不出来图片。具体流程:

1)在接收消息的窗体以及线程所在的头文件里定义:#define WM_SHOWIMAGE  WM_USER+1

2)然后接下来定义一个消息需要映射的函数,如下: afx_msg LRESULT OnShowImage(WPARAM wParam, LPARAM lParam);

      注意格式必须是:两个参数必不可少,返回类型一定为LRESULT

3)添加消息函数映射:ON_MESSAGE(WM_SHOWIMAGE,OnShowImage)

      注意这里必须是ON_MESSAGE, 不能使用ON_COMMAND, 前者主要针对用户自定义消息,后者针对WM_COMMAND命令,比如菜单、工具栏等.

4)实现消息函数:

1 LRESULT CTextShow::OnShowImage(WPARAM wParam, LPARAM lParam)
2 {
3     IplImage* plmgSrc=(IplImage*)lParam;
4     CIplImageToBitmap IplImageToBitmap;
5     IplImageToBitmap.ShowImageAuto(plmgSrc,GetDlgItem(IDC_PICSHOW));
6     return 0;
7 }

3、总结:

无论时利用MFC向导还是手动添加消息处理时,都需要在源文件中增加三处代码:

1、在类的定义中添加消息处理成员函数的函数声明。

2、在类的消息映射表中加入相应的消息映射表项。

3、在类的实现中加入该消息处理成员函数的函数实现。

如果时自定义消息,则还需要在头文件中定义自定义消息的宏。

例如:要在ABC类中添加个自定义消息UM_AAA的处理,当消息产生的时候,响应OnAAA( )函数。可以按照下面四个步骤来实现:

1、在头文件ABC.H中定义自定义消息的宏。

#define UM_AAA WM_USER+1

在windows系统中提供了大量的消息的同时可以给用户自定义消息提供了空间,我们在自定义消息的宏的时,只有选择WM_USER以上的数值就不会与系统提供的消息冲突了。

2、在头文件ABC.H中声明消息响应函数的OnAAA( )。

protected:

//{{AFX_MSG (ABC)

afx_msg void OnAAA( );

//}}AFX_MSG

DECLARE_MESSAGE_MAP( )

消息响应函数应该放在DECLARE_MESSAGE_MAP( )之前,AFX_MSG注释宏之间。该函数声明前不有一个afx_msg限定符,这也是一个宏,这个宏表面这个函数是一个消息响应函数的声明。

3、进行消息映射

BEIGIN_MESSAGE_MAP(ABC)

//{{AFX_MSG_MAP(ABC)

ON_MESSAGE(UM_AAA, OnAAA)

//}}AFX_MSG_MAP

END_MESSAGE_MAP( )

在END_MESSAGE_MAP( )之前的AFX_MSG_MAP注释宏之间用ON_MESSAGE( )将UM_AAA和OnAAA响应函数相关联起来。

4、在ABC.CPP中将消息响应函数的实现

void OnAAA( )

{……}

只有按照上面的4个步骤,就可以根据自己的需要,在系统程序中添加合适的消息和响应函数了。

				
时间: 2024-10-05 16:40:51

如何正确使用SendMessage进行发送消息的相关文章

Delphi7从子线程中发送消息到主线程触发事件执行

[转载]Delphi7从子线程中发送消息到主线程触发事件执行 在对数据库的操作时,有时要用一个子线程来进行后台的数据操作.比如说数据备份,转档什么的.在主窗口还能同是进行其它操作.而有时后台每处理一个数据文件,要向主窗口发送消息,让主窗口实时显示处理进度在窗口上(可视),同时进行日志处理等.我用的是下面的方法: [1]用到的API函数: RegisterWindowsMessage ---------------------- 函数功能:该函数定义一个新的窗口消息,该消息确保在系统中是唯一的.返

一步一步来做WebQQ机器人-(五)(发送消息||完结)

× 本篇主要是: 发送QQ消息(to:好友,群),以及对小黄鸡抓包利用它的语言库 本文是WebQQ流程的最后一章 最后一章内容不多但我还是啰嗦,可能对大部分人都已知晓的流程方法我也会介绍一下 前面几个demo我已经上传到对应页面的尾部,剩下的会抽时间补,外包经常加班且没外网,尽量本周弄完 目前总进度大概100% 全系列预计会有这些步骤,当然某些步骤可能会合并: 验证码 第一次登陆 第二次登陆 保持在线和接收消息 获取好友和群列表 发送消息 变成智能的(*?∀?*) 回顾基础 一般抓包模拟请求的方

微信企业号回调模式验证与发送消息

最近放假闲着无聊,研究了一下微信企业号, 打算通过企业号做一个运维报警信息发送的功能,记录自己的操作 第一步 注册企业号,网上一搜一大把的教程,这里略过  微信企业号登录地址  https://qy.weixin.qq.com/ 第二步  登录后 点左侧 应用中心 -新建应用 第三步  在第二步第一图中的自建应用下面找到刚刚新建的应用 拉到最下面有一个模式选择,点击回调模式 会看到下图界面 Token 和EncodingAESKey 点击随机获取即可,上面的url需要你有自己的服务地址  你的服

Winform 程序嵌入WPF程序 并发送消息

废话不多说,先看解决方案目录 WindowsFormsDemo是主程序,WpfApp是嵌入的WPF程序,先看WPF程序,程序默认启动的页面是MainWindow.xaml,这里注释掉App.xaml里的StartupUri="MainWindow.xaml",后台设置启动的Uri,将原来的空的App类改成一些内容(也可以不改) /// <summary> /// App.xaml 的交互逻辑 /// </summary> public partial class

使用DWR长连接技术实现客户端一对一发送消息

关于DWR怎么使用我的上一篇博文里面记录了,这里写一个DWR一对一消息推送的WEB程序,也就是WEB一对一聊天.我的思路是这样的:首先每个用户在登陆后在各自的页面放置一个唯一标记(如用户的ID,也可以放在session里面),用户A向用户B发送的消息 -->服务器 -->JAVA方法-->JAVA方法调用前端所有正在访问聊天页面的JS函数-->JS判断消息发送至的客户端是否是用户B -->是则显示,否则不显示:用户B向A同样过程 首先是该项目的web.xml文件: <?

Android:子线程向UI主线程发送消息

在Android里,UI线程是不允许被阻塞的,因此我们要将耗时的工作放到子线程中去处理. 那么子线程耗时处理后要怎样通知UI线程呢? 我们可以在UI主线程中创建一个handler对象,然后通过重写其handleMessage(Message msg)的方法,该方法会接收到子线程中的handler对象的sendMessage((Message msg)发回来的消息.这样一发一收就完成工作: 而关于主线程向子线程发送消息的内容可以看我的上一篇博客,其中讲到了Looper类及其两个重要方法和实现原理.

微信企业号开发:主动发送消息

主企业号主动发送消息,也就是企业号主动推送的消息,适合于企业的通知,通告等.因此如果公司有通知,要求通知到所有员工,就应该使用主动发送消息. 格式是json格式,而且微信很灵活,当touser,toparty,totag的json值是null时,微信服务器主动忽略了.原来还担心,如果是null,在生成json格式时如何忽略掉是null的字段. 核心基本类: public class MsgBase { public MsgBase() { this.safe = "0"; //表示是否

Android:主线程如何向子线程发送消息

今天讲一下,在Android中主线程如何向子线程中发送消息的问题. 或许回想无非就是创建一个Handler对象,然后一个线程发消息,另一个接收消息嘛-- 原理确实是这样,但是我们平时,是从子线程向主线程发消息,而主线程默认已经帮我们完成了Looper的操作,所以我们只需要简单的"创建一个Handler对象,然后一个线程发消息,另一个接收消息"-- 我们先说一下这个Looper是神马吧. 它就像一个消息队列(MessageQueue)的管家(Looper),一个消息队列只有一个管家,并且

RocketMQ3.2.2生产者发送消息自动创建Topic队列数无法超过4个

问题现象 RocketMQ3.2.2版本,测试时尝试发送消息时自动创建Topic,设置了队列数量为8: producer.setDefaultTopicQueueNums(8); 同时设置broker服务器的配置文件broker.properties: defaultTopicQueueNums=16 但实际创建后从控制台及后台打印代码观察到该Topic只创建了4个队列,反复重试确认发送消息时自动创建Topic,最大创建4个队列. 查找原因 服务端与客户端配置对比 阅读源码,在TopicConf