MFC 通过按钮实现多个子对话框的动态切换

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>

5.Ads

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/CoomCon/article/details/102938281