gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:58:18 27 4
gpt4 key购买 nike

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

最佳答案

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

关于c++ - MFC 功能区主页按钮双击关闭应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45510058/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com