问题描述
我有 2 个 CPropertyPage
对象;现在,如果我点击第二页,第二页只会点击 OnInitDialog
。
如何在程序启动时立即初始化?
解决方法
您可以将 PSP_PREMATURE
添加到每个属性页的 dwFlags
数据成员(m_psp
结构)的 PROPSHEETPAGE
字段。这会在创建父属性表时强制实际创建该页面(从而调用其 OnInitDialog()
函数),而不是等到页面被选中。
我能找到的唯一 online documentation 现在“已弃用”,但该技术确实仍然有效。
- dwFlags
...PSP_PREMATURE
在创建属性表时创建页面。通常,页面直到 第一次被选中。
您可以在每个页面的构造函数中添加这个标志;像这样:
class MyPropPage : public CPropertyPage
{
public:
MyPropPage(UINT idd) : CPropertyPage(idd) {
m_psp.dwFlags |= PSP_PREMATURE; // Add the 'premature' flag on construction
//...
}
//...
};
,
您可能希望在您的 WM_TIMER
中使用 CPropertySheet
消息,如下所示:
BOOL CMyPropertySheet::OnInitDialog()
{
SetTimer(1,1,NULL);
return CPropertySheet::OnInitDialog();
}
void CMyPropertySheet::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == 1)
{
KillTimer(1);
SetActivePage(1); // initialize second tab
SetTimer(2,NULL);
}
else if (nIDEvent == 2)
{
KillTimer(2);
SetActivePage(0); // back to first tab
// to hide the initialization process,you might want to create
// CMyPropertySheet with the WS_VISIBLE style disabled and wait
// until all pages are initialized:
ShowWindow(SW_SHOW);
}
CPropertySheet::OnTimer(nIDEvent);
}