![](/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.