前段时间研究duilib绘图机制,由于忙了一段时间,感觉又忘记了不少,写个博客,记录一下,免得以后又看源码。直接翻博客就行了。

WM_PAINT 分为两部分,第一部分为:  控件 布局, 第二部分为:界面更新。

控件布局

duilib里面最上层的 是容器 , 容器里面主要包含各种控件,当然也可以嵌套容器。

如果最上层的容器需要布局,那就更新最上层容器 位置,即setpos函数。

容器的setpos函数 一个责任那就是维护子控件的位置,为以后更近控件做准备。

            if( m_bUpdateNeeded ) {m_bUpdateNeeded = false;RECT rcClient = { 0 };::GetClientRect(m_hWndPaint, &rcClient);if( !::IsRectEmpty(&rcClient) ) {if( m_pRoot->IsUpdateNeeded() ) {m_pRoot->SetPos(rcClient);if( m_hDcOffscreen != NULL ) ::DeleteDC(m_hDcOffscreen);if( m_hDcBackground != NULL ) ::DeleteDC(m_hDcBackground);if( m_hbmpOffscreen != NULL ) ::DeleteObject(m_hbmpOffscreen);if( m_hbmpBackground != NULL ) ::DeleteObject(m_hbmpBackground);m_hDcOffscreen = NULL;m_hDcBackground = NULL;m_hbmpOffscreen = NULL;m_hbmpBackground = NULL;}else {CControlUI* pControl = NULL;while( pControl = m_pRoot->FindControl(__FindControlFromUpdate, NULL, UIFIND_VISIBLE | UIFIND_ME_FIRST) ) {pControl->SetPos( pControl->GetPos() );}}// We'll want to notify the window when it is first initialized// with the correct layout. The window form would take the time// to submit swipes/animations.if( m_bFirstLayout ) {m_bFirstLayout = false;SendNotify(m_pRoot, DUI_MSGTYPE_WINDOWINIT,  0, 0, false);}}}

界面更新

布局完成之后就是刷新界面,刷新界面机制和布局一样,使用的是DoPaint函数,同样容器维护期子类的更新。

这里就不在多描述了,DoPaint函数原型是这样的:

void CContainerUI::DoPaint(HDC hDC, const RECT& rcPaint)

第一个是 双缓冲句柄(如果开启双缓冲的话),后面有个是父控件的区域。

熟悉mfc对话框的都知道有一个OnPaint函数,我们绘图就是在这里面进行的。

这个DoPaint函数和OnPaint函数函数类似,我们可以进行一些 绘图操作。

duilib的控件也是在这个hdc上面绘图。

在MFC里面,写一个gif控件 ,分下面几个步骤

1.继承cwnd 写一个控件控件

2使用settimer函数添加一个定时器

3.定时器里面添加 InvaldateRect函数

4.在OnPaint函数里面 绘制当前帧

模仿我们在mfc里面的使用操作,我们可以再duilib里面做一些动画操作。

duilib CPaintManagerUI的WM_PAINT消息相关推荐

  1. WM_PAINT消息小结

    WM_PAINT消息小结 hanlray@gmail.com Revision: 1.0 Date: 2005/08/14 WM_PAINT是Windows窗口系统中一条重要的消息,应用程序通过处理该 ...

  2. Visual C++——定时刷新重绘窗口[WM_PAINT消息]解决方案

    基本概念 定时器:每隔一定时间执行一次的任务. API SetTimer的函数原型: UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uEl ...

  3. WM_Paint 消息疑问解析

    1. 系统何时发送WM_PAINT消息?    系统会在多个不同的时机发送 WM_PAINT 消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个 窗口背后移出时,当最大化或最小化窗口时 ...

  4. windows 编程随笔——输出文本WM_PAINT消息|有效矩形和无效矩形

    在说文本输出前先说明下什么是: 1,WM_PAINT消息?什么情况触发此消息? 此消息通知窗口过程必须绘制客户区. 以下四种情况windows会通知窗口过程接收一个WM_PAINT消息: 用户移动或显 ...

  5. Windows 编程[8] - WM_PAINT 消息

    本例效果图: program Project1;usesWindows, Messages;{供 WM_PAINT 消息调用的自定义过程} procedure OnPaint(h: HWND); co ...

  6. 为duilib的MenuDemo增加消息响应,优化代码和显示效果

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/38253297 第一部分 我在前一段时间研究了怎么制作duilib的菜单, ...

  7. DUILib 中的通知事件

    CTabLayoutUI               tabselect              调用SelectItem选择了某一项时通知. CActiveXUI                  ...

  8. 令人生疑的Windows窗口消息WM_PAINT详解

    目录 1.WM_APINT消息的产生 2.WM_ERASEBKGND消息说明 3.InvalidateRect和UpdateWindow 4.何时使用BeginPaint和EndPaint? 在做Wi ...

  9. duilib 预开篇

    曾几何时,当我看到好看的windows 软件界面时,也想亲手写出这么绚丽好看的界面. 于是我就到处寻找windows UI编程教程.在一番查找和比较下,最终选择了duilib. 主要考虑到了duili ...

最新文章

  1. [置顶] 软件设计之道_读书纪要.doc
  2. (二)Mysql 基础了解,修改字符集,配置文件
  3. python计算圆的面积
  4. JPG,动态GIF,BMP一些常用解决办法
  5. Spring依赖注入的两种方式(根据实例详解)
  6. jmeter 添加虚拟IP
  7. easyUi reload 重定向URL
  8. CCNA学习指南笔记(1)网络的功能
  9. 多频段压缩参数均衡器:Initial Audio Dynamic EQ Mac
  10. 基于ssm的仓库管理系统
  11. MindManager2021下载及安装教程
  12. 举例mysql中group_concat()函数使用
  13. java dismiss_为什么我的dismiss()方法无法关闭自定义警报对话框
  14. Python免杀脚本生成.exe(过火绒过联想没过360)
  15. 【文献阅读】StyleBERT: Chinese pretraining by font style information
  16. js中的Symbol数据类型
  17. Scientific Linux 6(x86_64) 之旅
  18. 合宙ESP32S3 CameraWebServe 测试demo
  19. 2019-6-28 训练日记-写Java课设报告和记一次糟糕的cf比赛
  20. HTML input 标签 date 类型 设置默认值

热门文章

  1. mysql applicationcontext.xml_配置applicationcontext.xml文件
  2. idea module取得是parent的文件路径_React(或使用TS)中样式混乱解决方案 *.module.less...
  3. observable java_java源码阅读Observable(观察者模式)
  4. java 多态判断非空_Java 面试知识点解析基础知识
  5. python字符串操作总结_Python字符串的一些操作方法总结
  6. Linux export 命令设置环境目录
  7. pip安装第三方库报错Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None))
  8. Pytorch:函数的手动梯度计算方法
  9. 【转】windows多线程CreateThread与_beginthreadex本质区别
  10. 20190720学习小结