MFC SDI OpenDocument() 正在重置我的主要 window 大小。我怎样才能阻止它?

MFC SDI OpenDocument() is resetting my main window size. How can I stop it?

我已经实现了代码来保存和加载主要的 window 大小和位置,这工作正常,但是,当我打开文档时,它会将 window 大小更改回某些内部默认值。

这些是来自 Windows 我看到的导致更改发生的电话:

CSingleDocTemplate::OpenDocumentFile()
CFrameWnd::InitialUpdateFrame()
CWnd::SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE)

这是我保存和加载 window 信息的代码:

BOOL CDisplayApp::InitInstance()
{
// existing code .....
    LONG Ret;
    HKEY RegistryKey;
    DWORD type = REG_BINARY;
    WINDOWPLACEMENT sWP;
    DWORD sizewp = sizeof(WINDOWPLACEMENT);
    
    Ret = RegOpenKeyEx(
        HKEY_CURRENT_USER,
        _T("SOFTWARE\Local AppWizard-Generated Applications\display\PreservedWindowPos"),
        0,
        KEY_READ,
        &RegistryKey);
    
    if (Ret == ERROR_SUCCESS) {
        Ret = ::RegQueryValueEx(RegistryKey,
            _T("PosAndSize"),
            0,
            &type,
            (LPBYTE)&sWP,
            &sizewp);

        if (Ret != ERROR_SUCCESS)
            m_pMainWnd->ShowWindow(SW_SHOW);
        else
            m_pMainWnd->SetWindowPlacement(&sWP);
    }
}


int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// existing code .....
    this->LoadBarState(_T("MainToolBar"));
}


void CMainFrame::OnClose()
{
    // TODO: Add your message handler code here and/or call default

    LONG Ret;
    HKEY Registry_Key;
    DWORD disposition;
    WINDOWPLACEMENT sWindow_Position;

    SaveBarState(_T("MainToolBar"));

    Ret = RegOpenKeyEx(
        HKEY_CURRENT_USER,
        _T("SOFTWARE\Local AppWizard-Generated Applications\display\PreservedWindowPos"),
        NULL,
        KEY_WRITE,
        &Registry_Key);

    if (Ret != ERROR_SUCCESS)
    {
        RegCreateKeyEx(
            HKEY_CURRENT_USER,
            _T("SOFTWARE\Local AppWizard-Generated Applications\display\PreservedWindowPos"),
            NULL,
            NULL,
            REG_OPTION_NON_VOLATILE,
            KEY_ALL_ACCESS,
            NULL,
            &Registry_Key,
            &disposition);
    }

    GetWindowPlacement(&sWindow_Position);

    RegSetValueEx(
        Registry_Key,
        _T("PosAndSize"),
        NULL,
        REG_BINARY,
        (BYTE*)&sWindow_Position,
        sizeof(WINDOWPLACEMENT));
    RegCloseKey(Registry_Key);

    CFrameWnd::OnClose();
}

如果 window 大小和位置在我打开文档时保持不变,我会很高兴。我该怎么做?

我认为这里的正确答案是我的代码是旧的,我需要创建一个新的 SDI 项目并将我的程序移植到它上面,然后再继续这样做。那我看看我还有没有这些问题。

没关系!我很惭愧地报告问题出在我自己的 window 大小调整代码中,我在 CView::OnInitialUpdate() 中编写并忘记了很久以前。抱歉!