duilib CPaintManagerUI的WM_PAINT消息
前段时间研究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消息相关推荐
- WM_PAINT消息小结
WM_PAINT消息小结 hanlray@gmail.com Revision: 1.0 Date: 2005/08/14 WM_PAINT是Windows窗口系统中一条重要的消息,应用程序通过处理该 ...
- Visual C++——定时刷新重绘窗口[WM_PAINT消息]解决方案
基本概念 定时器:每隔一定时间执行一次的任务. API SetTimer的函数原型: UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uEl ...
- WM_Paint 消息疑问解析
1. 系统何时发送WM_PAINT消息? 系统会在多个不同的时机发送 WM_PAINT 消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个 窗口背后移出时,当最大化或最小化窗口时 ...
- windows 编程随笔——输出文本WM_PAINT消息|有效矩形和无效矩形
在说文本输出前先说明下什么是: 1,WM_PAINT消息?什么情况触发此消息? 此消息通知窗口过程必须绘制客户区. 以下四种情况windows会通知窗口过程接收一个WM_PAINT消息: 用户移动或显 ...
- Windows 编程[8] - WM_PAINT 消息
本例效果图: program Project1;usesWindows, Messages;{供 WM_PAINT 消息调用的自定义过程} procedure OnPaint(h: HWND); co ...
- 为duilib的MenuDemo增加消息响应,优化代码和显示效果
转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/38253297 第一部分 我在前一段时间研究了怎么制作duilib的菜单, ...
- DUILib 中的通知事件
CTabLayoutUI tabselect 调用SelectItem选择了某一项时通知. CActiveXUI ...
- 令人生疑的Windows窗口消息WM_PAINT详解
目录 1.WM_APINT消息的产生 2.WM_ERASEBKGND消息说明 3.InvalidateRect和UpdateWindow 4.何时使用BeginPaint和EndPaint? 在做Wi ...
- duilib 预开篇
曾几何时,当我看到好看的windows 软件界面时,也想亲手写出这么绚丽好看的界面. 于是我就到处寻找windows UI编程教程.在一番查找和比较下,最终选择了duilib. 主要考虑到了duili ...
最新文章
- [置顶] 软件设计之道_读书纪要.doc
- (二)Mysql 基础了解,修改字符集,配置文件
- python计算圆的面积
- JPG,动态GIF,BMP一些常用解决办法
- Spring依赖注入的两种方式(根据实例详解)
- jmeter 添加虚拟IP
- easyUi reload 重定向URL
- CCNA学习指南笔记(1)网络的功能
- 多频段压缩参数均衡器:Initial Audio Dynamic EQ Mac
- 基于ssm的仓库管理系统
- MindManager2021下载及安装教程
- 举例mysql中group_concat()函数使用
- java dismiss_为什么我的dismiss()方法无法关闭自定义警报对话框
- Python免杀脚本生成.exe(过火绒过联想没过360)
- 【文献阅读】StyleBERT: Chinese pretraining by font style information
- js中的Symbol数据类型
- Scientific Linux 6(x86_64) 之旅
- 合宙ESP32S3 CameraWebServe 测试demo
- 2019-6-28 训练日记-写Java课设报告和记一次糟糕的cf比赛
- HTML input 标签 date 类型 设置默认值
热门文章
- mysql applicationcontext.xml_配置applicationcontext.xml文件
- idea module取得是parent的文件路径_React(或使用TS)中样式混乱解决方案 *.module.less...
- observable java_java源码阅读Observable(观察者模式)
- java 多态判断非空_Java 面试知识点解析基础知识
- python字符串操作总结_Python字符串的一些操作方法总结
- Linux export 命令设置环境目录
- pip安装第三方库报错Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None))
- Pytorch:函数的手动梯度计算方法
- 【转】windows多线程CreateThread与_beginthreadex本质区别
- 20190720学习小结