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