繁体   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