c++ MDI保存窗口状态

1.新建MDI应用程序

2 重写CMainFrame的OnClose消息 

void CMainFrame::OnClose()
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	HKEY key;
	CString appKey = _T("software\\Test\\Setting");
	CString keyName = _T("WinState");
	if (RegOpenKeyEx(HKEY_CURRENT_USER,appKey,0,KEY_WRITE,&key)!=ERROR_SUCCESS)
	{
		DWORD disposition;
		RegCreateKeyExW(HKEY_CURRENT_USER,appKey,0,_T(""),REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&key,&disposition);

	}
	WINDOWPLACEMENT winInfo;
	GetWindowPlacement(&winInfo);
	RegSetValueExW(key, keyName, 0, REG_BINARY, (LPBYTE)&winInfo, sizeof(WINDOWPLACEMENT));
	RegCloseKey(key);

	CMDIFrameWnd::OnClose();
}

3 修改CAPP的InitInstance()的代码

BOOL CMDI02165App::InitInstance()
{
	// 如果一个运行在 Windows XP 上的应用程序清单指定要
	// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
	//则需要 InitCommonControlsEx()。  否则,将无法创建窗口。
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// 将它设置为包括所有要在应用程序中使用的
	// 公共控件类。
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	CWinApp::InitInstance();


	// 初始化 OLE 库
	if (!AfxOleInit())
	{
		AfxMessageBox(IDP_OLE_INIT_FAILED);
		return FALSE;
	}

	AfxEnableControlContainer();

	EnableTaskbarInteraction(FALSE);

	// 使用 RichEdit 控件需要 AfxInitRichEdit2()
	// AfxInitRichEdit2();

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


	// 注册应用程序的文档模板。  文档模板
	// 将用作文档、框架窗口和视图之间的连接
	CMultiDocTemplate* pDocTemplate;
	pDocTemplate = new CMultiDocTemplate(IDR_MDI02165TYPE,
		RUNTIME_CLASS(CMDI02165Doc),
		RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
		RUNTIME_CLASS(CMDI02165View));
	if (!pDocTemplate)
		return FALSE;
	AddDocTemplate(pDocTemplate);

	// 创建主 MDI 框架窗口
	CMainFrame* pMainFrame = new CMainFrame;
	if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
	{
		delete pMainFrame;
		return FALSE;
	}
	m_pMainWnd = pMainFrame;


	// 分析标准 shell 命令、DDE、打开文件操作的命令行
	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);



	// 调度在命令行中指定的命令。  如果
	// 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
	if (!ProcessShellCommand(cmdInfo))
		return FALSE;

	HKEY key;
	DWORD keyType = REG_BINARY;
	DWORD keySize = sizeof(WINDOWPLACEMENT);
	WINDOWPLACEMENT winInfo;
	LONG regInfo= -1;
	CString appKey = _T("software\\Test\\Setting");
	CString keyName = _T("WinState");
	if (RegOpenKeyExW(HKEY_CURRENT_USER,appKey,0,KEY_READ,&key)==ERROR_SUCCESS)
	{
		regInfo = RegQueryValueExW(key, keyName, 0, &keyType, (LPBYTE)&winInfo, &keySize);
		RegCloseKey(key);
	}
	if (regInfo==ERROR_SUCCESS)
	{
		m_pMainWnd->SetWindowPlacement(&winInfo);
	}
	else
	{
		m_pMainWnd->ShowWindow(m_nCmdShow);
	}

	// 主窗口已初始化,因此显示它并对其进行更新
	/*pMainFrame->ShowWindow(m_nCmdShow);*/
	/*pMainFrame->ShowWindow(SW_SHOWMAXIMIZED);*/
	pMainFrame->UpdateWindow();

	return TRUE;
}

猜你喜欢

转载自blog.csdn.net/dxm809/article/details/113822932