![](/img/trans.png)
[英]Migrated MFC app from VC6 to VS2010, now OnInitDialog() not called for CPropertyPage subclass
[英]How to OnInitDialog every CPropertyPage in MFC?
我有 2 个CPropertyPage
对象; 现在,如果我点击第二页,第二页只会点击OnInitDialog
。
程序启动时如何立即初始化它?
您可以将PSP_PREMATURE
添加到每个属性页的m_psp
数据成员( PROPSHEETPAGE
结构)的dwFlags
字段中。 这会在创建父属性表时强制实际创建该页面(因此调用其OnInitDialog()
函数),而不是等到该页面被选中。
我可以找到的唯一在线文档现在已“弃用”,但该技术仍然有效。
- dwFlags
...
PSP_PREMATURE
该页面是在创建属性表时创建的。 通常,页面在第一次被选中时才会创建。
您可以在每个页面的构造函数中添加此标志; 像这样的东西:
class MyPropPage : public CPropertyPage
{
public:
MyPropPage(UINT idd) : CPropertyPage(idd) {
m_psp.dwFlags |= PSP_PREMATURE; // Add the 'premature' flag on construction
//...
}
//...
};
您可能希望在CPropertySheet
中使用WM_TIMER
消息,如下所示:
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, 1, 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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.