一、windows原生消息
同樣,入門教程只是給出了響應windows原生消息的方法,並沒給出例子,這里以自適應屏幕分辨率為例。迅雷播放器雖然可以在啟動的時候自動調整窗口大小,但是當屏幕分辨率實時改變時並沒有調整窗口。我們做個改進,即可以實時調整大小,很明顯,應該響應WM_DISPLAYCHANGE消息,而duilib自己處理windows消息的函數是在HandleMessage里,因此重載HandleMessage函數,加入如下代碼:
LRESULT CDuiFrameWnd::HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam ) { LRESULT lRes = __super::HandleMessage(uMsg, wParam, lParam); switch (uMsg) { HANDLE_MSG (*this, WM_DISPLAYCHANGE, OnDisplayChange); } return lRes; }
這樣就可以在OnDisplayChange函數里響應分辨率改變的消息了,記得包含頭文件#include <windowsx.h>
void CDuiFrameWnd::OnDisplayChange( HWND hwnd, UINT bitsPerPixel, UINT cxScreen, UINT cyScreen ) { ::SetWindowPos(m_PaintManager.GetPaintWindow(), NULL, 0, 0, cxScreen, cyScreen, SWP_FRAMECHANGED|SWP_NOZORDER|SWP_NOACTIVATE); }
二、自定義消息
自定義消息也是經常用到的,順帶介紹一下,和windows編程一樣,自己定義消息ID和函數,只不過將消息處理搬到了HandleMessage函數而已。播放器的時間和文件進度時刻都在更新,所以這里自定義一個消息,用於處理播放器的通知。
1、定義消息ID
#define WM_USER_POS_CHANGED WM_USER + 2 // 文件播放位置改變
2、響應自定義消息:
在HandleMessage函數的switch分支里加上如下代碼即可:
case WM_USER_POS_CHANGED: return OnPosChanged(*this, wParam, lParam);
這樣就可以在OnPosChanged函數里處理WM_USER_POS_CHANGED消息了。
3、發送自定義消息:
在需要發送消息的地方調用::PostMessage(*this, WM_USER_POS_CHANGED, wParam, lParam);即可,和windows一樣(當然,SendMessage也OK,看情況使用)
在入門教程里就多次強調,duilib只是一個UI庫,其他地方依然是windows編程,經過這么多例子的講解,現在應該了解得差不多了吧~O(∩_∩)O~