一、DuiLib介绍
一个Windows下的纯UI框架。与传统Win32的主要区别是它所有的控件都是在一个大的窗口上绘制,层级、父子关系、消息派发等都是内部做了绘制和区分。传统的Win32是每个控件都是一个句柄,都有各自的消息队列,当界面比较复杂时,需要维护的消息队列太多,Dui思想就是只维护父窗口的消息队列,其他控件的消息派发到父窗口。
二、框架
DuiLib框架可分为两部分理解:控件层和核心层。
1、控件层主要包含三部分:控件、容器和布局。
DuiLib封装了一些基本的控件,比如CButtonUI、CTextUI、CProgressUI、CLableUI、CSliderUI,所有的控件继承于CControlUI。
容器,基本所有的容器都继承于CContainerUI,包括CComboUI、CDialogLayoutUI等。
布局有水平布局(CHorizontalLayoutUI)、垂直布局(CVericalLayoutUI)、Tab页布局(CTabLayoutUI)、平铺布局(CTileLayoutUI)等。
2、核心层包括:UI构建、窗体管理器、绘制渲染等。
UI构建:支持xml解析构建。(CDialogBuilder::_Parse())。
窗体管理器:包括资源管理和消息管理。消息管理经过消息循环到窗口的MessageHandler再经过Event派发到对应的控件,控件DoEvent完再Notify()到窗口。
绘制渲染:CRenderEngine封装了一些gdi的绘制,都是一些静态函数,包括绘制图片,区域,文字等。
三、代码分析
一般控件绘制整体代码调用流程:CPaintManagerUI::MessageHandler(WM_PAINT)—>CContainerUI::DoPaint—>CControlUI::DoPaint—>CRenderEngine。
消息管理:点击页面上的一个按钮,触发的调用如下:
绘制渲染:
class DUILIB_API CRenderEngine
{
public:
static DWORD AdjustColor(DWORD dwColor, short H, short S, short L);
static HBITMAP CreateARGB32Bitmap(HDC hDC, int cx, int cy, COLORREF** pBits);
static void AdjustImage(bool bUseHSL, TImageIn