转:http://blog.csdn.net/penpenandtongtong/article/details/18598907

像MFC的窗口发送消息,可以进行自定义的动作行为,因此很多时候非常有用。

1. 在MSGDlg.h或者其他头文件中增加自定义自定义消息:#define WM_COUNT_MSG WM_USER+100

2. 在MSGDlg.h头文件中添加消息处理函数的声明  afx_msg LRESULT OnCountMsg(WPARAM,LPARAM);

3. 在CMSGDlg类实现文件MSGDlg.cpp中的消息映射表中加入自定义消息映射:

BEGIN_MESSAGE_MAP(CMSGDlg, CDialog)

//{{AFX_MSG_MAP(CMSGDlg)

ON_WM_PAINT()

ON_MESSAGE(WM_COUNT_MSG,&CMSGDlg::OnCountMsg)    // OnCountMsg是自定义的消息处理函数,可以在这个函数里面进行自定义的消息处理代码

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

4. 在需要发送消息的地方,添加下面这句话:this->SendMessage(WM_COUNT_MSG,0,0);

5.在CMSGDlg类实现文件MSGDlg.cpp中定义OnCountMsg消息响应

//自定义消息处理函数

LRESULT CMSGDlg::OnCountMsg(WPARAM wParam,LPARAM lParam)

{

this->SetDlgItemInt(IDC_EDIT,lParam);

return 1;

}

SendMessage函数的API原型为:

LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

其中hWnd标识接收消息的窗口。

以下程序用来向记事本Notepad发送一个WM_CLOSE消息以关闭记事本窗口。

// TellToClose.cpp文件

//::FindWindow&::SendMessage

#include "stdafx.h"

#include <windows.h>

int main(int argc, char* argv[])

{

// 查找标题为“无标题- 记事本”的窗口

// 也可以使用类名来查找,如

// HWND hWnd =::FindWindow("Notepad", NULL);

HWND hWnd = ::FindWindow(NULL, "无标题- 记事本");

if(hWnd != NULL)

{

// 向目标窗口发送WM_CLOSE消息

::SendMessage(hWnd, WM_CLOSE, 0, 0);

}

return 0;

}

另外还有一个函数:

BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);

注意SendMessage直到消息被处理完毕后才返回,而PostMessage是把一条消息投放到创建hWnd窗口的线程的消息队列中。函数不等消息被处理就立即返回。

如果开启了记事本程序,则运行以上程序记事本关闭。

另附PeekMessage和GetMessage的区别:

PeekMessage   返回   TRUE   的条件是有消息,如果没有消息返回   FALSE   
GetMessage    返回   TRUE   的条件是有消息且该消息不为   WM_QUIT  
                返回   FALSE  的条件是有消息且该消息  为   WM_QUIT

在MFC中SendMessage函数封装到CWnd类中:

CWnd::SendMessage

LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );
返回值:消息处理的结果;它的值依赖于发送的消息。
参数:

message指定了要发送的消息;

wParam和lParam指定了与消息有关的附加信息。

wParam和lParam是Windows消息机制的两个最重要参数,整个Windows依靠这两个参数传递各种各样的消息。

首先是wParam,它表示此次的消息类型是什么。是键盘?是鼠标?键盘里又分按下还是抬起,鼠标里又分是单击还是双击,等等。

lParam是一个指针,它指向本条消息所存储的信息的内存区域的首地址,很显然,这个地址存放的东西是很灵活的,比如鼠标消息,那么这里可能存放的是各键的状态或者光标的X,Y座标。换成键盘消息,则是键码等等。

总之,在Windows系统消息处理中,wParam参数区分了类别,lParam参数存放了该类别所存储的信息。

对于自定义消息,我们把消息Msg投递(Send或Post)到 hWnd,其对应的消息处理函数一般为afx_msg LRESULT OnMsg(WPARAM,LPARAM);格式,故我们可以自定义这两个参数,以传递所需参数(一般为常规类型、结构或类的指针)到指定窗口线程。

例如: SendMessage(WM_MYMESSAGE,(WPARAM)lpMyData1,(LPARAM)lpMyData2

MFC消息-自定义消息的更多相关文章

  1. MFC编程入门之五(MFC消息映射机制概述)

    在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作.比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应. 一.什 ...

  2. VS2010/MFC编程入门之五(MFC消息映射机制概述)

    VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html 上一讲鸡啄米为大家简单分析了MFC应用 ...

  3. MFC消息映射机制

    1.MFC应用框架主要类之间的关系 MFC自动生成的框架中重要的类有:C-App.CMainFrame.C-Doc和C-View. 其他的类如CClassView.CFileView等都是在框架窗口( ...

  4. MFC发送自定义消息-PostMessage和SendMessage

    PostMessage:把消息投放到线程的消息队列,不能消息被处理就立即返回SendMessage:消息被处理完后才返回 几种发送消息的写法:   ::PostMessage(GetSafeHwnd( ...

  5. MFC消息映射机制以及画线功能实现

    ---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...

  6. 自制MFC消息响应定位器+原理分析

    mfc里面有张消息映射表(MESSAGE_MAP),消息都是通过这张表来分发到相应函数里的. 这个是我自制的定位器,从vc6.0到现在的2013生成的mfc都可以用,全静态扫描并已处理动态基址. 下面 ...

  7. MFC消息响应机制 q

    MFC消息响应机制分析 1 引言微软公司提供的MFC基本类库(Microsoft Foundation Classes),是进行可视化编程时使用最为流行的一个类 库.MFC封装了大部分Windows ...

  8. MFC消息映射与命令传递

    题外话:刚开始学视窗程序设计的时候,我就打印了一本Windows消息详解,里面列举了各种已定义消息的意义和作用,共10多页,在编程的时候翻翻,有时觉得很受用.我发觉很多编程的朋友,虽然每天都面对消息, ...

  9. MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕

    ////////////////////////////////////////////////////////////////////////////////////                 ...

随机推荐

  1. Jmeter 老司机带你一小时学会Jmeter

    Jmeter的安装   官网下载地址:http://jmeter.apache.org/download_jmeter.cgi 作为Java应用,是需要JDK环境的,因此需要下载安装JAVA,并且作必 ...

  2. web 前端知识体系 网站资源分析

    一.比较全面的思维导图 二.相关资源 1. 布局框架:Bootstrap: http://getbootstrap.com/Foundation: http://foundation.zurb.com ...

  3. 四个session

  4. Spring的AOP配置文件和注解实例解析

    1.1           Spring的AOP配置文件和注解实例解析 AOP它利用一种称为"横切"的技术,将那些与核心业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减 ...

  5. Codeforces 1043 F - Make It One

    F - Make It One 思路: dp + 容斥 首先, 答案不会超过7, 因为前7个质数的乘积大于3e5(最坏的情况是7个数, 每个数都缺少一个不同的因子) 所以从1到7依次考虑 dp[i][ ...

  6. 牛客网NOIP赛前集训营-提高组(第一场)A 中位数

    中位数 思路: 二分答案 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize(4) #include< ...

  7. python3-知识扩展扫盲易忘-zip的用法

    >>>a = [1,2,3] >>> b = [4,5,6]>>> c = [4,5,6,7,8]>>> zipped = zi ...

  8. Confluence 6 对一个空间进行归档后产生的影响

    空间 如果一个空间被归档: 将不会在查找结果中显示,除非你选择 在归档空间中查找(Search archived spaces).如果没有归档空间的话,这个功能是隐藏的. 页面和内容将不会在 Conf ...

  9. Django多表查询练习题

    #一 model表:from django.db import models # Create your models here. class Teacher(models.Model): tid=m ...

  10. 轮播,试用与微信公众号,apicloud苹果安卓

    <head> <script type="text/javascript" src="script/jquery.min.js">< ...