1
votes

I've faced with strange behaviour of a home ribbon button.
I've created standard MFC application in Visual Studio 2010 with Office template that has a ribbon control. But if I double click on the Home ribbon button at the upper position the application is closed.
Could you please tell me if it is standard MFC application handlers behaviour and how I can change it?
I've looked at Prevent double click on MFC-Dialog button but couldn't apply it to my case (more clearly - I don't know how to add double click handler to a ribbon home button).

2

2 Answers

0
votes

CMFCRibbonApplicationButton is not derived from CWnd so cannot handle WM_LBUTTONDBLCLK message. One solution is to derive from 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);
}

Another solution: override PreTranslateMessage in CMainFrame class;

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);
}
0
votes
  1. Derive your own derived class of CMFCRibbonApplicationButton.
  2. Create a message handler for CMFCRibbonApplicationButton::OnLButtonDblClk
  3. Provide your own implementation of what you want to do on the double click. If nothing should happen, just leave the body empty.
  4. In your CMainFrame you find a definition of CMFCRibbonApplicationButton m_MainButton. Replace the class name with your implementation.