VS2017 + MFC对话框中创建子对话框

MFC实现创建多个子对话框

  由于使用的平台是VS2017,查阅网上的资料大多是旧版本的操作步骤,因此借鉴了(VS2013)MFC对话框中用多个按钮创建多个子对话框实现选项卡效果MFC实现子对话框间切换两位博主的博客进行设计,步骤如下:

  • 创建一个MFC对话框工程,添加三个Button控件。对每个Button添加变量:分别右键Button1,Button2,Button3=》添加变量=》分别添加名称button1,button2,button3
  • 添加MFC类:CChildDlg1,CChildDlg2,CChildDlg3
    • ①首先说一种简洁办法:右键项目=》添加=》新建项=》MFC=》MFC类,类名即上述三个
    • 在这里插入图片描述
    • 基类选择CDialog,并可命名对话框ID,创建后设置每个对话框窗体的style为child;在工程头文件···Dlg.h中包含每个子对话框类的头文件,并声明出每个类的对象CChildDlg1 childDlg1;CChildDlg2 childDlg2;CChildDlg3 childDlg3;
    • ②右键···-Dialog对话框=》添加类
      在这里插入图片描述
      类名分别是CChildDlg1,CChildDlg2,CChildDlg3,基类是CDialog,对话框ID先不用设置
    • 视图=》资源视图 =》Dialog =》右键···_DIALOG文件=》添加资源=》选择Dialog
      在这里插入图片描述
      设置每个对话框的style为child
    • 分别打开CChildDlg1.h,CChildDlg2.h,CChildDlg3.hCChildDlg1.cpp,CChildDlg2.cpp,CChildDlg3.cpp修改加入对应的子对话框ID
    • 在这里插入图片描述
    • 在这里插入图片描述
  • 在工程头文件···Dlg.h中包含每个子对话框类的头文件,并声明出每个类的对象CChildDlg1 childDlg1;CChildDlg2 childDlg2;CChildDlg3 childDlg3;
  • 按钮的操作有两种实现方式:
    • 点击一个按钮时将此按钮置为不可用,将其他按钮置为可用,销毁其他子对话框,创建本按钮对应的子对话框,这种方式比较节省内存,但是每次需要重新创建子对话框,比界面切换会不流畅
      • 在每个子对话框类中重载OnCanel函数,并将其改为
        void CChildDlg1::OnCancel()
        {
        	// TODO:  在此添加专用代码和/或调用基类	
        	DestroyWindow();
        }
        
      • 进入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函数中创建每个子对话框,并将第一个按钮设置为不可用,然后在各个按钮的点击事件中用显示与隐藏的方法达到选项卡的效果,这种方法每个子对话框都存在于内存中,比较消耗资源,但是界面切换比较流畅
      • 在主对话框中创建各个对话框
        	// TODO: 在此添加额外的初始化代码
        
        	button1.EnableWindow(FALSE);
        	childDlg1.Create(IDD_DIALOG1, this);
        	childDlg1.SetWindowPos(NULL, 20, 50, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
        	childDlg1.ShowWindow(SW_HIDE);
        	childDlg2.Create(IDD_DIALOG2, this);
        	childDlg2.SetWindowPos(NULL, 20, 50, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
        	childDlg2.ShowWindow(SW_HIDE);
        	childDlg3.Create(IDD_DIALOG3, this);
        	childDlg3.SetWindowPos(NULL, 20, 50, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
        	childDlg3.ShowWindow(SW_HIDE);
        
      • 在各个按钮响应函数中显示与隐藏子对话框
        	// TODO: 在此添加控件通知处理程序代码
        	button1.EnableWindow(FALSE);
        	button2.EnableWindow(TRUE);
        	button3.EnableWindow(TRUE);
        	childDlg1.ShowWindow(SW_SHOW);
        	childDlg2.ShowWindow(SW_HIDE);
        	childDlg3.ShowWindow(SW_HIDE);
        

在这里插入图片描述

  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值