MFC-以编程方式更改对话框项焦点
我有一个非模态对话框,显示了一堆按钮;其中一些是定制的,用于使用GDI绘制内容。MFC-以编程方式更改对话框项焦点,mfc,visual-studio-2005,Mfc,Visual Studio 2005,我有一个非模态对话框,显示了一堆按钮;其中一些是定制的,用于使用GDI绘制内容。 现在,当用户在特定条件下单击自定义的时,会出现一个消息框,提醒用户该错误,这是正常的。 问题是,在接受消息框(显示为MB_ICON_ERROR)后,无论我在对话框中单击何处,都会收到错误消息,就好像整个对话框都会将消息发送到自定义按钮一样,唯一的方法是按tab键并将焦点交给另一个控件。 这是一种奇怪的行为,知道为什么会发生并不坏,但是现在一个简单的解决方法应该可以解决这个问题。 因为这可能是一个焦点问题,所以我尝试
现在,当用户在特定条件下单击自定义的时,会出现一个消息框,提醒用户该错误,这是正常的。
问题是,在接受消息框(显示为MB_ICON_ERROR)后,无论我在对话框中单击何处,都会收到错误消息,就好像整个对话框都会将消息发送到自定义按钮一样,唯一的方法是按tab键并将焦点交给另一个控件。
这是一种奇怪的行为,知道为什么会发生并不坏,但是现在一个简单的解决方法应该可以解决这个问题。
因为这可能是一个焦点问题,所以我尝试通过执行:
GetDlgItem( IDC_BTN_ANOTHER_BUTTON )->SetFocus();
实际上,对消息进行注释是为了保持对话框正常工作
// 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);
}
由于您正在自定义控件的按钮处理程序中处理按钮关闭事件,因此不需要调用基类。只需注释掉CButton::OnLButtonDown(nFlags,point)。我打赌问题是您的代码中的一个bug,但是,您没有为我们提供任何反馈。好吧,代码非常大,您能给我指个地方让我看一下您需要的部分吗。我猜问题出在或接近处理您的点击事件的代码中。但是,您应该发布任何您认为可能有问题的代码。我已经发布了问题涉及的代码。我认为您在按钮处理程序中的基类调用可能是问题所在。您是否尝试过取消对消息框的调用的注释,并对对OnLButtonDown的基类调用进行注释?
// 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);
}