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

MFC ribbon home button closes app with double click

本文关键字:应用程序 双击 按钮 功能区 主页 MFC      更新时间:2023-10-16

我遇到了主页功能区按钮的奇怪行为。
我在Visual Studio 2010中使用具有功能区控件的Office模板创建了标准MFC应用程序。但是,如果我双击上方位置的"主页"功能区按钮,则应用程序将关闭。
您能否告诉我这是否是标准的 MFC 应用程序处理程序行为以及如何更改它?
我已经查看了防止双击MFC-Dialog按钮,但无法将其应用于我的情况(更清楚 - 我不知道如何将双击处理程序添加到功能区主页按钮(。

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类中重写预翻译消息;

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的定义。将类名替换为您的实现。
相关文章: