vc中SendMessage自定义消息函数用法实例

 更新时间:2014年10月22日 12:04:29   投稿:shichen2014  
这篇文章主要介绍了vc中SendMessage自定义消息函数用法,以实例实行详细讲述了SendMessage的定义、原理与用法,具有一定的实用价值,需要的朋友可以参考下

本文实例讲述了vc中SendMessage自定义消息函数用法,分享给大家供大家参考。具体如下:

SendMessage的基本结构如下:

复制代码 代码如下:
SendMessage(
    HWND hWnd,  //消息传递的目标窗口或线程的句柄。
    UINT Msg, //消息类别(这里可以是一些系统消息,也可以是自己定义,下文具体介绍,)
    WPARAM wParam, //参数1 (WPARAM 其实是与UINT是同种类型的,
  //在vc编译器中右键有个“转到WPARAM的定义”的选项可以查看。
    LPARAM lParam); //参数2

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

//typedef unsigned int UINT;
//typedef UINT WPARAM;
//typedef LONG LPARAM;
//typedef LONG LRESULT;

例如可以用以下语句:

复制代码 代码如下:
::SendMessage(this->m_hWnd, WM_MY_DOSOME, (WPARAM) 0, (LPARAM) 0);

这里我发送的消息是本窗体接收的,所以句柄用:this->m_hWnd
这里的消息类别WM_MY_DOSOME就是我自定义的,
在接收消息的窗体或线程所在的头文件里:

复制代码 代码如下:
#define WM_MY_DOSOME WM_USER+1 // do something

当然你还可以定义更多如:
复制代码 代码如下:
#define WM_DOOTHER WM_USER+2 // do other

表示要做一些事情。

到这里,可能大家还是对消息类别有点模糊,不要担心,下面很快就讲到。
我们发了一个消息出去,那么接收方要能识别这个消息是干什么,就是通过消息类别来区分,并且开始去做这个消息对应要处理的事情。如下:

一、编写一个事情:
我们在接收窗体里定义一个这样的事情(过程),

复制代码 代码如下:
afx_msg LRESULT DoSomeThing(WPARAM iParam1,LPARAM iParam2)
{
 MessageBox("收到消息了,我要开始做一些事情了。","收到",MB_OK);
 //可以运用iParam1,iParam2 来做一些事情。
 return 0;
}

这个事情有3点大家要注意,非常重要:

1. 使用了afx_msg,并且要将afx_msg LRESULT DoSomeThing(WPARAM iParam1,LPARAM iParam2)
改写到头文件的
//{{AFX_MSG
//。。。改写到这里,颜色会变成灰的。这一点非常重要。
//}}AFX_MSG
2. 参数有2个,WPARAM iParam1,LPARAM iParam2,哪怕没有东西传进来也要写,不然会吃苦头的,vc里不会提醒你少写了一个,
但一些莫名奇妙的事情会发生。
3. 类型用 LRESULT,完了要return 0;

二、让接收方知道什么时候做这个事情:
我们在

复制代码 代码如下:
//{{AFX_MSG_MAP
//。。。这里写上
ON_MESSAGE(WM_MY_DOSOME,DoSomeThing)
//如果还有其他消息就再写一个
ON_MESSAGE(WM_DOOTHER,DoOther)
//}}AFX_MSG_MAP

到这里,当你用SendMessage,发了一个WM_MY_DOSOME类型的消息过来的时候,接收方就会去做DoSomeThing(WPARAM iParam1,LPARAM iParam2)
发了一个WM_DOOTHER类型的消息过来的时候,接收方就会去做DoOther(WPARAM iParam1,LPARAM iParam2)当然,这里DoOther我还没有定义。

这样就是一个完整的消息发送与接受过程,这里没有详细讲参数,iParam1,因为还没有用到很复杂的情况,

在头文件里:

复制代码 代码如下:
#define WM_MYMSG  WM_USER+5 //自定义一个消息

afx_msg void OnMyMessage(WPARAM wParam, LPARAM lParam); //自定义消息的处理函数声明

在.cpp文件里:

复制代码 代码如下:
ON_MESSAGE(WM_MYMSG, OnMyMessage)
//利用ON_MESSAGE()宏在自定义消息与其处理函数间建立映射关系

void CModelessDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
//从lParam中取出CString对象的指针,并将字符串内容在IDC_MSGEDIT中显示出来
{

    CString *str;
    str=(CString *)lParam;

    SetDlgItemText(IDC_EDIT,*str);
}

按下按钮发送消息

复制代码 代码如下:
void CModelessDlg::OnMsgBTN()
{
 CString str= "自定义消息被触发了!";
 SendMessage(WM_MYMSG, 0, (LPARAM) &str);
 //给ModelessDlg自己发一个自定义的消息
}

希望本文所述对大家的VC程序设计有所帮助。

相关文章

  • C++中rapidjson将嵌套map转为嵌套json的讲解

    C++中rapidjson将嵌套map转为嵌套json的讲解

    今天小编就为大家分享一篇关于C++中rapidjson将嵌套map转为嵌套json的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • C语言中sizeof函数的基本使用总结

    C语言中sizeof函数的基本使用总结

    这篇文章主要给大家介绍了关于C语言中sizeof函数的基本使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • C语言多文件编程问题解析

    C语言多文件编程问题解析

    在某些场景中,考虑到编译效率和可移植性,#pragma once 和 #ifndef 经常被结合使用来避免头文件被 重复引入,这里介绍用 _Pragma 操作符避免头文件重复引入的问题,感兴趣的朋友跟随小编一起看看吧
    2022-12-12
  • C语言深入讲解栈与堆和静态存储区的使用

    C语言深入讲解栈与堆和静态存储区的使用

    对大多数C 语言初学者来说,堆栈却是一个很模糊的概念。堆栈是一种数据结构,一个在程序运行时用于存放的地方,相信这可能是很多初学者共同的认识,静态存储区即内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在
    2022-04-04
  • OpenCV实现人脸检测功能

    OpenCV实现人脸检测功能

    这篇文章主要为大家详细介绍了OpenCV实现人脸检测功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • 详解C++ 多态的两种形式(静态、动态)

    详解C++ 多态的两种形式(静态、动态)

    这篇文章主要介绍了C++ 多态的两种形式,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-08-08
  • C++输入一个字符串,把其中的字符按照逆序输出的两种方法解析

    C++输入一个字符串,把其中的字符按照逆序输出的两种方法解析

    以下是对C++中输入一个字符串,把其中的字符按照逆序输出的两种方法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-07-07
  • C++实现删除txt文件中指定内容的示例代码

    C++实现删除txt文件中指定内容的示例代码

    这篇文章主要介绍了C++实现删除txt文件中指定内容的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • delete[] p->elems和free(p->elems)区别介绍

    delete[] p->elems和free(p->elems)区别介绍

    delete[]和free()都是释放内存的函数,但它们具有不同的使用方法和适用情况,这篇文章主要介绍了delete[] p->elems和free(p->elems)有什么区别,需要的朋友可以参考下
    2023-04-04
  • Qt实现电子时钟的示例代码

    Qt实现电子时钟的示例代码

    这篇文章主要为大家详细介绍了如何利用Qt实现显示与桌面上并可以随意拖拽至桌面任意位置的电子时钟案例,感兴趣的小伙伴可以尝试一下
    2022-06-06

最新评论