1 Duilib的绘制机制
Duilib中一个重要部分就是其绘制窗口以及控件的机制,如果我们需要在Duilib中自定义一个控件,那么弄清楚Duilib的绘制机制就非常重要,Duilib中有太多与绘制相关的函数,比如Paint、DoPaint、PaintBkcolor、PaintStatusImage、PaintText、PaintBorder、DoPostPaint等等,那么这些绘制函数的调用顺序是什么样的呢?
1.1 Duilib中总体绘制流程
基于Duilib的源码,大致梳理一下Duilib的总体绘制流程,
1. 首先在UIManager.cpp
文件中的CPaintManagerUI
类的MessageHandler
函数中对WM_PAINT
消息的处理代码,其中
m_pRoot->Paint(m_hDcOffscreen, rcPaint, NULL);
开始对控件进行绘制。
2. 然后在CControlUI
的Paint
函数中调用DoPaint
对控件进行绘制,对于每一个控件
PaintBkColor(hDC);
PaintBkImage(hDC);
PaintStatusImage(hDC);
PaintForeColor(hDC);
PaintForeImage(hDC);
PaintText(hDC);
PaintBorder(hDC);
根据上述的源码,每一个控件的绘制顺序为首先绘制背景颜色->绘制背景图片->绘制状态图片->绘制前景颜色->绘制文本->绘制边框。
3. 再回到UIManager.cpp
文件中的CPaintManagerUI
类的MessageHandler
函数中对WM_PAINT
消息的处理代码,在
m_pRoot->Paint(m_hDcOffscreen, rcPaint, NULL);
之后我们可以找到以下代码
for( int i = 0; i < m_aPostPaintControls.GetSize(); i++ ) {
CControlUI* pPostPaintControl = static_cast<CControlUI*>(m_aPostPaintControls[i]);
pPostPaintControl->DoPostPaint(m_hDcOffscreen, rcPaint);
}
在完成控件绘制之后,并且完成本地窗口的绘制完成之后会调用上述代码。这段代码的意思是遍历所有需要PostPaint的控件,然后按顺序调用各自的DoPostPain
函数,这样绘制的东西就会显示所有已绘制控件的上层。
参考链接
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:Duilib – Duilib的绘制机制和绘制流程
原文链接:https://www.stubbornhuang.com/2403/
发布于:2022年11月01日 10:20:37
修改于:2023年06月21日 17:54:24
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
大佬,怎么实现界面上点击按钮就弹出一个窗口显示相关信息,点击界面其他处信息框就消失的功能呢,有时间可以出一期教程嘛,还有一个问题是duilib的窗体设置圆角会有黑色的小角显示,这个有什么好办法可以去除嘛
第一个没得时间写,第二个设置圆角有黑角可以让你的UI直接给你贴图,直接贴上去就好
好的,非常感谢!