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


一、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~






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM