转: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. .net core 基础知识

    1.IOC(转:https://www.cnblogs.com/artech/p/inside-asp-net-core.html) IoC的全名Inverse of Control,翻译成中文就是“ ...

  2. ZZNUOJ 2022 摩斯密码

    map打表存一下对应的密码   不会map感觉不好弄这题 #include<stdio.h> #include<string.h> #include<math.h> ...

  3. newborn, infant, toddler以及baby的区别

    1.An infant (from the Latin word infans, meaning "unable to speak" or "speechless&quo ...

  4. HTML 标记 1

    1. 文件结构 <html>                   ----------------------开始 <head>          -------------- ...

  5. JS添加/移除事件

    事件的传播方式 <div id="father"> <div id="son"></div> </div> &l ...

  6. Golang获得执行文件的当前路径

    运行环境:golang1.9.2+win7x64golang1.9.2+centos6.5×64 /*获取当前文件执行的路径*/ func GetCurPath() string { file, _ ...

  7. java 里面耦合和解耦

    百度解释: 耦合是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象. 解耦就是用数学方法将两种运动分离开来处理问题. 这是形象搞笑的比喻:完全可以这么想像嘛,有一对热恋中 ...

  8. Java访问ActiveMQ

    1.下载安装ActiveMQ 下载可以去官网下载:http://activemq.apache.org/download.html.我们这里使用windows测试,所以下载windows版本即可. 2 ...

  9. SQLSERVER 和 ORACLE的if not exist 用法

    sql server: if not exists (select 1 from TB_Procedure where Id='2018ZZZ') BEGIN insert into TB_Proce ...

  10. [maven] introduction to the standard directory layout

    The next section documents the directory layout expected by Maven and the directory layout created b ...