MFC功能区主页按钮双击关闭应用程序

时间:2017-08-04 15:02:29

标签: c++ visual-studio mfc

我遇到了家庭彩带按钮的奇怪行为 我在Visual Studio 2010中使用具有功能区控件的Office模板创建了标准MFC应用程序。但是,如果我双击位于上方位置的Home功能区按钮,应用程序将关闭。
您能告诉我它是否是标准的MFC应用程序处理程序行为以及如何更改它?
我看过Prevent double click on MFC-Dialog button但是无法将它应用到我的案例中(更清楚 - 我不知道如何将双击处理程序添加到功能区主页按钮)。

2 个答案:

答案 0 :(得分:0)

  1. 派生自己的CMFCRibbonApplicationButton派生类。
  2. 为CMFCRibbonApplicationButton :: OnLButtonDblClk创建消息处理程序
  3. 在双击上提供您想要执行的操作。如果不应该发生任何事情,请将身体留空。
  4. 在您的CMainFrame中,您可以找到CMFCRibbonApplicationButton m_MainButton的定义。将类名替换为您的实现。

答案 1 :(得分:0)

CMFCRibbonApplicationButton 不是从CWnd派生的,因此无法处理WM_LBUTTONDBLCLK消息。 一种解决方案是从 CMFCRibbonBar 派生。

class CCustomRibbonBar : public CMFCRibbonBar
{
    // ...
protected:
    DECLARE_MESSAGE_MAP()
    afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
};


BEGIN_MESSAGE_MAP(CCustomRibbonBar, CMFCRibbonBar)
    ON_WM_LBUTTONDBLCLK()
END_MESSAGE_MAP()

void CCustomRibbonBar::OnLButtonDblClk(UINT nFlags, CPoint point)
{
    CMFCRibbonBaseElement* pHit = HitTest(point);
    if (pHit->IsKindOf(RUNTIME_CLASS(CMFCRibbonApplicationButton)))
    {
        // the user double-clicked in the application button
        // do what you want here but do not call CMFCRibbonBar::OnLButtonDblClk
        return;
    }
    CMFCRibbonBar::OnLButtonDblClk(nFlags, point);
}

另一种解决方案:在CMainFrame类中覆盖 PreTranslateMessage ;

BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
    if ((WM_LBUTTONDBLCLK == pMsg->message) && (pMsg->hwnd == m_wndRibbonBar))
    {
        CPoint point(pMsg->pt);
        m_wndRibbonBar.ScreenToClient(&point);
        CMFCRibbonBaseElement* pHit = m_wndRibbonBar.HitTest(point);
        if (pHit && pHit->IsKindOf(RUNTIME_CLASS(CMFCRibbonApplicationButton)))
        {
            // do what you want but do not call CMDIFrameWndEx::PreTranslateMessage
            return TRUE; // no further dispatch
        }
    }
    return CMDIFrameWndEx::PreTranslateMessage(pMsg);
}