[英]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.cpp
从mfc90d.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.