今天自己也重学了一下 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指针仍然有效。

原文:https://blog.csdn.net/code_robot/article/details/7724667

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

  1. Java黑皮书课后题第7章:*7.12(倒置数组)7.7节中的reverse方法通过复制到新数组实现倒置。改写方法将参数中传递的数组倒置,并返回该数组。编写一个测试程序,输入10个数字,倒置它们并显示

    7.12(倒置数组)7.7节中的reverse方法通过复制到新数组实现倒置.改写方法将参数中传递的数组倒置,并返回该数组.编写一个测试程序,输入10个数字,倒置它们并显示 题目 题目描述 破题 代码 ...

  2. 在hadoop中传递变量

    在hadoop中传递变量 @(HADOOP)[hadoop] 在主类中定义的变量,如定义了一个outputname,需要将其写入conf分发至其它nodemanager: Configuration ...

  3. url中传递对象参数_在URL参数中传递复杂对象

    url中传递对象参数 假设您想传递原始数据类型,例如复杂的Java对象 java.util.Data,java.lang.List,泛型类,数组以及通过URL参数所需的所有内容,以便在页面加载后在任何 ...

  4. 在URL参数中传递复杂对象

    假设您要传递原始数据类型,例如复杂的Java对象 java.util.Data,java.lang.List,泛型类,数组以及通过URL参数所需的所有内容,以便在页面加载后在任何网页上预设默认值. 共 ...

  5. QT中使用全局变量在多个源程序中传递变量

    使用QT5.5开发一个程序,有时需要多个源文件,包括若干个头文件和若干个定义文件.因此如何在多个源程序间开发传递变量就成了一个关键问题.一般来说在多个源程序间传递变量大概有两种方法: 一.是将全局变量 ...

  6. python传递变量_在Python中传递变量

    您需要将read_one_file()的结果存储在某个地方.你到底是什么 处理return语句就是创建结果的元组.那么你呢 当你调用read_one_file时,必须解包这个元组.下面是一个例子:(i ...

  7. 如何在正则表达式中使用变量?

    我想在JavaScript中创建String.replaceAll()方法,并且我认为使用正则表达式是最简洁的方法. 但是,我不知道如何将变量传递给正则表达式. 我已经可以这样做了,它将用" ...

  8. ajax中的url如何传递变量_如何创建和参数化UDT数据类型中的变量及IN,OUT 等参数?...

    从数据类型的意义上说 UDT 并不被 CPU 所识别,而是在离线程序中自定义(组合)的数据类型. S7 程序的自定义数据类型并不能装载到 S7 CPU 中.UDT 是由递增的编辑器创建并编辑或由源文件 ...

  9. Java中传参数--值传递和引用传递

    ** Java中传参数–值传递和引用传递 ** 在Java中,传参数分为值传递和引用传递. 在Java中的数据类型分为两大类:一类是引用类型,也叫类类型(除了String以外的所有复合数据类型,包括数 ...

最新文章

  1. mybatis的一对一 一对多 多对多
  2. MD5加密解密帮助类
  3. 使用Transact-SQL进行数据导入导出方法详解
  4. Android中finish()、System.exit()、KillProcess()的区别
  5. react使用引入svg的icon;svg图形制作
  6. Qt中的角度和正方向描述清单
  7. 项目下创建文件_Linux 下创建和使用交换文件
  8. c++ 在函数中传递数组和sizeof用法注意事项
  9. 牛客网编程题——字符串_空格替换
  10. Gmail最新功能实测:离线版上线增加手势(多图)
  11. maya python 游戏与影视编程指南pdf_Maya Python 游戏与影视编程指南
  12. 2021年网络空间安全学院预推免面试经验总结
  13. c语言编写生日祝福语大全,最经典的生日祝福语(精选50句)
  14. 1302: PIPI的族谱(二叉树)
  15. 灰度共生矩阵(GLCM)计算速度快很多,用numpy写的
  16. Word如何设置单元格垂直居中
  17. rocketMQ报错:No accessKey is configured
  18. 你真的了解牛顿第一定律吗
  19. [SEO名词]SEO是什么意思,如何理解?
  20. Java应用在docker环境配置容器健康检查,如何保证消息队列的高可用

热门文章

  1. sqlmap安装_黑客神器系列篇章之“sqlmapquot;
  2. 福建省计算机学会 noip比赛,重磅!福州一三附学生领衔全省前九名!他们将代表福建参加全国比赛!...
  3. sql server配置连接oracle数据库,MS SQL Server连接Oracle
  4. 安卓换语言java_Android应用程序的语言切换
  5. 最大化_基于最大化互信息的学习目标
  6. 基于MATLAB的摩尔斯电码系统设计
  7. 我的世界java版记分板_我的世界计分板教程 计分板指令详解
  8. php获取汉字的长度,php中处理汉字字符串长度:strlen和mb_strlen
  9. java负数转换二进制表示_Java中的负数的在计算机中的二进制表示,以及与十进制的相互转换...
  10. 商业银行vh是哪个银行的简称_各个银行的字母缩写?