【发布时间】:2015-06-17 15:30:14
【问题描述】:
首先让我描述一下我所拥有的:
场景: CMFCMenuButton,加载有 CMenu,在对话框中
测试: 点击在菜单项上
结果:消息映射将获得 CMFCMenuButton 的 ID,而不是菜单的 ID
如何获取点击的实际菜单 ID: 使用 CMFCMenuButton::m_nMenuResult
我的想法是我希望在此对话框中有菜单项和按钮,并且会有按钮共享 ID t 似乎是 CMFCMenuButton 应该如何工作。正确的做法是什么?
代码
下面是一个关于如何重现此代码的示例。我使用
ON_COMMAND_RANGE 也和IDC_MFCMENUBUTTON1 只是为了重用 OnMenu 函数的代码
void CRepositionDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_MFCMENUBUTTON1, m_cmfcMenuButton);
}
BEGIN_MESSAGE_MAP(CRepositionDlg, CDialog)
ON_COMMAND_RANGE(IDC_MFCMENUBUTTON1,IDC_MFCMENUBUTTON1,OnMenu)
ON_COMMAND_RANGE(IDC_MENU1, IDC_MENU11, OnMenu)
END_MESSAGE_MAP()
// CRepositionDlg message handlers
afx_msg void CRepositionDlg::OnMenu(UINT nID)
{
CString csMessage;
csMessage.Format(L"OnMenu(%d)",nID);
AfxMessageBox(csMessage);
if(nID == IDC_MFCMENUBUTTON1)
{
OnMenu(m_cmfcMenuButton.m_nMenuResult);
}
}
BOOL CRepositionDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
CMenu* pMenu = new CMenu;
pMenu->CreatePopupMenu();
for(int i = IDC_MENU1; i <= IDC_MENU11; i++)
{
CString csMenu;
csMenu.Format(L"menu %d",i);
pMenu->AppendMenuW(MF_STRING,i,csMenu);
}
m_cmfcMenuButton.m_hMenu = pMenu->GetSafeHmenu();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
【问题讨论】:
-
你能发布一些你正在使用的代码吗?我想我明白你想要做什么。
-
@rrirower 感谢您的评论,我已经添加了一些代码,请查看。
-
我已经阅读了您的代码。您希望按钮和菜单项到底做什么?听起来您想重用资源 ID。我不太明白你为什么想要那个。
-
@rrirower 我希望当我单击 CMFCMenuButton 中的菜单项时,我会收到一条 IDC_MENU1 直到 IDC_MENU11 而不是 IDC_MFCMENUBUTTON1 的消息。因为现在对按钮执行的任何操作都将具有 ID IDC_MFCMENUBUTTON1 而不是单击菜单中的 ID
-
如果你为菜单按钮的 BN_CLICKED 编写了一个处理程序,如果单击是在按钮上,它将返回 0 来表示 m_nMenuResult,或者,m_nMenuResult 将包含选择的菜单项。如果那不是您想要的,我认为您正在与按钮的工作方式作斗争。您唯一的其他选择是创建自己的类来表示菜单按钮并添加您想要的行为。
标签: c++ menu mfc dialog cmfcmenubutton