到上一個教程爲止,界面顯示的代碼就都介紹完啦,如今開始介紹控件的響應,其實在《2013 duilib入門簡明教程 -- 事件處理和消息響應 (17)》裏已經列出了duilib本身定義的全部消息,而且前面也介紹了Button和Tab的響應,仍是有小夥伴們不知道怎麼響應其餘控件,所以這裏介紹一下其餘控件的響應。html
須要注意的是,若是要響應控件,則必須給控件指定一個惟一的ID,在windows編程裏,每一個控件的ID都是一個數字,如IDC_BUTTON_ 等等,能夠用GetDlgItem()來獲取控件的指針;而duilib的ID卻不是數字,而是一個字符串,如name="button1",獲取控件的指針是經過FindControl函數。duilib沒有像MFC那樣的DDX機制來綁定ID和控件變量,因此只能經過FindControl函數。編程
Button和Option控件已經在入門教程裏介紹過了,而其餘控件在duilib自帶的Demo裏面都有介紹,Alberl搞不清楚爲何有些小夥伴仍是不知道怎麼響應的,那麼這裏就說說其餘控件的響應吧,入門教程裏已經說了,duilib的控件響應均可以在Notify函數裏搞定,也能夠用DUI_ON_MSGTYPE宏搞定,好比DUI_ON_MSGTYPE(DUI_MSGTYPE_CLICK,OnClick)。windows
因爲Demo裏的菜單控件既不通用,代碼量也大,看起來還比較複雜,因此Alberl提煉出了一個精簡的菜單控件,用法很簡單:函數
一、在想要顯示菜單的地方加上:ui
CMenuWnd *pMenu = new CMenuWnd(_T("menu.xml")); POINT pt = {msg.ptMouse.x, msg.ptMouse.y}; pMenu->Init(&m_PaintManager, pt); pMenu->ShowWindow(TRUE);
二、在menu.xml里加上要顯示的菜單項,如:spa
<ListContainerElement name="menuSingleCircle" height="22" inset="15,0,25,0" > <Label text="單曲循環" textcolor="#FFC8C6CB" align="center"/> </ListContainerElement>
三、在Notify裏響應itemclick消息,如:指針
if(msg.sType == _T("itemclick")) { if (msg.pSender->GetName() == _T("menuSingleCircle")) { m_emPlayMode = EM_PLAY_MODE_SINGLE_CIRCLE; } }
List的響應都是在"itemactivate"裏,因此在Notify裏用 if( msg.sType == _T("itemactivate") ) 就能夠了,須要說明的是List控件比較特殊,雖然也能夠像button同樣指定一個name屬性,而後判斷name就知道點擊了哪一個控件,但仍是建議用List自帶的函數GetItemIndex(msg.pSender)來獲取點擊了哪一列,List控件比較簡單,請自行看Demo,TreeView因爲沒有Demo能夠看,這裏介紹一下:code
由於TreeView繼承於List,因此不少特性都是同樣的,好比在_T("itemactivate")裏響應點擊消息,用GetItemIndex獲取點擊了哪一列。xml
if( msg.sType == _T("itemactivate")) { CTreeViewUI* pTree = static_cast<CTreeViewUI*>(m_PaintManager.FindControl(_T("treePlaylist"))); if(pTree && -1 != pTree->GetItemIndex(msg.pSender) && U_TAG_PLAYLIST == msg.pSender->GetTag()) { int iListIndex = pTree->GetItemIndex(msg.pSender); } }
不過獲取到了iListIndex,好像也沒啥用,它是哪一個節點的?是我想要的節點嗎?htm
因此這裏就須要給咱們想要的節點加上特殊的屬性,好比name、tag、userdata等等,這裏Alberl用的是Tag來標記的,因此只要GetTag獲取一下tag就知道是否是點擊了播放列表。
而Tag的設置是在添加TreeNode節點時調用pNodeTmp->SetTag(U_TAG_PLAYLIST); 這樣就設置了一個值爲U_TAG_PLAYLIST 的Tag。
知道了用戶點擊了我們想要的控件,那麼直接GetItemText就能夠獲取到文件路徑了,這個時候就能夠播放啦~O(∩_∩)O~
可是問題又來了,若是想要實現順序播放的功能,那麼就必須獲取下一個節點的指針,不過List並無提供GetNextItem這樣的功能,因此得繞一下,就是先用GetItemIndex獲取本節點的Index,再用GetItemAt(Index + 1)便可獲取下一個節點的指針。
若是播放到最後一首,想跳到第一首,怎麼辦?
嗯,這個時候只有找出播放列表第一個文件的下標了,能夠看到本播放器的文件路徑是從【播放列表】的第五個子節點纔開始的,咱們直接用【播放列表】的下標加5就OK了?目前是OK,可是若是在前面再加上2個節點呢,那不就要改爲7了? 因此這裏用了一個通用的函數GetPlaylistInfo來獲取文件的數量,以及第一個文件的Tree下標。
是否是繞暈了? 嗯,由於Demo裏並無Tree控件的響應,Alberl只是爲了給你們示範Tree控件的用法,實際使用中,建議嵌入一個ListBox進去,這樣就無需繞來繞去了,直接GetItemIndex就是相應的下標,GetItemIndex(0)就是第一個文件~O(∩_∩)O~
嗯,最複雜的控件響應都介紹完了,剩下的就去看Demo吧~O(∩_∩)O~