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

转载自: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);

[cpp] view
plain
copyprint?

  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宏指令将消息映射到消息处理函数中。

[cpp] view
plain
copyprint?

  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。

[cpp] view
plain
copyprint?

  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源文件中的发送函数应该这么写:

[cpp] view
plain
copyprint?

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

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

[cpp] view
plain
copyprint?

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

或者:

[cpp] view
plain
copyprint?

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

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

时间: 2024-10-14 12:47:46

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

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

方法一:1.添加成员变量CStatusBarCtrl m_StatusBar;2.在OnInitDialog()中加入:                  m_StatusBar.Create(WS_CHILD|WS_VISIBLE|SBT_OWNERDRAW, CRect(0,0,0,0), this, 0); int strPartDim[3]= {100, 200, -1}; //分割数量                  m_StatusBar.SetParts(3, strPartDi

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

VC对话框怎么显示背景图片呢.在MFC中实现背景图片,不像C#应用程序那么简单.今天就和朋友们说说如何在VC界面中设置背景图片 ^_^ 工具/原料 Visual C++ 2010 方法一:用Picture控件 1 新建MFC应用程序 2 在应用程序中,选择基于对话框,其他保持默认即可 3 右击项目,选择添加-资源 4 在添加资源对话框中,点击导入,选择要作为背景的图片 jpg格式的图片可以用画图打开另存为bmp格式 (网上说可以直接jpg格式,自行实验未成功) 下方对话框中资源类型选为bitma

在VC++6.0中给对话框设置背景色或者背景图片

/*********************************************************** *说明: 在VC++6.0中给对话框设置背景色或者背景图片 *备注:测试代码的对话框程序的工程名为:BJ *原理:在OnPaint()中加入代码 ***********************************************************/ // 注意:去掉相应以 /* */ 注释的注释符号后代码生效 void CBJDlg::OnPaint() {

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

转自:http://www.tuicool.com/articles/F7byQn 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html SpringMVC中Controller的方法参数可以是Integer,Double,自定义对象,ServletRequest,ServletResponse,ModelA

VC实现A进程窗口嵌入到B进程窗口中显示的方法

这篇文章主要介绍了VC实现A进程窗口嵌入到B进程窗口中显示的方法,对于理解windows程序运行原理的进程问题有一定的帮助,需要的朋友可以参考下 本文通过一个Demo示例讲述把A应用程序嵌入到B应用程序中显示的方法. 主要代码如下: <span style="font-size:12px;font-weight: normal;">//在B应用启动时创建A进程 CreateProcess(_T("A.exe"),NULL,NULL,NULL,FALSE,

VC++对话框中加状态栏

原文链接: http://blog.chinaunix.net/uid-9847882-id-1996528.html 方法一:1.添加成员变量CStatusBarCtrl m_StatusBar;2.在OnInitDialog()中加入:               m_StatusBar.Create(WS_CHILD|WS_VISIBLE|SBT_OWNERDRAW, CRect(0,0,0,0), this, 0); int strPartDim[3]= {100, 200, -1}; 

strut2基于XML配置方式对Action中的指定方法校验

当校验文件取名为ActionClassName-validation.xml时,会对action中的所有方法进行校验 .如果你需要对action中的某个方法实施校验,那么,校验文件的取名为 ActionClassName-ActionName-validation.xml.其中ActionName为struts.xml 中的action名字. 例如:对UserAction中的add()方法进行校验,校验文件名应该为:UserAction-user_add-validation.xml. User

VC++ 6.0 中使用 MSComm.ocx

很多人喜欢单独安装VC++6.0,而不是完整安装VS,这样占用空间比较少,启动也快.但是要使用某些ActiveX控件的时候却会出现许可证问题(requires a design-time licence),譬如使用MSComm.ocx.至于ActiveX的许可证体系这里就不说了,简单说就是用来保证第三方ActiveX控件开发者的智力投资的.MSComm.ocx是VS自带的一个进行串口通讯的控件,本来在安装VS的时候会自动把相应的licence发放给用户,但是这个licence是由VB附带提供的,

VC开发多语言界面 多种方法(很简单) 有源码

(需源码先留邮箱)先上图 1.通过遍历 得到所有控件ID号与TEXT,得到一个中文语言配置文件 void CVV_485Dlg::getCaptionForWindow() //做程序时用,其它时间不用 { //枚举对话框中所有组件 CWnd *pCtrl = GetWindow(GW_CHILD); while(pCtrl!=NULL) { UINT ctrlID = pCtrl->GetDlgCtrlID(); // setControlCaption(pCtrl,ctrlID); CStr