由於入門教程的反響還不錯,因此Alberl就以直播的形式來寫《進階教程》啦,本教程的前提:
1、請先閱讀《仿迅雷播放器教程》
2、要有一定的duilib基礎,如果還沒,請先閱讀《2013 duilib入門簡明教程》。
3、下載基於VLC的MFC播放器(包含VLC等所有文件),csdn不允許上傳相似的代碼,因此后面的教程將不再上傳VLC的dll、頭文件等沒有改變的文件。
《仿迅雷播放器教程 -- 基於VLC的MFC播放器 (6)》中界面是用MFC做的,因此我們要將它換成duilib。而在《2013 duilib入門簡明教程 -- 結合win32和MFC (16)》中只講了怎么在duilib中顯示MFC窗口,以及在MFC中顯示duilib窗口,但是沒有講消息的響應,因此有些基礎薄弱的小伙伴還是不懂,這里借着這個機會講解一下消息的響應,下面進入正題。
之前的MFC界面如下:

現在我們將左邊的三個按鈕換成迅雷的,如下:

其中左邊那塊是純duilib的界面,右邊那塊是在duilib的窗口里放了一個win32控件,這六個按鈕都是有消息響應的,因此本教程實現了以下功能:
1、在MFC窗口顯示了duilib窗口,並響應了duilib的控件。
2、在duilib的窗口顯示了win32的控件,並響應了win32的控件。
所以與MFC結合的知識已經全面覆蓋了(與win32結合也是類似的),到此,就不用擔心老項目使用duilib帶來問題了。
界面顯示已經在《2013 duilib入門簡明教程 -- 結合win32和MFC (16)》講過了,那么這里只講消息響應。
一、純duilib控件的響應:
只需在Notify函數做響應就行了,其中m_pDlgMain是MFC主窗口的指針。
void CDuiFrameWnd::Notify( TNotifyUI& msg ) { if (m_pDlgMain) { if( msg.sType == _T("click") ) { if( msg.pSender->GetName() == _T("btnPrevious") ) { m_pDlgMain->OnBnClickedButtonPlayPrevious(); } else if( msg.pSender->GetName() == _T("btnNext") ) { m_pDlgMain->OnBnClickedButtonPlayNext(); } else if( msg.pSender->GetName() == _T("btnPlay") ) { m_pDlgMain->OnBnClickedButtonPlay(); } } } __super::Notify(msg); }
可見原有的MFC代碼基本無需改動,是不是很簡單呢~O(∩_∩)O~
二、duilib中MFC控件的響應
由於duilib不夠成熟,很多東西都要自己去處理,而如果水平不夠的話,就很可能做不出來,已經有很多網友因為有些控件很難實現而放棄了。因此這種情況下,如果某個控件很難實現,我們用MFC的控件代替就是非常適合的,並且很多控件即使duilib能做出來,也還是取代不了MFC控件,比如虛擬表格等等,這些MFC控件已經很成熟了,並且界面也不難看,可自行定制,而如果用duilib去做虛擬表格的話,工作量肯定是很大的,因此這種情況下,也建議用MFC控件。那么在duilib中顯示的MFC控件怎么響應呢?
其實也很簡單,回到win32就行了,我們只需截獲WM_COMMAND,而duilib的WM_COMMAND等windows消息可以在HandleMessage函數里截獲,代碼如下:
LRESULT CDuiFrameWnd::HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { case WM_COMMAND: if (IDC_BUTTON_DUI_NEXT == wParam) { if (m_pDlgMain) { m_pDlgMain->OnBnClickedButtonPlayNext(); } } break; default: break; } return __super::HandleMessage(uMsg, wParam, lParam); }
也是非常簡單!
現在已經可以去試試效果啦,左邊那三個按鈕和右邊那三個按鈕的效果完全一樣!
從這個例子可以看出,無論是在duilib里使用MFC,還是在MFC中使用duilib,都不需要改動原有項目,和MFC結合是不是很有用呢~O(∩_∩)O~
代碼下載:http://download.csdn.net/detail/qq316293804/6426325