CMFCMenuButton的示例代码?

Bil*_*ler 3 c++ mfc cmfcmenubutton

很抱歉新手问题,但是有人能指出示例代码,说明CMFCMenuButton的使用吗?Microsoft帮助引用"新控件示例",但这些示例似乎是在Visual Studio 2008"功能包"中,并且由于我运行VS 2013并且没有VS 2008,因此拒绝在我的系统上安装.我无法将样本作为独立代码找到.具体来说,我有一个对话栏,我想要一个标有"保存"的按钮,其中包含"全部保存"和"保存可见"的下拉选项(默认情况下保存全部).但任何工作代码至少会让我开始.

Bar*_*ani 6

声明数据成员:

CMFCMenuButton m_button_menu;
CMenu m_menu;
Run Code Online (Sandbox Code Playgroud)

同时将按钮的id添加到消息映射和数据交换:

BEGIN_MESSAGE_MAP(CMyDialog, CDialogEx)
    ON_BN_CLICKED(IDC_MFCMENUBUTTON1, OnButtonMenu)
    ...
END_MESSAGE_MAP

void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_MFCMENUBUTTON1, m_button_menu);
} 
Run Code Online (Sandbox Code Playgroud)

限定:

BOOL CMyDialog::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    //...
    m_menu.LoadMenu(IDR_MENU1);
    m_button_menu.m_hMenu = m_menu.GetSubMenu(0)->GetSafeHmenu();

    return TRUE;  
}
Run Code Online (Sandbox Code Playgroud)

IDR_MENU1常规菜单栏在哪里,我们得到它的第一个子菜单.例如:

IDR_MENU1 MENU
BEGIN
    POPUP "Dummy"
    BEGIN
        MENUITEM "&Item1", ID_FILE_ITEM1
        MENUITEM "&Item2", ID_FILE_ITEM2
    END
END
Run Code Online (Sandbox Code Playgroud)

如果单击按钮的下拉箭头,则会出现一个弹出菜单,菜单结果将传递给OnButtonMenu.如果单击按钮的左侧,则OnButtonMenu直接调用,而不显示弹出菜单.

void CMyDialog::OnButtonMenu()
{
    CString str;
    switch (m_button_menu.m_nMenuResult)
    {
    case ID_FILE_ITEM1:
        str = L"first menu item clicked";
        break;
    case ID_FILE_ITEM2:
        str = L"second menu item clicked";
        break;
    default:
        str = L"Button click (popup menu did not appear, or menu ID is not handled)";
        break;
    }
    MessageBox(str);
}
Run Code Online (Sandbox Code Playgroud)

**使用停靠控件,对话框等时,MFC可能会运行自己的子类,我不认为DoDataExchange会调用它.m_button_menu可能无效.GetDlgItem可以用来找到正确的指针:

CMFCMenuButton* CMyDlgBar::GetButtonMenu()
{
    CMFCMenuButton* pButton = &m_button_menu;
    if (!IsWindow(pButton->m_hWnd))
        pButton = (CMFCMenuButton*)GetDlgItem(IDC_MFCMENUBUTTON1);
    return pButton;
}
Run Code Online (Sandbox Code Playgroud)

我们使用的其他地方GetButtonMenu()而不是m_button_menu.例如:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
        return -1;
    //...
    m_dlgbar.Create(...);
    m_dlgbar.m_menu.LoadMenu(IDR_MENU1);
    m_dlgbar.GetButtonMenu()->m_hMenu = m_dlgbar.m_menu.GetSubMenu(0)->GetSafeHmenu();

    return 0;
}

void CMainFrame::OnButtonMenu()
{
    CString str;
    switch (GetButtonMenu()->m_nMenuResult)
    ...
}
Run Code Online (Sandbox Code Playgroud)