【转载+修改】MFC 自定义消息四步曲与在参数中传递变量

原创 2012年07月07日 16:08:52

今天自己也重学了一下 VC小自定义消息的使用,在网上查阅了相关资料,发现http://hi.baidu.com/atlight/blog/item/11ba969442df6218d21b70cd.html这篇博文介绍的最好(在此谢过原文作者),所以就转过了,但自己增加了一些进一步的详细说明,我也是刚自学,不一定全正确,所以欢迎大家指正。

1. 定义全局变量或宏


#define WM_MyMessage (WM_USER + n)

n为数字到少大于100
或者用 const UINT WM_MYMESSAGE = WM_USER + n
一般可以加在stdafx.h 或resource.h 或*.app.h中。
只要是在全局变量头文件所以都可以.

2. 在所在类的*.H文件增加消息函数声明. 这一步跟定义普通函数一样,首先需要(在*.h)文件中对函数进行声明。


protected:
//{{AFX_MSG(CChildView)

afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

3.在所在类的实现文件*.CPP文件中增加消息映射(告诉程序当接受到WM_MyMessage消息时交付给哪一个函数响应消息) 和实现消息处理函数

BEGIN_MESSAGE_MAP(CChildView,CWnd )
//{{AFX_MSG_MAP(CChildView)

ON_MESSAGE(WM_MyMessage, OnMyMessage)

//}}AFX_MSG_MAP
END_MESSAGE_MAP()


//实现消息处理函数. 这一步类似于普通函数的具体实现
也就是说WM_MyMessage消息对应OnMyMessage函数

LRESULT 类名::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
return 0;
}


4. 以后就可以随时使用SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) 或 PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) 发送自定义的消息。

说明:
1:PostMessage()与SendMessage()函数的区别是:SendMessage()的消息直接发给窗口并调用相应的消息响应函数,消息不进消息队列,但直到消息响应函数处理完后SendMessage()才返回。而PostMessage()将消息放入消息队列后立即返回。

2:其中WPARAM wParam,LPARAM lParam二者为指针,所以发送自定义消息时如果想传相关参数,可以将参数的地址赋给这2个参数之一即可。如在发送自定义的消息的部分程序如下:

#define  MAX_LEN 50
	char para[MAX_LEN];
	strcpy(para, "this is a string parameter");
	int val = 100;	
	this->PostMessage(WM_MY_MESSAGE, (WPARAM)para, (LPARAM)(&val));
那么消息响应函数OnMyMessage()函数中的部分代码为:
#define MAX_STRING_LEN 100
	char pstr[MAX_STRING_LEN+1];
	strncpy(pstr, (char *)wParam, MAX_STRING_LEN);
	pstr[MAX_STRING_LEN]='\0';

	int val = *((int*)lParam);
	CString msg; 
	msg.Format("wParam = %s, val=%d\n", pstr,val);
	this->MessageBox(msg);


注意:由于说明1的区别,在传递参数时一定要注意如果是传递局部变量一定是用SendMessage()函数,如果是传递全局变量(而且在消息函数响应之前该全局变量不会被注销)则两种消息传递函数均可使用。 例如,在A()函数中调用PostMessage()函数发送消息时还传递了参数B,则由于PostMessage()函数发消息发送至消息队列之后立即放回,从而执行PostMessage()函数之后的语句,直至A()函数结束返回,这时A()函数中的所有局部变量(如B)全部被释放,所以当消息响应函数捕获到消息时,得到关于参数B的指针已经是一个野指针了;但是如果是用SendMessage()发送消息并传递参数B,由于A()中SendMessage()函数之后的语句要等消息响应函数处理完后才执行,所以在消息响应函数中的得到的B指针仍然有效。


利用自定义消息处理函数的WPARAM或LPARAM参数传递指针

原文地址::http://blog.csdn.net/dongfangyu/article/details/4372602 相关网帖 1、VC++的SendMessage函数如何利用wParam ...
  • xqhrs232
  • xqhrs232
  • 2014年02月09日 16:47
  • 1897

MFC 关于SendMessage 消息参数 传送字符串,结构体

今天在使用单文档程序时,弹出了一个新的对话框,由于是非模式对话框,当对话框结束后,需要根据一些消息传递参数到主窗体中 那么在对话框中使用了SendMessage 使用方法: GetParent()...
  • lunatic7
  • lunatic7
  • 2017年07月08日 21:51
  • 195

COM组件开发笔记--字符串数组的传递

COM编程的好处就是可以跨语言,我们公司是用C#做开发的,所以用C++去开发COM组件就可以弥补图形渲染性能上的不足。但COM组件也有它的缺点,就是COM接口本身的调用开销比较大,所以我总结了,使用C...
  • Sayesan
  • Sayesan
  • 2013年11月27日 17:04
  • 831

MFC中两个对话框之间数据传递

这里有两种情况, 第一种情况是: (在一个基于单文档的应用程序中,新建了两个对话框A和B,并且用两个独立的类和他们关联) 对话框A中有一个编辑框, 按下A中的一个按钮a后弹出对话框B, B中也有一个...
  • foreverhuylee
  • foreverhuylee
  • 2014年03月21日 11:56
  • 25589

MFC 自定义消息四步曲与在参数中传递变量

本文转载自:http://blog.csdn.net/code_robot/article/details/7724667 今天自己也重学了一下 VC小自定义消息的使用,在网上查阅了相关资料,发...
  • cwt19902010
  • cwt19902010
  • 2016年11月23日 16:59
  • 529

利用自定义消息处理函数的WPARAM或LPARAM参数传递指针

原文地址::http://blog.csdn.net/dongfangyu/article/details/4372602 相关网帖 1、VC++的SendMessage函数如何利用wParam ...
  • xqhrs232
  • xqhrs232
  • 2014年02月09日 16:47
  • 1897

MFC下的多线程和自定义消息收发

不仅在MFC的程序中,其他设计库如qt,也会存在运行时界面卡死的问题,导致这个问题的原因是内部存在多次循环,界面更新函数处理不过来,消息队列阻塞。为解决这一问题,多线程是首选。也有通过在单线程循环中P...
  • qwtyuiop
  • qwtyuiop
  • 2014年11月17日 21:48
  • 1213

MFC中自定义消息方法及如何得到消息处理函数的返回值

在MFC程序设计中,使用自定义消息通常有如下几种类型: A.     自定义窗口消息 B.     自定义工具栏消息 C.     自定义菜单栏消息 D.     自定义右键菜单消息   ...
  • no_Talent
  • no_Talent
  • 2013年09月18日 11:42
  • 1773

MFC中自定义消息的步骤

 这篇技术文章不是讨论经典的MFC中的消息工作机理的,讨论消息工作原理、方式和路径的文章在网上和书本中 随处可见。网上众多的讨论都是关于如何响应并进行用户自定义消息映射的;网上还有一些文章...
  • ljsant
  • ljsant
  • 2016年07月11日 14:29
  • 717

MFC中自定义消息过程

这几天接触一个MFCdi
  • feilong911hao
  • feilong911hao
  • 2014年05月29日 10:36
  • 670
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【转载+修改】MFC 自定义消息四步曲与在参数中传递变量
举报原因:
原因补充:

(最多只允许输入30个字)