仿酷狗音樂播放器開發日誌二十五 duilib右鍵事件的不足的bug修復

轉載請說明原出處,謝謝~~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;
			}
		}

      在這裏直接把return;語句註釋掉就能夠了。而後我在音樂和電臺控件中增長了 UIEVENT_CONTEXTMENU消息的處理代碼。這樣就能夠正常使用右鍵菜單了。

        剩下的就是在主窗體的Notify函數里正常處理menu消息了。


  Redrain  2014.8.27code

相關文章
相關標籤/搜索