我需要为CDockablePane
创建一个标题栏按钮,该按钮将调出具有各种选项的菜单。我尝试使用CMFCCaptionMenuButton
并显示了按钮和菜单,但是菜单ID的消息映射方法未触发。 MFC文档指出CMFCCaptionMenuButton
是用于内部基础结构,而不是真正用于您的代码。
因此,假设这就是我的问题,应该使用CMFCCaptionBarButton
然后创建一个单独的弹出菜单吗?有人在MFC中制作过类似的基于标题栏的菜单吗?
如果我在挂接事件时犯了一个愚蠢的错误,这是一些精简的代码片段:
BEGIN_MESSAGE_MAP(CDockPane, CDockablePane)
ON_COMMAND(ID_MORPH_BROWSER, OnMorphBrowser)
END_MESSAGE_MAP()
void CDockPane::OnPressButtons(UINT nHit)
{
// only for custom button handling don't call base
// close, maximize, and pin will be handled by default
switch (nHit)
{
case ID_MORPHTEST:
{
CMorphMenuButton* pButton = dynamic_cast<CMorphMenuButton*>(m_arrButtons.GetAt(m_morphIndex));
pButton->ShowMenu(this);
break;
}
}
}
void CDockPane::SetCaptionButtons()
{
CDockablePane::SetCaptionButtons(); // for close, pin etc
m_morphIndex = m_arrButtons.Add(new CMorphMenuButton(ID_MORPHTEST));
}
void CDockPane::OnMorphBrowser()
{
// do stuff on menu item click
}
编辑:删除了不再使用的先前代码
最佳答案
既然the的声音在后台已经减弱,我想我将发布目前已有的解决方法:
我没有继承和扩展CMFCCaptionMenuButton
,而是通过扩展CMFCCaptionButton
来构建类。然后,我创建一个菜单,并提供一个ShowMenu方法,以便在处理自定义按钮事件以及覆盖GetIconID时显式调用该方法,以便为添加到标题栏的每个菜单返回该按钮的特定系统图标,最后以类似于问题中概述的示例:
#pragma once
// CMorphMenuButton command target
class CMorphMenuButton : public CMFCCaptionButton
{
public:
CMorphMenuButton(UINT nHit);
virtual ~CMorphMenuButton();
virtual CMenuImages::IMAGES_IDS GetIconID (BOOL bHorz, BOOL bMaximized) const;
void ShowMenu(CWnd* pWnd);
private:
CMenu m_dockMenu;
CMenu* m_subMenu;
};
// MorphMenuButton.cpp : implementation file
//
#include "stdafx.h"
#include "MorphMenuButton.h"
// CMorphMenuButton
CMorphMenuButton::CMorphMenuButton(UINT nHit)
: CMFCCaptionButton(nHit)
{
SetMiniFrameButton(); // already defaulted?
m_dockMenu.LoadMenu(IDR_DOCKPANE); // resource ID for dock pane menus
}
CMorphMenuButton::~CMorphMenuButton()
{
m_dockMenu.DestroyMenu();
}
CMenuImages::IMAGES_IDS CMorphMenuButton::GetIconID(BOOL bHorz, BOOL bMaximized) const
{
return CMenuImages::IdArrowForward;
}
void CMorphMenuButton::ShowMenu(CWnd* pWnd)
{
CRect windowRect, buttonRect;
pWnd->GetWindowRect(&windowRect);
buttonRect = GetRect();
CPoint menuPos(windowRect.left + buttonRect.right, windowRect.top + buttonRect.bottom);
m_subMenu = m_dockMenu.GetSubMenu(0);
if (!m_subMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, menuPos.x, menuPos.y, pWnd))
{
DWORD id = GetLastError();
wchar_t errMsg[256];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, id, 0, errMsg, sizeof(errMsg), 0);
MessageBox(0, errMsg, L"Error", MB_OK);
}
}
标题栏按钮的设置以及按钮和菜单的单击事件的处理与问题中定义的相同,并且可以使用。
关于c++ - CMFCCaptionMenuButton替代吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5187168/