繁体   English   中英

禁用对话框确定按钮MFC

[英]Disabling dialog OK button MFC

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

ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));行中导致异常“ 访问冲突读取位置...ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL)); 的功能CWnd::EnableWindow(BOOL bEnable)winnocc.cppmfc90d.dll
在这个时候,重点是另一个控制。
什么是错的?

感谢帮助。

[EDITED]

bool CSCalcNormCell::OnSelectionChanged( CWnd* pDlg, int type, int page, UINT ctrl_id ) 
{ 
  DDX_DataBox(pDX.get(), IDC_WORKSHOP_COMBO, ws_code); 
  if (!CInfactoryPriceAdapter::CanEditPricesForWorkshop( ws_code )) 
  { 
    CWnd* fieldOK = pDlg->GetDlgItem(IDOK); 
    fieldOK->EnableWindow(FALSE); 
  } 
  else 
  { 
    CWnd* fieldOK = pDlg->GetDlgItem(IDOK); 
    fieldOK->EnableWindow(TRUE); 
  } 
}

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

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

它禁用按钮就好了。 也许别的什么不对?

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

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

虽然建议使用默认按钮(按钮)支持,但您可能希望在某些情况下禁用或修改标准实现。 您可以按照以下步骤在MFC应用程序中执行此操作:

将对话框加载到App Studio中,将OK按钮标识符从IDOK更改为其他内容,例如IDC_MYOK。 另外,清除Default Button属性中的检查。

使用ClassWizard为名为OnClickedMyOK的按钮创建消息处理函数。 当从此按钮收到BN_CLICKED消息时,将执行此功能。

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

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

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

void CMyDialog::OnOK()
   {
   }

运行程序并调出对话框。 将焦点置于“确定”按钮以外的控件上。 按RETURN键。 请注意,CDialog :: OnOK()永远不会执行。

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

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

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

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

无论如何,你应该保护你的代码不会崩溃。 您的代码最好不要使应用程序崩溃。 像这样重构它可以避免由于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); 
     }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM