首先定义保存窗口属性的注册表中的几个键值:
#define COMPANY_KEY "SunwardCompany"
#define SETTINGS_KEY "Settings"
#define WINDOWPLACEMENT_KEY "Window Placement"
然后是保存窗口的设置。重载窗口的OnClose函数。
void
CHelloWindow::OnClose(
void
)
... {
SaveBarState("Control Bar States");
WINDOWPLACEMENT wp;
GetWindowPlacement(&wp);
AfxGetApp()->WriteProfileBinary(SETTINGS_KEY,WINDOWPLACEMENT_KEY,(BYTE*)&wp,sizeof(WINDOWPLACEMENT));
CFrameWnd::OnClose();
}
... {
SaveBarState("Control Bar States");
WINDOWPLACEMENT wp;
GetWindowPlacement(&wp);
AfxGetApp()->WriteProfileBinary(SETTINGS_KEY,WINDOWPLACEMENT_KEY,(BYTE*)&wp,sizeof(WINDOWPLACEMENT));
CFrameWnd::OnClose();
}
最后就是读取上一次关闭时窗口的设置。
int
CHelloWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
... {
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
LoadBarState("Control Bar States");
return 0;
}
BOOL CHellowApp::InitInstance()
... {
//设置注册表的关联项
SetRegistryKey(COMPANY_KEY) ;
m_pMainWnd = new CHelloWindow();
m_pMainWnd->ShowWindow(m_nCmdShow);
BYTE *p;
UINT size;
WINDOWPLACEMENT *pWP;
if (GetProfileBinary(SETTINGS_KEY, WINDOWPLACEMENT_KEY, (LPBYTE *)&pWP, &size))
...{
m_pMainWnd->SetWindowPlacement(pWP);
delete []pWP;
}
else
...{
m_pMainWnd->ShowWindow(m_nCmdShow);
}
m_pMainWnd->UpdateWindow();
return TRUE;
}
... {
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
LoadBarState("Control Bar States");
return 0;
}
BOOL CHellowApp::InitInstance()
... {
//设置注册表的关联项
SetRegistryKey(COMPANY_KEY) ;
m_pMainWnd = new CHelloWindow();
m_pMainWnd->ShowWindow(m_nCmdShow);
BYTE *p;
UINT size;
WINDOWPLACEMENT *pWP;
if (GetProfileBinary(SETTINGS_KEY, WINDOWPLACEMENT_KEY, (LPBYTE *)&pWP, &size))
...{
m_pMainWnd->SetWindowPlacement(pWP);
delete []pWP;
}
else
...{
m_pMainWnd->ShowWindow(m_nCmdShow);
}
m_pMainWnd->UpdateWindow();
return TRUE;
}
注册表的位置在:HKEY_CURRENT_USER/Software/<company name>/<application name>/<section name>/<value name>.
注意:因为CFrameWnd的OnCreate和OnClose函数不是虚函数,需要捕获窗口的消息循环。否则是不会运行到你自己写的这两个函数里的。
BEGIN_MESSAGE_MAP(CHelloWindow, CFrameWnd)
ON_WM_CLOSE()
ON_WM_CREATE()
END_MESSAGE_MAP()