duilib进阶教程 -- 响应windows原生消息和自定义消息(13)

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

  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~

时间: 2024-10-11 13:02:57

duilib进阶教程 -- 响应windows原生消息和自定义消息(13)的相关文章

duilib入门简明教程 -- 响应按钮事件(4) (转)

原文转自 http://www.cnblogs.com/Alberl/p/3343610.html 上一个Hello World的教程里有一句代码是这样的:CControlUI *pWnd = new CButtonUI; 也就是说,其实那整块绿色背景区域都是按钮的区域.(这里简要介绍下,CControlUI 是duilib中所有控件的基类,而CButtonUI则是按钮类,更多的控件会在后面的教程一一介绍.) 那么怎样响应按钮的点击消息呢? 我们需要几个步骤: 1.调用AddNotifier函数

Duilib学习笔记《05》— 消息响应处理

在Duilib学习笔记<04>中已经知道了如何将窗体显示出来,而如何处理窗体上的事件.消息呢? 一. 系统消息 窗体显示的时候我们就已经说了,窗体是继承CWindowWnd类的,对于窗体的部分消息的处理,需要重载该类的LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); 函数.在显示窗体部分我们创建窗体WM_CREATE消息以及屏蔽标题栏WM_NCACTIVATE.WM_NCCALCSIZE.WM_NCPAINT等消息 

Duilib学习三 响应按钮

1 #pragma once 2 #include <UIlib.h> 3 using namespace DuiLib; 4 5 #ifdef _DEBUG 6 # ifdef _UNICODE 7 # pragma comment(lib, "DuiLib_ud.lib") 8 # else 9 # pragma comment(lib, "DuiLib_d.lib") 10 # endif 11 #else 12 # ifdef _UNICODE

【转】windows常用消息大全(系统消息、通告消息、用户消息)

原文网址:http://blog.csdn.net/nupt123456789/article/details/7370562 附录A Windows 常用消息大全 表A-1  Windows消息分布 消息范围 说 明 0 - WM_USER – 1 系统消息 WM_USER - 0x7FFF 自定义窗口类整数消息 WM_APP - 0xBFFF 应用程序自定义消息 0xC000 - 0xFFFF 应用程序字符串消息 > 0xFFFF 为以后系统应用保留 表A-2  常用Windows消息 消息

Nodejs爬虫进阶教程之异步并发控制

Nodejs爬虫进阶教程之异步并发控制 之前写了个现在看来很不完美的小爬虫,很多地方没有处理好,比如说在知乎点开一个问题的时候,它的所有回答并不是全部加载好了的,当你拉到回答的尾部时,点击加载更多,回答才会再加载一部分,所以说如果直接发送一个问题的请求链接,取得的页面是不完整的.还有就是我们通过发送链接下载图片的时候,是一张一张来下的,如果图片数量太多的话,真的是下到你睡完觉它还在下,而且我们用nodejs写的爬虫,却竟然没有用到nodejs最牛逼的异步并发的特性,太浪费了啊. 思路 这次的的爬

windows程序消息机制(Winform界面更新有关)--转

1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵.这个消息泵让windows程序生生不息. Windows程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源.这里的While循环使用了GetMessage() 这个方法,这是个阻塞方法,也就是队列为空时方法就会阻塞,从而这个While循环停止运动,这避免了一个程序把cpu无缘无故的耗尽,让其他程序难以得到响应.当然在某些需要cpu最大限度运动的程序里面就可以使用另外的方法,例如某些

windows程序消息机制(Winform界面更新有关)

windows程序消息机制(Winform界面更新有关) 转自:http://www.cnblogs.com/blosaa/archive/2013/05/31/3109586.html 1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵.这个消息泵让windows程序生生不息. Windows程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源.这里的While循环使用了GetMessage() 这个方法,这是个阻塞方法,也就是队列

Windows 常用消息及含义

消息范围 说明 0 - WM_USER – 1 系统消息 WM_USER - 0x7FFF 自定义窗口类整数消息 WM_APP - 0xBFFF 应用程序自定义消息 0xC000 - 0xFFFF 应用程序字符串消息 > 0xFFFF 为以后系统应用保留 消息名称 值 含义 WM_NULL 0x0000 空消息,此消息将被接收窗口忽略 WM_CREATE 0x0001 应用程序创建一个窗口 WM_DESTROY 0x0002 一个窗口被销毁 WM_MOVE 0x0003 移动一个窗口 WM_SI

说一说windows原生docker及windows Server Container , Hyper Container 之间的关系(学习总结)

前一段时间学习netcore的时候解除到了docker,感觉真是不错的技术.百度了不少教程.因为我用windows就下载安装了一下试试.但是没有安装成功,才发现 需要安装virtualbox虚拟机,与我的hyper-v冲突.后来看新闻出了windows版的docker,把virtualbox换成了hyper-v.也算小惊喜吧,心想如果能出原生的windows 版docker就好了.试着 注册了个docker账号 ,并申请内测(打肿脸充胖子),一个月过去了,也没见给发邮件. 于是又百度了些资料,发