如何在 MFC 中的每个 CPropertyPage OnInitDialog?

问题描述

我有 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);
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...