前段时间研究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);

本文介绍了duilib框架中WM_PAINT消息的处理,主要分为控件布局和界面更新两部分。控件布局涉及容器及子控件的位置设置,而界面更新通过DoPaint函数实现。DoPaint函数类似于MFC的OnPaint函数,可用于执行绘图操作。在duilib中实现动画效果,可以借鉴MFC中创建GIF控件的方法,结合定时器和InvaldateRect函数,利用WM_PAINT消息进行绘制。
最低0.47元/天 解锁文章
1137

被折叠的 条评论
为什么被折叠?



