7

如何禁用 MFC 对话框确定按钮?
此代码:在from函数行中 导致异常“访问冲突读取位置... ” 此时焦点位于另一个控件上。 有什么问题?
CWnd* fieldOK = pDlg->GetDlgItem(IDOK);
fieldOK->EnableWindow(FALSE);

ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL));CWnd::EnableWindow(BOOL bEnable)winnocc.cppmfc90d.dll

感谢帮助。

[编辑]

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); 
  } 
}
4

5 回答 5

6

我不确定为什么不能这样做。如果我采用常规 CDialog 并执行如下初始化:

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

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

于 2013-06-21T12:14:41.353 回答
2

试试这个: 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()
   {
   }

运行程序并弹出对话框。将焦点放在“确定”按钮以外的控件上。按返回键。注意 CDialog::OnOK() 永远不会被执行。

于 2013-06-21T11:08:44.713 回答
1

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

在该行设置断点CWnd* fieldOK = pDlg->GetDlgItem(IDOK);并对其进行调试以查看 fieldOK 指针是否为空或有效指针。

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

于 2015-03-31T16:43:36.230 回答
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); 
     }
}
于 2015-07-23T23:32:30.297 回答
0

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

于 2016-03-08T15:14:42.627 回答