破坏滤纸的“确定”、“取消”和“帮助”窗口的效果

Effect of destroying OK, CANCEL and HELP windows of a porperty sheet

本文关键字:帮助 窗口 取消 确定      更新时间:2023-10-16

我想为项目使用基于 CPropertySheet 的应用程序,但我不想要那些默认的 CPropertySheet 类附带的"确定"、"取消"、"帮助"和"应用"按钮。因此,我在OnInitDialog上销毁了这些窗口。以下是供参考的代码:

BOOLCProductUI::OnInitDialog()
{
    CPropertySheet::OnInitDialog();
    CRect rect;
    CButton *pTempBtn;
    CButton SaveChanges;
    pTempBtn = reinterpret_cast<CButton *>(GetDlgItem(IDHELP));
    if (NULL != pTempBtn)
    {
        pTempBtn->GetWindowRect(&rect);
        pTempBtn->DestroyWindow();
    }
    pTempBtn = reinterpret_cast<CButton *>(GetDlgItem(IDOK));
    if (NULL != pTempBtn)
    {
        pTempBtn->DestroyWindow();
    }
    pTempBtn = reinterpret_cast<CButton *>(GetDlgItem(IDCANCEL));
    if (NULL != pTempBtn)
    {
        pTempBtn->DestroyWindow();
    }
    pTempBtn = reinterpret_cast<CButton *>(GetDlgItem(ID_APPLY_NOW));
    if (NULL != pTempBtn)
    {
        ScreenToClient(&rect);
        pTempBtn->MoveWindow(rect);
        pTempBtn->SetWindowText(_T("Save Changes"));
    }
    UpdateData(FALSE);
    return TRUE;
}

CProductUI是CPropertySheet的一类。
但是,当我在调试模式下使用 VC++2008 编译程序时,我收到调试断言失败错误消息
">CPropertySheet::OnInitDialog((;">
谁能说明为什么会发生这种情况?

根据如何在 CPropertySheet 中隐藏"应用"按钮。销毁窗口不是隐藏属性表默认按钮的正确解决方案。我建议你使用"ShowWindow(("。但是正如您已经提到的,您的showwindow((也会产生问题,如果您的调用正确,则这是不可能的。顺其自然,如果你的ShowWindow((在"OnInitDialog(("函数中不起作用,那么最好把这个函数移到"OnCreate(("。另外,如果它不起作用,那么请分享您的整个.H 和 .CPP 文件。

  1. 您应该调用ShowWindow (SW_HIDE);而不是DestroyWindow();
  2. 也没有必要将CWnd* GetDlgItem()返回投给CButton*
  3. 也请注释掉您的CButton SaveChanges;声明。你不需要它。

您还可以使用内置标志来执行此操作:

CMyPropertyPage myPage;
myPage.m_psp.dwFlags &= ~PSP_HASHELP;
myPropertySheet.AddPage(&myPage);
myPropertySheet.m_psh.dwFlags |= PSH_NOAPPLYNOW;
myPropertySheet.m_psh.dwFlags &= ~PSH_HASHELP;

重要说明:通常,请在调试模式下运行应用程序以查看其断言位置。