弄了好久,今天终于把在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. LCD1602写自定义字符的Verilog源码

    开发工具:Quartus II 9.1: 仿真软件:Questa Sim 10.0c: 硬件平台:Terasic DE2-115(EP2C35F672C6): 外设:hd44780控制器lcd1602 ...

  2. 关于@property()的那些属性及ARC简介

    @property()常用的属性有:nonatomic,atomic,assign,retain,strong,weak,copy. 其中atomic和nonatomic用来决定编译器生成的gette ...

  3. 5.Makefile的原理及应用

    1.概念 目标:目标顶格写,后面是冒号(冒号后面是依赖) 依赖:依赖是用来产生目标的原材料. 命令:命令前面一定是两个Tab,不能是定格,也不能说多个空格.命令就是要生成那个目标需要做的动作. 2.基 ...

  4. Egret中的对象池ObjectPool

    为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...

  5. objective c, category 和 protocol 中添加property

    property的本质是实例变量 + getter 和 setter 方法 category和protocol可以添加方法 category 和 protocol中可以添加@property 关键字 ...

  6. 编程实践中C语言的一些常见细节

    对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个环境获得,为简化起见, ...

  7. nginx环境下配置nagios-关于perl-fcgi.pl

    配置文件如下: 请注意,网上提供的官方文档在运行时可能会出现问题,此文中保证无问题. ; ; ; ;  ); ;  ); ; ;          my $pidnumber = $$;        ...

  8. SQL SERVER连接、合并查询

    ----创建测试表MyStudentInfoCREATE table MyStudentInfo(  Id int not null primary key,  Name varchar(16),  ...

  9. console.log的应用

    这两天在学javascript,但是有个问题老是觉得很疑惑,那就是这两个表达式到底有啥区别,虽然结果输出都差不多,但是我想这个两个表达式被开发出来,肯定是有意义的吧!哪位高手解答下吧!Thanks i ...

  10. JQuery Mobile 页面参数传递(转)

    在单页模版中使用基于HTTP的方式通过POST和GET请求传递参数,而在多页模版中不需要与服务器进行通信,通常在多页模版中有以下三种方法来实现页面间的参数传递. 1.GET方式:在前一个页面生成参数并 ...