一、概述:

消息机制是windows程序的典型运行机制,在MFC中有很多已经封装好了的消息,如WM_BTN**等。但是在有些特殊情况下我们需要自定义一些消息去完成一些我们所需要的功能,这时候MFC的向导不能帮助我们做到这一点。对此,我们可以通过添加相应的代码去完成这个功能。

二、实现方法:

添加自定义消息操作如下:
1. 建立MFC工程,如基于对话框的应用程序,Test。
2. 在资源中添加要处理的消息的值,即在CTestDlg.h中添加 如下代码。 (因为很多MFC的消息是在WM_USER内的,所以这里用比WM_USER大的消息)

#define WM_MyMessage (WM_USER+100)

3. 声明消息处理函数,在CTestDlg.h中添加如下代码:

class CTestDlg : public CDialog
{
protected:
……
// 生成的消息映射函数
……
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); // add lyw
DECLARE_MESSAGE_MAP()
……

4. 添加消息映射处理,在CTestDlg.cpp中人找到如下部分添加代码:

BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
……
ON_MESSAGE(WM_MyMessage, OnMyMessage)
END_MESSAGE_MAP()

5. 实现自己的自定义消息处理:

LRESULT CTestDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
//MessageBox("recv msg success");
//添加自己的消息处理
……
return ;
}

6. 如果要发送一个自定义的消息,需要使用代码

SendMessage( WM_MyMessage, , );
或者
PostMessage(WM_MyMessage, , );

如果要定义系统唯一的消息让多个应用程序去处理,不同之处如下:

. 把上面2步骤中的宏 #define WM_MyMessage (WM_USER+100) 使用如下代码代替:

 static UINT WM_MyMessage = RegisterWindowMessage("myMessage");
. 上面4步骤中的代码用如下代替: BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
……
ON_REGISTERED_MESSAGE(WM_MyMessage, OnMyMessage)
END_MESSAGE_MAP()
.测试消息时,如果要让多个应用程序都接收到这个消息,需要使用: ::SendMessage(HWND_BROADCAST, WM_MyMessage, , );

综合概述如下:

          1.  在头文件stdafx.h中增加一个自定义消息宏
#define WM_USER_THREADEND WM_USER + 1 . 在于增加新消息的窗口或对话框类的头文件中增加一个回调函数声明,注意要声明为public
afx_msg LRESULT OnUserThreadend(WPARAM wParam, LPARAM lParam); . 在窗口或对话框的cpp文件的BEGIN_MESSAGE_MAP,END_MESSAGE_MAP 中增加一行
ON_MESSAGE(WM_USER_THREADEND, OnUserThreadend) . 在窗口或对话框的cpp文件中增加回调函数的实现,如:
LRESULT ThreadDialog::OnUserThreadend(WPARAM wParam, LPARAM lParam)
{
TRACE("WM_USER_THREADEND message /n");
return ;
} . 自定义消息的触发
::PostMessage(GetSafeHwnd(), WM_USER_THREADEND, , );
其中GetSafeHwnd()得到了一个当前窗口的句柄,此消息将发给当前窗口,如果想发送消息给其它窗口只需改变这个句柄,前提是目的窗口也实现了此消息的处理函数。

MFC自定义消息的实现方法的更多相关文章

  1. MFC时间简单比较方法

    MFC//时间简单比较方法 void CMFCsaveListTofileDlg::OnBnClickedButton6()//时间简单比较方法 { // TODO: 在此添加控件通知处理程序代码 C ...

  2. 【转】MFC界面更新实现方法

    原文网址:http://www.cnblogs.com/skywatcher/p/3572311.html 1.更新窗口 即采用UpdateWindow()函数立即发送WM_PAINT消息更新整个窗口 ...

  3. MFC界面更新实现方法

    1.更新窗口 即采用UpdateWindow()函数立即发送WM_PAINT消息更新整个窗口. void CEditTestDlg::OnBnClickedBtnSysUpdate() { CStri ...

  4. MFC资源冲突解决方法

    AFX_MANAGE_STATE(AfxGetStaticModuleState())   先看一个例子: 1.创建一个动态链接到MFC DLL的规则DLL,其内部包含一个对话框资源.指定该对话框ID ...

  5. MFC自定义消息

    本文地址:http://blog.163.com/strive_only/blog/static/893801682010101911467765/ 消息机制是windows的典型运行机制,在MFC中 ...

  6. MFC常见问题以及解决方法(2)_Cstring和string互相转换

    MFC默认编码是unicode(自己改成多字符集是不行的),对话框中对字符串的处理都是宽字符,而且添加变量会默认是CString类型,当你代码中想用string但又遇到必须转为CString的情况,就 ...

  7. MFC常见问题以及解决方法(1)_MFC下文本编辑框按下回车后窗口退出

    这里主要介绍遇到这种方法的解决方案,解决方法可能有多种,但这里只给出有效的一种,这里不会详细说明出现问题的原因以及为什么这样解决,想了解更多可以百度,写这个主要是防止以后忘记,做个简单的笔记. 问题: ...

  8. MFC工程 重命名方法

    C++ MFC工程 修改前的知识准备: 1.解决方案相关文件 AAA.sln文件和AAA.suo文件为MFC自动生成的解决方案文件,它包含当前解决方案中的工程信息,存储解决方案的设置. 2.工程相关文 ...

  9. MFC连接MySQL数据库方法

    MFC连接数据库的三种方法: 1.ODBC(开放式数据互联) 2.OLEDB与ADO 3.用mysql为C语言提供的接口

随机推荐

  1. .net core 填坑记之—格式转换问题

    最近在将项目从.net 迁移到.net core环境中,迁移完成后,发布于Windows平台上进行测试,所有功能均能正常运行. 为了项目能够在正式环境也能正常运行,提前进行Linux环境部署(Cent ...

  2. 解决VS2010在新建实体数据模型出现“在 .NET Framework Data Provider for Microsoft SQL Server Compact 3.5 中发生错误。请与提供程序供应商联系以解决此问题。”的问题

    最近想试着学习ASP.NET MVC,在点击 添加--新建项--Visual C#下的数据中的ADO.NET 实体数据模型,到"选择您的数据连接"时,出现错误,"在 .N ...

  3. SpringMVC国际化配置

    一.什么是国际化: 国际化是设计软件应用的过程中应用被使用与不同语言和地区 国际化通常采用多属性文件的方式解决,每个属性文件保存一种语言的文字信息,    不同语言的用户看到的是不同的内容 二.spr ...

  4. springboot+mybatis+thymeleaf+docker构建的个人站点开源项目(集成了个人主页、个人作品、个人博客)

    前言 My Site 主要功能有:个人首页.个人作品.个人博客为一体的站点,网站的文章和作品均由markdown进行编写,可以满足你的基本需求.如果觉得这个项目不错,请为它点赞支持. 项目架构 JDK ...

  5. 关于使用flying-saucer-pdf,实现xhtml2pdf

    @author Guoguo 2013.11.24 关于flying-saucer-pdf 是一个XML/CSS渲染器,flying-saucer-pdf工具以XML标准文件作为输入,CSS进行排版. ...

  6. java多线程之ReentrantLock

    前言 相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么 ...

  7. lintcode 题目记录3

    Expression Expand  Word Break II Partition Equal Subset Sum  Expression Expand  字符串展开问题,按照[]前的数字展开字符 ...

  8. klee源码阅读笔记1--STPBuilder类

    初始化过程中四个数据成员中的两个数据成员被初始化: 一.vc被初始化为STP提供的C调用接口函数vc_createValidityChecker(): 二.optimizeDivides被初始化为fa ...

  9. tcp三次握手和四次挥手(2)

      背景描述 通过上一篇中网络模型中的IP层的介绍,我们知道网络层,可以实现两个主机之间的通信.但是这并不具体,因为,真正进行通信的实体是在主机中的进程,是一个主机中的一个进程与另外一个主机中的一个进 ...

  10. 线程间协作:wait、notify、notifyAll

    线程间协作:wait.notify.notifyAll 在 Java 中,可以通过配合调用 Object 对象的 wait() 方法和 notify()方法或 notifyAll() 方法来实现线程间 ...