duilib進階教程 -- 響應windows原生消息和自定義消息(13)

1、windows原生消息

  一樣,入門教程只是給出了響應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);
}

 

2、自定義消息

  自定義消息也是常常用到的,順帶介紹一下,和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



相關文章
相關標籤/搜索