弄了好久,今天终于把在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. display:inline-block左右元素上下不对齐

    今天做了两个inline-block元素,出现左右两个元素顶端出现上下不对齐的情况(下图): 解决办法: 把应用 inline-block的元素加上 vertical-align: top; .CSS ...

  2. cs11_c++_lab1

    lab1.cpp #include "Point.hh" #include <iostream> #include <cmath> using namesp ...

  3. 我要崩溃了,要解出这么一段js代码背后的东西,这真是一坨啊,别被高度欺骗了,他还有宽度!!!!!试着按下方向右键

    一坨js代码: function s_gi(un, pg, ss) { var c = "s.version='H.26';s.an=s_an;s.logDebug=function(m){ ...

  4. Java串口通信详解

    http://blog.csdn.net/kabini/article/details/1601324 ———————————————————————————————————————————————— ...

  5. 【227】◀▶ IDL 其他常用函数

    参考:Programming and Control Routines —— 编程和控制函数 01   N_ELEMENTS 表达式或者变量的元素个数. 02   DEFSYSV 定义系统变量. 03 ...

  6. js 构造函数

    //构造函数  //使自己的对象多次复制,同时实例根据设置的访问等级可以访问其内部的属性和方法  //当对象被实例化后,构造函数会立即执行它所包含的任何代码  function myObject(ms ...

  7. LZW压缩算法

    转载自http://www.cnblogs.com/jillzhang/archive/2006/11/06/551298.html 记录此处仅自己供学习之用 lzw解压缩算法: 用单个字符初始化字符 ...

  8. nullcon HackIM 2016 -- Programming Question 2

    Your simple good Deeds can save you but your GREED can kill you. This has happened before. This gree ...

  9. 把表里的数据转换为insert 语句

    当表里面有数据时,怎么把表里的数据转换为insert 语句 (从别人那里看来的用SQLServer 2008 R2测试可用) CREATE PROC spGenInsertSQL @TableName ...

  10. OA项目之导出

    要导出页的前台: <asp:Button runat="server" ID="btnExport" Text="导出" CssCla ...