CMFCMenuButton的示例代码

Example code for CMFCMenuButton?

本文关键字:代码 CMFCMenuButton      更新时间:2023-10-16

抱歉新手的问题,但谁能指出我的示例代码,说明使用CMFCMenuButton?微软帮助指的是"新控件样本",但这些样本似乎在Visual Studio 2008"功能包"中,这拒绝安装在我的系统上,因为我运行的是VS 2013,没有VS 2008。我还没有能够找到样本作为独立的代码。具体来说,我有一个对话栏,其中我想要一个按钮标记为保存与下拉选项的保存全部和保存可见(与保存全部默认)。但是任何有效的代码至少可以让我开始。

声明数据成员:

CMFCMenuButton m_button_menu;
CMenu m_menu;

还将按钮的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);
} 

定义:

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

其中IDR_MENU1是一个常规菜单栏,我们得到它的第一个子菜单。例如:

IDR_MENU1 MENU
BEGIN
    POPUP "Dummy"
    BEGIN
        MENUITEM "&Item1", ID_FILE_ITEM1
        MENUITEM "&Item2", ID_FILE_ITEM2
    END
END

点击按钮下拉箭头,弹出菜单,将菜单结果传递给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);
}

**当使用对接控件、对话栏等时。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;
}

在其他地方我们使用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)
    ...
}

如果下拉箭头不显示怎么办?

然后阅读这里的答案,它解释了需要对RC文件进行的更改。