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() 中编写并忘记了很久以前。抱歉!
我已经实现了代码来保存和加载主要的 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() 中编写并忘记了很久以前。抱歉!