MFC - 以编程方式更改对话框项目焦点

时间:2014-07-25 09:58:59

标签: mfc visual-studio-2005

我有一个无模式对话框,显示一堆按钮;其中一些是定制的,用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);
}

1 个答案:

答案 0 :(得分:1)

由于您正在处理自定义控件的按钮处理程序中的按钮按下事件,因此您无需调用基类。只需注释掉 CButton :: OnLButtonDown(nFlags,point)