MFC 通过按钮实现多个子对话框的动态切换
顾名思义,主要目的是通过代码在一个Dialog下面,动态新建子窗口1,切换到子窗口2,销毁1等操作。
该教程需要读者具有基本的mfc编程基础。
1.效果图
下一步转换的窗口均为子窗口。
2.实现方法
1 新建三个dialog:
第一个dialog为主窗口,设置下ID即可,其他不需要设置。
第二个窗口和第三个窗口均为子窗口,
分别设置Border为None,Style为Child.
随便添加几个空间以区分两个子窗口,此外添加Button按钮用于子窗口之间的切换。
子窗口属性页如下图:
2.实现方法
- 1: 子窗口1的创建
下面需要做的就是添加实现方法了。
主窗口OnCreat添加代码,该功能实现的是,主窗口在创建时一并创建子窗口1.如果需要其他触发条件,把相应代码从OnCreate中删除,填到其他方法中即可。
代码贴图如下:
int MyDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialogEx::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
CRect rc;
GetClientRect(rc);
//1.动态生成PreSet对象对话框
CatctPathPreSetDlg = new CatctPathPreSet();
CatctPathPreSetDlg->Create(IDD_CatCtPathPreSet, this);
CRect rcDialog1;
CatctPathPreSetDlg->GetClientRect(rcDialog1);
CatctPathPreSetDlg->MoveWindow(0, 80, rcDialog1.right,80+ rcDialog1.bottom);
CatctPathPreSetDlg->ShowWindow(SW_SHOW);
return 0;
}
3.子窗口的切换
这是重点。涉及到自定义消息的处理。主要是一个函数的使用,如下
::POSTMESSAGE
- 1: 自定义消息
首先自定义消息,添加到主窗口头文件中。
#define WM_Dlg1stDestory_MESSAGE (WM_USER + 0x001)
#define MyMsgChangePage 0x001
#define MyMsgToPage1 0x001
#define MyMsgToPage2 0x002
- 2: 子窗口发送消息
添加子窗口1的按钮实现函数。首先隐藏子窗口1,获取主窗口句柄,然后向主窗口发送消息
void CatctPathPreSet::OnBnClickedCatCtPathNext1()
{
ShowWindow(SW_HIDE);
HWND hwnd = this->GetParent()->m_hWnd;
::PostMessage(hwnd,WM_Dlg1stDestory_MESSAGE,MyMsgChangePage,MyMsgToPage1);
}
- 3: 主窗口接收消息
主窗口
.h头文件中添加函数:
afx_msg LRESULT OnDlg1stDestoryMessage(WPARAM wParam, LPARAM lParam);
.cpp文件中添加映射:
ON_MESSAGE(WM_Dlg1stDestory_MESSAGE,OnDlg1stDestoryMessage)
具体如下图:
.cpp文件添加实现函数
LRESULT CCatctPathGenrate::OnDlg1stDestoryMessage(WPARAM wParam, LPARAM lParam)
{
//1.动态生成PreSet对象对话框
if(wParam == MyMsgChangePage)
{
if(lParam == MyMsgToPage1)
{
m_CatCtPathSet1st = new CatCtPathSet1st();
m_CatCtPathSet1st->Create(IDD_CatCtPathSet1St, this);
CRect rcDialog1;
m_CatCtPathSet1st->GetClientRect(rcDialog1);
m_CatCtPathSet1st->MoveWindow(0, 80, rcDialog1.right, 80+ rcDialog1.bottom);
m_CatCtPathSet1st->ShowWindow(SW_SHOW);
Invalidate(TRUE);
}
else if(lParam == MyMsgToPage2)
{
}
}
return 0;
}
4.备注
互相引用dlg的头文件自行添加。POSTMESSAG找不到的话添加头文件
#include <Windows.h>