且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-08-13 08:14:32

   

在 框架类响应 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();

 

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