弄了好久,今天终于把在VC中的对话框类之间传递参数的问题解决了,很开心,记录如下:

 1. 

  我所建立的工程是一个基于MFC对话框的应用程序,一共有三个对话框,第一个对话框为主对话框,所对应的类为CTMDDDlg类。在主对话框上我放置了一个标签页(Tab Control)控件,其实现的功能是当单击标签提示A时进入页面A,即对话框A(所对应的类为CDialogChild1),单击B时进入对话框B(CDialogChild2)。

  整个工程的框架已经设计好了,在对话框A和对话框B上放置了许多控件,现在我想实现这样一种功能(当然,好像好多人都想实现这种功能),当单击对话框A中的一个按钮控件时,对话框B中的一个按钮处于不可用状态,再单击一下,则变为可用。

  要实现这种功能,关键在于使得对话框A中可以找到指向对话框B的指针,这样才能找到对应的按钮。

  实现方法如下(在不使用全局变量的前提下):

(1)在CDialogChild1中单击右键,添加一个CDialogChild2*类型的对话框指针变量,记为MyDlg2,访问类型为public;

(2)找到CTMDDDlg类,在相应的OnInitDialog()函数中添加以下代码:

BOOL CTMTDDDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here TCITEM item;
item.mask = TCIF_TEXT; item.pszText = "A";
m_TabCtrl.InsertItem (0,&item);
item.pszText = "B";
m_TabCtrl.InsertItem (1,&item);
m_Tab1.Create (IDD_DIALOG1,&m_TabCtrl);
m_Tab2.Create (IDD_DIALOG2,&m_TabCtrl);
m_Tab1.m_MyDlg2 = &m_Tab2; //以下设置使得初始化状态显示第一页标签页
CRect r;//客户窗口的坐标
m_TabCtrl.GetClientRect (&r);
m_Tab1.SetWindowPos (NULL,10,20,r.right -20,r.bottom -40,SWP_SHOWWINDOW);
m_Tab2.SetWindowPos (NULL,10,20,r.right -20,r.bottom -40,SWP_HIDEWINDOW ); return TRUE; // return TRUE unless you set the focus to a control
}

  

  注意,上面的 m_Tab1.m_MyDlg2 = &m_Tab2; 这行代码是我们新添加的,

原来的OnInitDialog()函数中的代码是为了实现标签控件且初始化两个对话框的(m_Tab1和m_Tab2分别是对话框A和对话框B所对应的对话框控件变量)。

注意,这里要添加的一行代码必须放在m_Tab1和m_Tab2实例化之后,即Create函数之后

(3)有了m_MyDlg2指针后,我们就可以很随意地在对话框类CDialogChild1中访问对话框CDialogChild2中的成员变量了:

m_MyDlg1->GetDlgItem(IDC_BTN_A)->EnableWindow(); 呵呵,而最开心的事情是这里没有用到全局变量。

2.以上方法的确可以解决我所遇到的问题,不过后来经过尝试,又有了以下方法:(两个类中均有其父类指针变量,通过父类指针访问-》子类变量.子类成员函数)

(1)首先在对话框A和B中分别添加一个成员变量 CTMTDDDlg* m_MyDlg

(2)在OnInitDialog()当中添加以下代码:

m_Tab1.m_MyDlg = this;

m_Tab2.m_MyDlg = this;

注意,以上代码仍然添加在m_Tab1和m_Tab2生成之后

(3)有了m_MyDlg指针之后,我们就可以在对话框CDialogChild1和对话框CDialogChild2中使用m_MyDlg来访问它的成员变量m_Tab1和m_Tab2,从而访问它们的成员控件了:

m_MyDlg->m_Tab2.GetDlgItem(IDC_CHECK_A)->EnableWindow();

或者 m_MyDlg->m_Tab1.GetDlgItem(IDC_CHECK_A)->EnableWindow();

3.

现在介绍第三种方法,也是最简单的方法,

  使用GetParentOwner()来获取该子窗口的拥有(owner)窗口的指针,然后访问另外一个子窗口,比如在对话框A的cpp文件中加入以下代码: ((CTMTDDDlg*)GetParentOwner())->m_Tab2.GetDlgItem(IDC_CHECK_A)->EnableWindow();

//由于GetParentOwner()返回的是一个CWnd类型的指针,需要进行强制转换 这样以来就可以实现我们需要的功能了。

mfc 在VC的两个对话框类中传递参数的三种方法的更多相关文章

  1. Javascript定义类(class)的三种方法

    将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越 ...

  2. python 多线程编程之threading模块(Thread类)创建线程的三种方法

    摘录 python核心编程 上节介绍的thread模块,是不支持守护线程的.当主线程退出的时候,所有的子线程都将终止,不管他们是否仍在工作. 本节开始,我们开始介绍python的另外多线程模块thre ...

  3. SpringMvc中两个Controller类之间传递参数的方法

    使用SpringMvc框架,在访问ControllerA的时候,将A里面的参数传递到ControllerB中.适用于同一框架下两个不同Controller或者由rpc(dubbo)连接的两个工程里的C ...

  4. (转载)Javascript定义类(class)的三种方法

    因在公司内部培训中有讲解到JS类的概念,不甚明白,于是进行了google找到了相关的介绍说明,现将其摘抄下来,以作记录. 在面向对象编程中,类(class)是对象(object)的模板,定义了同一组对 ...

  5. python3的leetcode题,两个数求和等于目标值,返回这两个数的索引组成的列表(三种方法)

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为gai目标值的 两个 整数. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 ...

  6. C#中Math类的计算整数的三种方法

    1.Math.Round:四舍六入五取偶 引用内容 Math.Round( Math.Round( Math.Round( Math.Round( Math.Round( Math.Round( Ma ...

  7. MFC接收命令行参数的三种方法

    方法一: CString sCmdline = ::GetCommandLine(); AfxMessageBox(sCmdline); 将获取到 "C:\test\app.exe -1 - ...

  8. c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)

    c#封装DBHelper类   public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...

  9. ListCtrl添加右键菜单(在对话框类中)

    在对话框类中如何添加NM_RCLICK消息: ListCtrl控件右键单击选择属性 在右侧属性栏中选择控件事件 在控件事件中找到NM_RCLICK并添加 完成,写代码

随机推荐

  1. Java--类的使用

    一 方法内部类        1.打开eclipse 选择你的代码存放的地方 2.新增Java项目 点击File-->New-->java project 3.添加一个包        4 ...

  2. 指针的指针&指向指针数组的指针

    一.指针的指针    指针的指针看上去有些令人费解.它们的声明有两个星号.例如:        char ** cp;    如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针 ...

  3. ubuntu mysql emma中文乱码问题解决

    ubuntu mysql emma中文乱码问题解决 emma默认用apt-get 安装的话,emma是不支持中文的,配置文件或直接修改emma程序源文件(python). apt-get安装emma ...

  4. javascript作用域和作用域链摘录

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望 ...

  5. MySQL5.7.10免安装版配置

     最新版的 Mysql 不提供图形界面的安装了, 下载下来是一个压缩包的形式, 那么我们如何来使用它呢, 让它为我们工作呢? 环境: mysql-5.7.10-winx64 + win7(64位) 一 ...

  6. buildroot 使用小记 - 2 源文件目录结构

    官方下载下来的buildroot源码包在解压后,是一个名为buildroot的文件夹,它下面的目录/文件结构如下: Makefile - 顶级makefile,编译总入口 Config.in - 顶级 ...

  7. 安卓手机开机开启指定Activity

    1.布局 默认helloworld布局 2.class BootCompleteReceiver package lpc.com.project522; import android.content. ...

  8. 屏蔽input导致的回车提交事件

    onkeypress="if(event.keyCode == 13) return false;"

  9. protocol buffers的使用示例[z]

    [http://blog.csdn.net/zhu_xun/article/details/19397081] protocol buffers的使用示例 如果不了解protocol buffers, ...

  10. Oracle 包(Package)

    引用这位大大的: http://www.cnblogs.com/lovemoon714/archive/2012/02/29/2373695.html 1.为什么要使用包?       答:在一个大型 ...