MFC TAB控件的两个子对话框之间的参数传递及调用

手把手教: 基于MFC AppWizard (exe)的基本对话框应用程序中的对话框与对话框中的参数传递。实现当单击对话框A中的一个按钮控件时,对话框B中的一个按钮处于不可用状态,再单击一下,则变为可用。(要实现这种功能,关键在于使得对话框A中可以找到指向对话框B的指针,这样才能找到对应的按钮)


步骤:
1. 新建-工程- MFC AppWizard (exe)-工程名“TMTD”-应用程序类型:基本对话框;ClassWizard步骤选项均为缺省,完成。
2. 删除静态控件“TODO: 在这里设置对话控制。”;在对话框资源上从工具箱中添加上一个Tab Control 控件(ID: IDC_TAB)
3. 使用ClassWizard-Member Variable为这个控件添加一个控制变量,(Member valiable name: m_TabCtrl; Category: Control; Valiable type: TabCtrl)。
4. 创建两个新的对话框资源(ID: IDD_DIALOGA; ID: IDD_DIALOGB ),其属性作如下修改:
样式:重叠;边框:无。
5. 从这两个对话框模板生成两个新的对话框类(CDlgChildA; CDlgChildB)。
6. 在CTMTDDlg (TMTDDlg.h)中添加头文件:
#include "DlgChildA.h"
#include "DlgChildB.h"
7. 在主对话框(CTMTDDlg.h )中为新添加进来的两个对话框类增加两个成员变量:
Public: CDlgChildA m_Tab1;
Public: CDlgChildB m_Tab2;
8. 在主对话框(CTMTDDlg.h )的OnInitDialog()函数中添加如下类似的代码:
// TODO: Add extra initialization here
TCITEM item;
item.mask = TCIF_TEXT;


item.pszText = "第一页";
m_TabCtrl.InsertItem (0, &item);
item.pszText ="第二页";
m_TabCtrl.InsertItem (1, &item);


m_Tab1.Create (IDD_DIALOGA, &m_TabCtrl);
m_Tab2.Create (IDD_DIALOGB, &m_TabCtrl);


m_Tab1.m_MyDlg2 = &m_Tab2;       

CRect r;
m_TabCtrl.GetClientRect (&r);


m_Tab1.SetWindowPos(NULL, 10, 30, r.right-20, r.bottom-40, SWP_SHOWWINDOW);
m_Tab2.SetWindowPos(NULL, 10, r.bottom-40, r.right-20, r.bottom-40, SWP_HIDEWINDOW);
说明:
InsertIte() 函数的调用是为了给标签控件增加两个标签页面,文本是标题。
SetWindowPos() 函数设置这两个对话框在显示屏幕中顺序中的位置,显示或隐藏状态。
9. 通过ClassWizard-MessageMaps,在主对话中为标签控件添加一个标签选择改变的控件通知消息(Class name: CTMTDDlg; Objects IDs: IDC_TAB ; Messages: TCN_SELCHANGE)。以便在用户选择标签时通知主对话框。在主对话框的编辑界面右击标签控件,选择添加一个事件可以完成这个操作。添加代码如下:
void CTMTDDlg::OnSelchangeTab(NMHDR* pNMHDR, LRESULT* pResult) 
{
CRect r;
m_TabCtrl.GetClientRect (&r);


switch(m_TabCtrl.GetCurSel())
{
case 0:
m_Tab1.SetWindowPos(NULL, 10, 30, r.right-20, r.bottom-40, SWP_SHOWWINDOW);
m_Tab2.SetWindowPos(NULL, 10, r.bottom-40, r.right-20, r.bottom-40, SWP_HIDEWINDOW);
break;
case 1:
m_Tab1.SetWindowPos(NULL, 10, 30, r.right-20, r.bottom-40, SWP_HIDEWINDOW);
m_Tab2.SetWindowPos(NULL, 10, r.bottom-40, r.right-20, r.bottom-40, SWP_SHOWWINDOW);
break;
}


*pResult = 0;
}
10. 在对话框A上添加按钮(ID: IDC_BTN_A, 标题: BtnDlgA;);在对话框B上添加按钮(ID: IDC_BTN_B, 标题: BtnDlgB;)
11. 在CDlgChildA (DlgChildA.h)中添加一个对话框指针变量:
Public: CDlgChildB* m_MyDlg2;
12. 在CDlgChildA (DlgChildA.h)中添加头文件:
#include "DlgChildB.h"
13. 找到主对话框(CTMTDDlg.h )的OnInitDialog()函数添加以下代码:(如上面红字部分)
m_Tab1.m_MyDlg2 = &m_Tab2;
注意:
这里要添加的一行代码必须放在m_Tab1和m_Tab2实例化之后,即Create函数之后
14. 通过ClassWizard-MessageMaps,在对话框A中为按钮控件添加一个按钮按下的控件通知消息(Class name: CDlgChildA; Objects IDs: IDC_BTN_A ; Messages: BN_CLICKED)。以便在用户当单击对话框A中的一个按钮控件时,对话框B中的一个按钮处于不可用状态,再单击一下,则变为可用。添加代码如下:
void CDlgChildA::OnBtnA() 
{
if ( m_MyDlg2->GetDlgItem(IDC_BTN_B)->IsWindowEnabled() )
{
m_MyDlg2->GetDlgItem(IDC_BTN_B)->EnableWindow(0);
}else{
m_MyDlg2->GetDlgItem(IDC_BTN_B)->EnableWindow(1);
}
}


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值