MFC SDI 中 通过注册表保存当前窗体的 显示状态位置

在 框架类响应 WM_CLOSE消息的时候添加如下代码


HKEY key;//用于接收注册表项句柄
WINDOWPLACEMENT info; //获得窗体位置状态信息
GetWindowPlacement(&info); //CWnd类的函数获取一个窗体的状态信息
if(ERROR_SUCCESS== //调用RegOpenKeyEx 打开注册表 返回key 如果成功 返回 ERROR_SUCCESS
RegOpenKeyEx(
HKEY_CURRENT_USER,//要打开的项的句柄 具体看MSDN
"Software\\WolfeLee\\SaveWinState\\Settings", //子项
0, //保留0

KEY_ALL_ACCESS, //所有权限

&key)) //返回子项句柄
{

DWORD des; //用于接收返回信息 这里不用
if(ERROR_SUCCESS==::RegCreateKeyEx ( //如果注册表创建成功 那么返回ERROR_SUCCESS
HKEY_CURRENT_USER,
"Software\\WolfeLee\\SaveWinState\\Settings",
0,
"State", //类型
REG_OPTION_NON_VOLATILE,//在windows重启的时候我们创建的注册表 依然保存
KEY_ALL_ACCESS, //所有权限
NULL, //默认安全结构
&key, //用于接收HKEY
&des))
{// 将窗口信息保存到注册表中
RegSetValueEx(key, "WindowState", 0, REG_BINARY, (LPBYTE)&info, sizeof(WINDOWPLACEMENT)); //用二进制的形式保存窗体信息
RegCloseKey(key);// 关闭注册表
}

}

以上完成了 状态的饿保存 我们如何在启动的时候加载注册表信息 在 APP的 初始化函数中 要在 m_pMainWnd->ShowWindow(SW_SHOW) 之前获取窗体信息

添加下面代码

///读取注册表

HKEY key;
DWORD type,n;
WINDOWPLACEMENT info;
if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_CURRENT_USER, //打开先前创建注册表 如果没有键值那么我们调用原来的设置
"Software\\WolfeLee\\SaveWinState\\Settings",
0,
KEY_ALL_ACCESS,
&key))
{
RegQueryValueEx(key, //注册表的句柄
"WindowState", //我们保存的键值的名字
0,
&type, //获取类型
(LPBYTE)&info, //获取 状态信息
&n);

this->m_pMainWnd->SetWindowPlacement(&info); //设置窗体位置信息
}
else
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();

以上完成了对 窗体状态的保存

你可能感兴趣的:(mfc)