簡體   English   中英

在運行時設置CMenu項目提示

[英]Set CMenu item prompt at runtime

如何在運行時設置CMenu項目提示? 我知道可以在VS中的資源編輯器中完成此操作,但是我沒有這樣的資源,無法創建菜單,而是動態地創建菜單項。

如果使用的是MFC Feature Pack,則需要重寫MainFrame類的OnMenuButtonToolHitTest

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 我不確定,但是我認為您唯一可以換行的是將標題和文本分開的行。

除了使用鼠標懸停菜單時僅顯示提示之外,您可能還需要做其他事情。 您可以通過重寫MainFrame類的OnMenuSelect來做到這一點:

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

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

我建議您對MainFrame類上的GetMessageString函數進行覆蓋,並在其中放置一個斷點,以了解流程如何進行。

您可以使用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。 也可以選擇菜單以使用其索引進行更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM