0

如何在运行时设置 CMenu 项提示?我知道它可以在 VS 的资源编辑器中完成,但我没有这样的资源并动态创建菜单和它的项目。

4

2 回答 2

1

如果您使用的是 MFC 功能包,则需要覆盖OnMenuButtonToolHitTestMainFrame 类:

BOOL CMainFrame::OnMenuButtonToolHitTest(CMFCToolBarButton* pButton, TOOLINFO* pTI)
{
    if(!pButton)
        return FALSE;
    if(!pTI)
        return FALSE;

    if (pButton->m_nID == UINT(-1)) //not a menu-item, but an opener menu for a sub-menu
        return FALSE;

    // Stolen from CMFCToolBar::OnToolHitTest on file afxtoolbar.cpp

    // It is not needed to do the GetMessageString part, because it already done
    // on function CMFCPopupMenuBar::OnToolHitTest of afxpopupmenubar.cpp file, which
    // supplies the two parts to the Tooltip Manager

    CString strTipText;
    TCHAR szFullText[256];

    AfxLoadString(pButton->m_nID, szFullText);
    AfxExtractSubString(strTipText, szFullText, 1, '\n');

    pTI->lpszText = _tcsdup(strTipText);

    return TRUE;
}

您必须在资源文件字符串中定义与菜单完全相同的 ID;它们的格式是Prompt text\nPrompt title. 我不确定,但我认为您可以拥有的唯一新行是将标题与文本分开的行。

除了在使用鼠标悬停菜单时简单地显示提示之外,您可能还想做一些事情。您可以通过覆盖OnMenuSelect您的MainFrame课程来做到这一点:

void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)
{
    if (nItemID == ID_MENU_I_WANT_TO_PROCESS)
    {
        DoThings(); 
    }

    __super::OnMenuSelect(nItemID, nFlags, hSysMenu);
}

我建议您覆盖GetMessageStringMainFrame 类上的功能,并在那里放置一个断点,以便您查看流程如何进行。

于 2017-04-12T14:07:24.780 回答
0

您可以使用ModifyMenuhttps://msdn.microsoft.com/fr-fr/library/4tbfebs6.aspx)。调用可以是这样的:

 pParentMenu->ModifyMenu(ID_MY_ITEM, MF_STRING, ID_MY_ITEM, "My new text");

pParentMenu是一个CMenu指向父菜单的对象。ID_MY_ITEM是子菜单ID。也可以使用其索引选择要更改的菜单。

于 2017-03-22T16:24:01.117 回答