首先创建一个MFC的对话框工程,并拉几个按钮(本文中假设3个,Button1,Button2,Button3)放在对话框上,注意留出一定的空间给子对话框。
往工程里添加3个类(CChildDlg1,CChildDlg2,CChildDlg3),基类是CDialog.
右键工程名,添加->类->选择MFC类并双击之后见下图
进入每个类的对话框资源中,将Border属性设为none,将Style属性设为child (这一步很重要)
在工程头文件中包含每个子对话框类的头文件,并声明出每个类的对象(CChildDlg1 childDlg1;CChildDlg2 childDlg2;CChildDlg3 childDlg3;)
以下有两种实现方式
一:点击一个按钮时将此按钮置为不可用,将其他按钮置为可用,销毁其他子对话框,创建本按钮对应的子对话框,这种方式比较节省内存,但是每次需要重新创建子对话框,比界面切换会不流畅
实现:
1、在每个子对话框类中重载OnCanel函数,并将其改为
void CChildDlg1::OnCancel()
{
// TODO: 在此添加专用代码和/或调用基类
DestroyWindow();
}
注意非模态对话框销毁需要重载函数OnCanel,并且在这个函数中调用DestroyWindow。并且不能调用基类的OnCancel,因为基类的OnCancel调用了EndDialog这个函数,这个函数是针对模态对话框的
2、双击Button1,进入Button1的响应函数中,添加以下代码
button1.EnableWindow(FALSE);//设置button1为不可用
button2.EnableWindow(TRUE);
button3.EnableWindow(TRUE);
childDlg1.Create(IDD_CHILDDLG1, this);
childDlg1.SetWindowPos(NULL, 20, 50, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);//设置窗口相对于父窗口的位置
childDlg1.ShowWindow(SW_SHOW);//设置childDlg1对话框为可见
childDlg2.OnCancel();//销毁child2子对话框
childDlg3.OnCancel();
对于其它两个按钮添加类似的代码(注意逻辑).
二.在主对话框的OnInitDialog函数中创建每个子对话框,并将第一个按钮设置为不可用(自己想为什么),然后在各个按钮的点击事件中用显示与隐藏的方法达到选项卡的效果,这种方法每个子对话框都存在于内存中,比较消耗资源,但是界面切换比较流畅
1.在主对话框中创建各个对话框
BOOL CMainDlg::OnInitDialog()
{
button1.EnableWindow(FALSE);
childDlg1.Create(IDD_CHILDDLG1, this);
childDlg1.SetWindowPos(NULL, 20, 50, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
childDlg1.ShowWindow(SW_SHOW);
childDlg2.Create(IDD_CHILDDLG2, this);
childDlg2.SetWindowPos(NULL, 20, 50, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
childDlg2.ShowWindow(SW_SHOW);
childDlg3.Create(IDD_CHILDDLG3, this);
childDlg3.SetWindowPos(NULL, 20, 50, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
childDlg3.ShowWindow(SW_SHOW);
}
2.在各个按钮响应函数中显示与隐藏子对话框
BOOL CMainDlg::On:OnBnClickedBtbutton1()
{
button1.EnableWindow(FALSE);
button2.EnableWindow(TRUE);
button3.EnableWindow(TRUE);
childDlg1.ShowWindow(SW_SHOW);
childDlg2.ShowWindow(SW_HIDE);
childDlg3.ShowWindow(SW_HIDE);
}
其他的两个按钮类似(注意逻辑);
OK ,有错误的地方还望大家指正 @HackerXZY