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



相关文章
相关标签/搜索