首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MFC 對話框視窗狀態記憶:最大化/還原位置持久化

     編輯:程式設計疑難解答

SDI vs 對話框的差異

SDI 框架視窗(CFrameWnd)內建 LoadFrame/SaveFrame 機制自動記憶位置/大小/最大化狀態。對話框(CDialog)無此機制,需自行實作。

實作方案:GetWindowPlacement + 登錄表

1. 關閉時儲存

void CMyDialog::OnClose()
{
    WINDOWPLACEMENT wp = { sizeof(WINDOWPLACEMENT) };
    GetWindowPlacement(&wp);
    
    CWinApp* pApp = AfxGetApp();
    pApp->WriteProfileBinary(_T("WindowState"), _T("Placement"), 
                             (BYTE*)&wp, sizeof(wp));
    
    CDialog::OnClose();
}

2. 初始化時恢復

BOOL CMyDialog::OnInitDialog()
{
    CDialog::OnInitDialog();
    
    CWinApp* pApp = AfxGetApp();
    BYTE* pData = NULL; UINT nBytes = 0;
    if (pApp->GetProfileBinary(_T("WindowState"), _T("Placement"), &pData, &nBytes)) {
        if (nBytes == sizeof(WINDOWPLACEMENT)) {
            WINDOWPLACEMENT* pWp = (WINDOWPLACEMENT*)pData;
            SetWindowPlacement(pWp);
        }
        delete[] pData;
    }
    return TRUE;
}

關鍵結構說明

WINDOWPLACEMENT 包含:

  • showCmd:SW_SHOWMAXIMIZED / SW_SHOWNORMAL / SW_SHOWMINIMIZED
  • rcNormalPosition:還原時的視窗矩形
  • ptMinPosition、ptMaxPosition:最小化/最大化位置

替代儲存位置

  • INI 檔案:WritePrivateProfileStruct / GetPrivateProfileStruct
  • XML/JSON 設定檔:現代應用常用,跨平台友善。

參考百度百科 GetWindowPlacement 詳細說明。實作後,對話框關閉前的最大化/位置/大小將完美還原。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved