MFC对话框页面跳转(2)

概述

本文是基于两年前写的一篇文章:https://blog.csdn.net/shenweihong/article/details/128311249,最近重新使用这个功能,有更进一步的做法。
我有两个对话框,CLogInDlg(登录),CSafeVerifyCardRegisterDlg(主功能),
要求登录对话框,能跳转到主功能对话框,主功能对话框也能跳转回登录对话框。

关键代码

app类


BOOL CSafeVerifyCardRegisterApp::InitInstance()
{
	// 如果一个运行在 Windows XP 上的应用程序清单指定要
	// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
	//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
	INITCOMMONCONTROLSEX InitCtrls;
	//CLogInDlg dlg;

	InitCtrls.dwSize = sizeof(InitCtrls);
	// 将它设置为包括所有要在应用程序中使用的
	// 公共控件类。
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinApp::InitInstance();


	AfxEnableControlContainer();

	// 创建 shell 管理器,以防对话框包含
	// 任何 shell 树视图控件或 shell 列表视图控件。
	CShellManager *pShellManager = new CShellManager;

	// 标准初始化
	// 如果未使用这些功能并希望减小
	// 最终可执行文件的大小,则应移除下列
	// 不需要的特定初始化例程
	// 更改用于存储设置的注册表项
	// TODO: 应适当修改该字符串,
	// 例如修改为公司或组织名
	SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

	g_cur_dlg = DLG_LOGIN;

	while (1) {
		switch (g_cur_dlg) {
		case DLG_LOGIN:
			RunDlgLogIn();
			break;
		case DLG_MAINFUN:
			RunDlgMainFun();
			break;
		default:
			g_cur_dlg = DLG_UNDEFINE;
			break;
		}
		if (g_cur_dlg == DLG_UNDEFINE) {
			break;
		}
	}

	// 删除上面创建的 shell 管理器。
	if (pShellManager != NULL)
	{
		delete pShellManager;
	}

	// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
	//  而不是启动应用程序的消息泵。
	return FALSE;
}

void CSafeVerifyCardRegisterApp::RunDlgLogIn()
{
	CLogInDlg dlg;

	g_cur_dlg = DLG_LOGIN;
	//m_pMainWnd = &dlg;
	dlg.m_nFlags |= (WF_CONTINUEMODAL);//保证第二次DoModal能进入消息循环
	dlg.DoModal(); 
}

void CSafeVerifyCardRegisterApp::RunDlgMainFun()
{
	CSafeVerifyCardRegisterDlg dlg;

	g_cur_dlg = DLG_MAINFUN;
	//m_pMainWnd = &dlg;
	dlg.m_nFlags |= (WF_CONTINUEMODAL);//保证第二次DoModal能进入消息循环
	dlg.DoModal();
}

CLogInDlg,在WM_CLOSE消息响应函数OnClose中

void CLogInDlg::OnClose()
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (g_cur_dlg != DLG_TOJMP) {
		theApp.m_pMainWnd = this;
	}
	g_cur_dlg = DLG_UNDEFINE;
	__super::OnClose();
}
需要跳转的函数

```cpp
void CLogInDlg::JmpToMainFun()
{
	g_cur_dlg = DLG_TOJMP;
	SendMessage(WM_CLOSE);
	g_cur_dlg = DLG_MAINFUN;
}

关键提醒

1、dlg.m_nFlags |= (WF_CONTINUEMODAL),注意变量WF_CONTINUEMODAL,如果不设置,第二次进入不了消息循环很快就会退出。
2、注意控制m_pMainWnd 变量,当一个对话框将要销毁的时候,并且m_pMainWnd 指向这个对话框,整个用户界面线程就会结束,后面就不能很好地显示界面。
即只有在你想关闭界面退出的时候,把m_pMainWnd 指向当前对话框。
3、JmpToMainFun函数中,SendMessage(WM_CLOSE),是阻塞执行的。即g_cur_dlg = DLG_TOJMP;,然后执行OnClose()函数,执行函数完了再g_cur_dlg = DLG_MAINFUN;。从而达到控制好m_pMainWnd变量。

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值