破坏属性表的OK,CANCEL和HELP窗口的效果

时间:2015-03-30 11:02:23

标签: c++ mfc dialog cpropertysheet

我想在项目中使用基于CPropertySheet的应用程序,但我不想要CPropertySheet类附带的默认OK,Cancel,Help和Apply按钮。因此,我在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编译程序时,我在行处收到Debug Assertion Failed错误消息 “的的CPropertySheet ::的OnInitDialog();
任何人都可以详细说明为什么会发生这种情况吗?

2 个答案:

答案 0 :(得分:-1)

How to Hide the Apply Button in CPropertySheet。销毁窗口不是隐藏属性表默认按钮的正确解决方案。我建议你使用&#34; ShowWindow()&#34; 。但正如您已经提到的那样,showwindow()也会产生问题,如果您的通话是正确的,这是不可能的。如果您的ShowWindow()不在&#34; OnInitDialog()&#34;函数然后更好地将此函数移动到&#34; OnCreate()&#34;。如果它不起作用,那么请分享你的整个.H和.CPP文件。

答案 1 :(得分:-2)

  1. 您应该致电ShowWindow (SW_HIDE);而不是DestroyWindow();
  2. 此外,无需将CWnd*返回的GetDlgItem()投射到CButton*
  3. 请同时注释掉CButton SaveChanges;声明。您 不需要它。
  4. 您也可以使用内置标志来执行此操作:

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

    重要提示:一般情况下,请在调试模式下运行您的应用程序以查看它的ASSERT位置。