MFC丝带首页按钮关闭双击的应用程序

问题描述:

我遇到了家庭丝带按钮的奇怪行为。
我已经在带有带控件的Office模板的Visual Studio 2010中创建了标准MFC应用程序。但是,如果我双击位于上部位置的Home Ribbon按钮,应用程序将关闭。
你能告诉我,如果它是标准的MFC应用程序处理程序的行为,我可以如何改变它?
我看过Prevent double click on MFC-Dialog button,但不能应用到我的情况(更清楚地 - 我不知道如何将双击处理程序添加到功能区主页按钮)。MFC丝带首页按钮关闭双击的应用程序

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); 
} 

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

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); 
} 

  1. 派生自己的派生类CMFCRibbonApplicationButton。
  2. 为CMFCRibbonApplicationButton创建消息处理程序:: OnLButtonDblClk
  3. 提供您自己的双击实现。如果什么都不应该发生,就把身体留空。
  4. 在您的CMainFrame中,您可以找到CMFCRibbonApplicationButton m_MainButton的定义。用你的实现替换类名称。