轉載請說明原出處,謝謝~~html
雖然仿酷狗的各個菜單早就寫好了,可是一直沒有附加到程序裏。今天把菜單和播放列表控件關聯時發現了問題。函數
和播放列表相關的菜單有三個,分別是每一個音樂項目控件相關的菜單、分組的菜單、音樂電臺的菜單。應該的效果以下:測試
本來我想着只要給對應的控件設置menu屬性,而後在代碼裏響應消息彈出菜單就能夠了。可是實際測試發現,控件根本沒法響應到menu消息,緣由在於:音樂項目、電臺項目這些控件都是靠許多子控件組合而成的,換句話就是他們上面覆蓋了不少其餘子控件,子控件擋住了音樂項目和電臺項目控件的界面,讓他沒法響應menu消息。ui
若是把音樂項目、電臺項目控件的因此子控件都加上menu消息而且處理,是能夠正常彈出菜單的。可是這不是一個優雅的解決辦法。this
在duilib中,右鍵菜單的消息事件是UIEVENT_CONTEXTMENU,對應的系統消息是WM_CONTEXTMENU。他在CControlUI類的DoEvent函數中被處理,可是函數處理完成後直接return;返回,並無把消息傳遞給父控件,因此致使了這個bug。源碼以下:spa
if( event.Type == UIEVENT_CONTEXTMENU ) { if( IsContextMenuUsed() ) { m_pManager->SendNotify(this, DUI_MSGTYPE_MENU, event.wParam, event.lParam); return; } }
Redrain 2014.8.27code