转载自:http://blog.csdn.net/myj0513/article/details/6827360

背景: 新建了一个基于对话框的MFC程序,在主对话框中添加tabcontrol控件,又新建了两个Dialog(CDialog1和CDialog2),将它们设为tabcontrol控件的子对话框。

目的: 两个子对话框之间传递消息,子对话框与主对话框传递消息。

方法: 第一步:  定义消息.

在目标窗口类的头文件或者stdafx.h中添加:
#define WM_MY_MESSAGE 
(WM_USER+100);    
推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。

      
第二步:  
在目标类头文件的AFX_MSG块中说明消息处理函数: afx_msg LRESULT
OnMyMessage(WPARAM wParam, LPARAM lParam);

  1. class CDialog1:public CDialog
  2. {
  3. ...
  4. // 一般消息映射函数
  5. protected:
  6. // {{AFX_MSG(CDialog)
  7. virtual BOOL OnInitDialog();
  8. afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  9. afx_msg void OnPaint();
  10. afx_msg HCURSOR OnQueryDragIcon();
  11. afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
  12. //}}AFX_MSG
  13. DECLARE_MESSAGE_MAP()
  14. }

 

 第三步:在目标类源文件cpp中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。

  1. BEGIN_MESSAGE_MAP(CDialog1, CDialog)
  2. ON_WM_SYSCOMMAND()
  3. ON_WM_PAINT()
  4. ON_WM_QUERYDRAGICON()
  5. ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
  6. //}}AFX_MSG_MAP
  7. END_MESSAGE_MAP()

第四步: 
 实现消息处理函数。

在目标类源文件cpp中,该函数使用WPRAM和LPARAM参数并返回LPESULT。

  1. LPESULT CDialog1::OnMyMessage(WPARAM wParam, LPARAM lParam)
  2. {
  3. // TODO: 处理用户自定义消息
  4. //MessageBox("消息传递完成!");
  5. return 0;
  6. }

第五步:发送消息时,在源地址类CDialog2的CPP文件中(如一个Button),调用函数PostMessage或SendMessa

ge发送消息。PoseMessage(WM_MY_MESSAGE,O,O);
SendMessage(WM_MY_MESSAGE,O,O);

此时需要注意::::

假如主对话框的类名:CSecondShimDlg,两个子对话框的类名CDialog1和CDialog2;

. 要实现两个子对话框之间进行通信(CDialog2向CDialog1发送消息,目标类即为CDialog1),则在CDialog2源文件中的发送函数应该这么写:

  1. CSecondShimDlg * m_Host = (CSecondShimDlg*)AfxGetMainWnd();
  2. m_Host->m_Diag1.SendMessage(WM_MY_MESSAGE , wparam, lparam);//这里要注意是m_Diag1,它是在主对话框类中定义的一个CDialog1对象,即目标对象。

要实现CDialog2向主对话框CSecondShimDlg发送消息(目标类即为CSecondShimDlg),则:

  1. CSecondShimDlg * m_Host = (CSecondShimDlg*)AfxGetMainWnd();
  2. m_Host->SendMessage(WM_MY_MESSAGE , wparam, lparam);

或者:

    1. ::SendMessage(this->GetParent()->GetParent()->m_hWnd, WM_MY_MESSAGE ,wparam, lparam);
    2. // SendMessage函数的第一个参数是目标窗口的句柄。之所以要用两个GetParent()因为Dialog2的父对话框为TabControl,TabControl的父对话框为主对话框CSecondShimDlg

vc++ 不同对话框中传递信息的方法(基于自定义消息SendMessage) (转载)的更多相关文章

  1. VC++在对话框中加入属性页

    当一个基于对话框的程序中有相当多的控件时,你一定会想到使用属性页来将这些控件分类放置.本文针对这种方法来讨论几种可能实现的方案. 方案一本方案的例子请见源代码打包文件中的Property1部分 在对话 ...

  2. VC++对话框中添加状态栏的方法

    方法一:1.添加成员变量CStatusBarCtrl m_StatusBar;2.在OnInitDialog()中加入:                  m_StatusBar.Create(WS_ ...

  3. VC++MFC对话框程序中给对话添加背景图片

    VC对话框怎么显示背景图片呢.在MFC中实现背景图片,不像C#应用程序那么简单.今天就和朋友们说说如何在VC界面中设置背景图片 ^_^   工具/原料 Visual C++ 2010 方法一:用Pic ...

  4. MVC中使用Entity Framework 基于方法的查询学习笔记 (一)

    EF中基于方法的查询方式不同于LINQ和以往的ADO.NET,正因为如此,有必要深入学习一下啦.闲话不多说,现在开始一个MVC项目,在项目中临床学习. 创建MVC项目 1.“文件”--“新建项目”-- ...

  5. 详解SpringMVC中Controller的方法中参数的工作原理——基于maven

    转自:http://www.tuicool.com/articles/F7byQn 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:ht ...

  6. VC++对话框中加状态栏

    原文链接: http://blog.chinaunix.net/uid-9847882-id-1996528.html 方法一:1.添加成员变量CStatusBarCtrl m_StatusBar;2 ...

  7. MFC中 自定义类访问主对话框控件的方法

    之前一直在找有木有好点的方法.现在终于被我找到,收藏之~~~~~~ 在使用mfc的时候经常遇到自定义类访问主对话框控件的问题,例如自定义类中的方法要输出一段字符串到主对话框的EDIT控件.控制对话框的 ...

  8. 测试脚本中的等待方法 alter对话框处理

    测试脚本中的等待方法 等待是为了使脚本执行更加稳定 1. 常用的休眠方式:time模块的sleep方法 2. selenium模块中的等待方法 等待查找5s 查找不到就报错 对登录测试py进行修改 a ...

  9. VC++ 6.0 中使用 MSComm.ocx

    很多人喜欢单独安装VC++6.0,而不是完整安装VS,这样占用空间比较少,启动也快.但是要使用某些ActiveX控件的时候却会出现许可证问题(requires a design-time licenc ...

随机推荐

  1. 【并发编程】Executor架构介绍

    要点总结 Executor表示的任务类型 主要有3种: Runnable: 无返回值,无异常抛出: Callable:有返回值,可以异常抛出: Future任务: 表示异步计算,可取消: 通过newT ...

  2. Java 获取字符串指定下标位置的值 charAt()

    Java手册 charAt public char charAt(int index) 返回指定索引处的 char 值.索引范围为从 0 到 length() - 1.序列的第一个 char 值位于索 ...

  3. HDU 1686 Oulipo(优化的KMP)

    Oulipo Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  4. 给iOS开发新手送点福利,简述UISegment的属性和用法

    UISegment属性 1.segmentedControlStyle 设置segment的显示样式. typedef NS_ENUM(NSInteger, UISegmentedControlSty ...

  5. rm 递归删除目录下某一类型文件

    命令:find -name "*.js.map" | xargs rm -f 解释:find -name "*.js.map" 可以查到当前目录下(包括子目录, ...

  6. VueRouter

    使用VueRouter的前提: 1, 必须导入vue-router.js文件    2, 要有VueRouter()实例    3, 要把VueRouter实例挂载到Vue实例中 4, 路由的入口   ...

  7. 全虚拟化和半虚拟化的区别 cpu的ring0~ring3又是什么概念?

    ring0是指CPU的运行级别,ring0是最高级别,ring1次之,ring2更次之-- 拿Linux+x86来说, 操作系统(内核)的代码运行在最高运行级别ring0上,可以使用特权指令,控制中断 ...

  8. linux版飞信安装

    下载安装包; http://www.it-adv.net/fetion/libraryrh4x32.tar.gz  [支持库] http://www.it-adv.net/fetion/downloa ...

  9. C#预编译的问题

    C#预编译宏并不像C++那样编译之后就不存在了.在UNITY的C#脚本中 #if UNITY_ANDROID && !UNITY_EDITOR AndroidJavaClass jc ...

  10. Elasticsearch 2.4.1 Bigdesk 插件安装

    简介: Elasticsearch 2.4.1 安装 bigdesk bigdesk 是一个 ES 集群监控工具,可以检测到集群状态.各节点信息,包括 JVM.Thread Pools.OS.Proc ...