禁用对话框确定按钮MFC

时间:2013-06-21 11:01:43

标签: c++ mfc dialog

如何禁用MFC对话框确定按钮?
这段代码:
CWnd* fieldOK = pDlg->GetDlgItem(IDOK);
fieldOK->EnableWindow(FALSE);

导致异常“访问冲突读取位置...... ”  来自ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));的{​​{1}}中CWnd::EnableWindow(BOOL bEnable)的{​​{1}}行{} 在这个时候,重点是另一个控制 什么是错的?

感谢您的帮助。

[EDITED]

winnocc.cpp

5 个答案:

答案 0 :(得分:4)

我不确定为什么不能这样做。如果我采用普通的CDialog,我会像这样做一个init:

BOOL CMyDialog::OnInitDialog() {
    CDialog::OnInitDialog();
    CWnd *okbtn = GetDlgItem( IDOK );
    if ( okbtn ) {
        okbtn->EnableWindow( FALSE );
    }
    return TRUE;
}

它禁用按钮就好了。也许还有其他问题?

答案 1 :(得分:2)

试试这个:http://support.microsoft.com/kb/122489

  

如何禁用MFC对话框的默认按钮处理

     

虽然建议使用默认按钮(按钮),但您可以   想要在某些情况下禁用或修改标准实现   的情况。您可以通过以下方法在MFC应用程序中执行此操作   步骤进行:

     

将对话框加载到App Studio中并更改“确定”按钮标识符   从IDOK到其他东西,如IDC_MYOK。另外,清除支票   来自默认按钮属性。

     

使用ClassWizard创建消息   处理名为OnClickedMyOK的按钮的函数。这个功能   将在收到BN_CLICKED消息时执行   按钮。

     

在OnClickedMyOK的代码中,调用基类版本   OnOK功能。这是一个例子:

void CMyDialog::OnClickedMyOK()
   {
      CDialog::OnOK();
   }

为对话框覆盖OnOK,在函数内部不执行任何操作。这是一个例子:

void CMyDialog::OnOK()
   {
   }
  

运行程序并调出对话框。把焦点放在控制他人身上   比OK按钮。按RETURN键。请注意CDialog :: OnOK()   永远不会被执行。

答案 2 :(得分:1)

我怀疑问题来自pDlg指针。当您致电pDlg->GetDlgItem(IDOK)时,是否已经创建了对话框?

在第CWnd* fieldOK = pDlg->GetDlgItem(IDOK);行创建一个断点并调试它以查看fieldOK指针是否为null或有效指针。

这就是为什么我认为mark's answer is very close. You can disable it on OnInitDialog`或者你出现的对话类的其他成员。

答案 3 :(得分:0)

您遇到的问题是尚未在界面上创建按钮控件。我们无法全面了解您的问题。

无论如何,您应该保护您的代码不会崩溃。您的代码最好不要使应用程序崩溃。像这样重构它可以避免由于NULL指针导致的访问冲突问题:

bool CSCalcNormCell::OnSelectionChanged( CWnd* pDlg, int type, int page, UINT ctrl_id ) 
{ 
    DDX_DataBox(pDX.get(), IDC_WORKSHOP_COMBO, ws_code);

    CWnd* fieldOK = pDlg->GetDlgItem(IDOK); 
    if (fieldOK)
    {
        if (!CInfactoryPriceAdapter::CanEditPricesForWorkshop( ws_code )) 
            fieldOK->EnableWindow(FALSE); 
        else
            fieldOK->EnableWindow(TRUE); 
     }
}

答案 4 :(得分:0)

您需要在LoadBitmaps()函数中为OK按钮的禁用模式加载位图。