簡體   English   中英

如何對 MFC 中的每個 CPropertyPage 進行 OnInitDialog?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM