一樣,入門教程只是給出了響應windows原生消息的方法,並沒給出例子,這裏以自適應屏幕分辨率爲例。迅雷播放器雖然能夠在啓動的時候自動調整窗口大小,可是當屏幕分辨率實時改變時並無調整窗口。咱們作個改進,便可以實時調整大小,很明顯,應該響應WM_DISPLAYCHANGE消息,而duilib本身處理windows消息的函數是在HandleMessage裏,所以重載HandleMessage函數,加入以下代碼:web
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函數而已。播放器的時間和文件進度時刻都在更新,因此這裏自定義一個消息,用於處理播放器的通知。windows
一、定義消息ID 函數
#define WM_USER_POS_CHANGED WM_USER + 2 // 文件播放位置改變
二、響應自定義消息:ui
在HandleMessage函數的switch分支里加上以下代碼便可:this
case WM_USER_POS_CHANGED: return OnPosChanged(*this, wParam, lParam);
這樣就能夠在OnPosChanged函數裏處理WM_USER_POS_CHANGED消息了。spa
三、發送自定義消息:code
在須要發送消息的地方調用::PostMessage(*this, WM_USER_POS_CHANGED, wParam, lParam);便可,和windows同樣(固然,SendMessage也OK,看狀況使用)orm
在入門教程裏就屢次強調,duilib只是一個UI庫,其餘地方依然是windows編程,通過這麼多例子的講解,如今應該瞭解得差很少了吧~O(∩_∩)O~blog