我有一个无模式对话框,显示一堆按钮;其中一些是定制的,用GDI绘制东西
现在,当用户在特定条件下点击自定义的消息时,会出现一个消息框,提醒用户该错误,这很好。
问题是,在接受消息框(显示为MB_ICON_ERROR)后,我在对话框中单击的任何地方,我总是得到错误消息,好像整个对话框将消息发送到自定义按钮,唯一的方法是摆脱这个是按Tab键将焦点转移到另一个控件上
这是一种奇怪的行为,并且知道为什么发生并不会是坏事,但现在应该做一个简单的解决方法。
由于这可能是一个焦点问题,我已经尝试通过执行以下操作将其设置在另一个控件上(在所有者对话框中):
GetDlgItem( IDC_BTN_ANOTHER_BUTTON )->SetFocus();
然后,在自定义控件内添加:KillFocus( NULL );
但没有结果
我该如何使用这些功能?
在此先感谢。
PS:如果我评论AfxMessageBox,控件就不会显示这种奇怪的行为。
编辑
我会按要求显示一些代码。
// This is where Message Box is popping out. It is effectively inside the dialog code.
void CProfiloSuolaDlg::ProcessLBtnDownGraphProfilo(PNT_2D &p2dPunto)
{
// m_lboxProfiles is a customized CListBox
if(m_lboxProfiles.GetCurSel() == 0)
{
// This profile cannot be modified.
/*
CString strMessage;
strMessage.Format( _T("Default Profile cannot be edited.") );
AfxMessageBox( strMessaggio, MB_ICONERROR );
*/
return;
}
// Selecting a node from sole perimeter.
SelectNodo(p2dPoint);
}
实际上,系统会对消息进行注释以使对话框保持正常运行。
// This is inside the customization of CButton
void CMyGraphicButton::OnLButtonDown(UINT nFlags, CPoint point)
{
PNT_2D p2dPunto;
CProfiloSuolaDlg* pDlg = (CProfiloSuolaDlg*)GetParent();
m_pVD->MapToViewport(point,p2dPunto);
switch(m_uType)
{
case GRF_SEZIONE:
pDlg->ProcessLBtnDownGraphProfilo(p2dPunto);
break;
case GRF_PERIMETRO:
pDlg->ProcessLBtnDownGraphPerimetro(p2dPunto);
break;
}
CButton::OnLButtonDown(nFlags, point);
}
答案 0 :(得分:1)
由于您正在处理自定义控件的按钮处理程序中的按钮按下事件,因此您无需调用基类。只需注释掉 CButton :: OnLButtonDown(nFlags,point)。