2

首先让我描述一下我所拥有的:
场景: CMFCMenuButton,加载一个CMenu,在对话框中
测试:单击菜单项
结果:消息映射将获取菜单的 ID,CMFCMenuButton而不是菜单的 ID
如何获取实际menu ID clicked: useCMFCMenuButton::m_nMenuResult

这个想法是我想在这个对话框中有菜单项和按钮,并且会有与菜单项共享 ID 的按钮。

因此,在我为菜单按钮创建的处理程序中,我可以得到它m_nMenuResult并将其发送到对话框或做任何我想做的事情,但这似乎不是应该如何CMFCMenuButton工作的。正确的做法是什么?

代码

下面是一个关于如何重现它的示例。
我也使用ON_COMMAND_RANGEwithIDC_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
}
4

1 回答 1

0

如果您为菜单按钮的BN_CLICKED编写处理程序,如果单击是在按钮上,它将以 0 响应m_nMenuResult ,或者, m_nMenuResult将包含所选菜单项的 ID。如果那不是您想要的,我认为您正在与按钮的工作方式作斗争。您唯一的其他选择是创建自己的类来表示菜单按钮并添加您想要的行为。

于 2015-06-22T15:25:41.333 回答