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

MFC-以编程方式更改对话框项焦点,mfc,visual-studio-2005,Mfc,Visual Studio 2005,我有一个非模态对话框,显示了一堆按钮;其中一些是定制的,用于使用GDI绘制内容。 现在,当用户在特定条件下单击自定义的时,会出现一个消息框,提醒用户该错误,这是正常的。 问题是,在接受消息框(显示为MB_ICON_ERROR)后,无论我在对话框中单击何处,都会收到错误消息,就好像整个对话框都会将消息发送到自定义按钮一样,唯一的方法是按tab键并将焦点交给另一个控件。 这是一种奇怪的行为,知道为什么会发生并不坏,但是现在一个简单的解决方法应该可以解决这个问题。 因为这可能是一个焦点问题,所以我尝试

我有一个非模态对话框,显示了一堆按钮;其中一些是定制的,用于使用GDI绘制内容。
现在,当用户在特定条件下单击自定义的时,会出现一个消息框,提醒用户该错误,这是正常的。
问题是,在接受消息框(显示为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);
}