2016-08-01 7 views
1

Ich versuche, ein benutzerdefiniertes Popup-Menü auf MFC-Single-Dokument-Schnittstelle (SDI) Projekt zu zeichnen.

Von here, fand ich The framework calls this member function for the owner of an owner-draw button control, combo-box control, list-box control, or menu when a visual aspect of the control or menu has changed.

So habe ich den Griff OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) und einige Codes in dieser Funktion hinzugefügt, aber ich fand, dass dieser Rückruf nicht vom Framework aufgerufen werden, als ich rechts auf der Ansicht klicken, wie folgt:
enter image description here
Wie mache ich ein Popup-Menü dynamisch?Wie zeichne ich ein benutzerdefiniertes Menü auf MFC SDI dynamisch

Hier ist, wie ich mein Pop-up-Menü:

void Cdynamic_menu_sdiView::OnContextMenu(CWnd* /* pWnd */, CPoint point) 
{ 
    if (IDR_MY_MENU == 0) 
     return; 
    CMenu dynamicMenu, proxyMenu; 
    if (dynamicMenu.GetSafeHmenu()) 
     dynamicMenu.DestroyMenu(); 
    // Create a new popup menu. 
    if (dynamicMenu.CreatePopupMenu() == FALSE) 
     return; 

    if (proxyMenu.LoadMenu(IDR_MY_MENU) == FALSE) 
     return; 

    int nSubMenu = 1; 
    CMenu* pProxyMenu = proxyMenu.GetSubMenu(nSubMenu); 

    build_dynamic_menu(m_map_menu_element_2, pProxyMenu, dynamicMenu, CString("")); 
    //m_menu_on_draw = &dynamicMenu; // link up the dynamic menu to the on draw menu, so that we can print it on the screen 

    CPoint ptCurPos; // current cursor position 
    GetCursorPos(&ptCurPos); 
    dynamicMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON, ptCurPos.x, ptCurPos.y, AfxGetMainWnd(), NULL); 
} 

Innerhalb der Funktion build_dynamic_menu(), es ist eine Tiefe erste Suchfunktion, ich InsertMenu(i, MF_BYPOSITION | MF_POPUP | MF_OWNERDRAW, uSubMenuID, strLabel);, so dass ich den Text der Popup-Menüs ändern kann dynamisch .
Da es zu lang ist, um die Funktion hier zu setzen, sage ich nur die Idee.
Ich möchte auch die Textfarbe und Hintergrundfarbe dynamisch ändern, also versuche ich, eine Möglichkeit zu finden, das Menü nach Code zu zeichnen.

Wo soll ich anfangen? Ist Ansatz gut für mich?

+1

Ist es ein Menü für Besitzer? Wenn nicht, wird diese Funktion nicht aufgerufen. – immibis

+0

Danke, @immibis, ich werde versuchen, diese zuerst zu betrachten: http://www.codeproject.com/Articles/7073/Wie_Eigener_Eigener_Eigener-gezeichnet-menus-Schritt-für-Schritt' – sflee

+1

It doesn habe nichts mit 'OnDrawItem' zu tun. Zeigen Sie, wie Sie das Popup-Menü laden. –

Antwort

0

Sie haben das Menü proxyMenu geladen und das Untermenü pProxyMenu ausgewählt. Als nächstes öffnen Sie das Untermenü mit pProxyMenu->TrackPopupMenu (nicht proxyMenu->TrackPopupMenu). Es würde helfen, wenn die Variablennamen nicht so ähnlich sind.

Der folgende Code sollte alles sein, was Sie brauchen. versuchen Sie es auch mit nSubMenu = 0;

CMenu proxyMenu; 
if (proxyMenu.LoadMenu(IDR_MY_MENU) == FALSE) 
    return; 

int nSubMenu = 1; 
CMenu* pProxyMenu = proxyMenu.GetSubMenu(nSubMenu); 

CPoint ptCurPos; 
GetCursorPos(&ptCurPos); 
pProxyMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, ptCurPos.x, ptCurPos.y, 
    AfxGetMainWnd()); 

TPM_LEFTBUTTON ist nicht erforderlich, wenn Sie bereits TPM_RIGHTBUTTON nach TrackPopupMenu documentation haben:

TPM_RIGHTBUTTON
Der Benutzer kann Menüpunkte mit den beiden linken und rechte Maustaste auswählen.

Siehe auch InsertMenu. Verwenden Sie MF_POPUP für das Hinzufügen eines Untermenüs, und verwenden Sie MF_OWNERDRAW, wenn dies das Menü für den Benutzer ist.

+0

Da ich den Text innerhalb des Menüs basierend auf verschiedenen Situationen bearbeiten möchte, so füge ich eine Funktion 'build_dynamic_menu' hinzu, die' dynamicMenu.InsertMenu (i, MF_BYPOSITION | MF_POPUP | MF_OWNERDRAW, uSubMenuID, "My dynamisch string"); ' – sflee

+0

Verwenden Sie dann "MF_BYPOSITION" und ändern Sie das Popup-Menü. Es scheint, ich weiß nicht, was Ihre Frage ist, versuchte ich zu erraten ... –

+0

Ich habe 'InsertMenu (MF, MF_BYPOSITION | MF_POPUP | MF_OWNERDRAW, uSubMenuID," Meine dynamische Zeichenfolge ");' ist das was du meinst? – sflee

Verwandte Themen