如何禁用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
答案 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按钮的禁用模式加载位图。