DUILIB源码阅读记录

一、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, TImageInfo* imageInfo, short H, short S, short L);
    static TImageInfo* LoadImage(STRINGorID bitmap, LPCTSTR type = NULL, DWORD mask = 0);
    static void FreeImage(TImageInfo* bitmap, bool bDelete = true);
    static void DrawImage(HDC hDC, HBITMAP hBitmap, const RECT& rc, const RECT& rcPaint, \
        const RECT& rcBmpPart, const RECT& rcScale9, bool alphaChannel, BYTE uFade = 255, 
        bool hole = false, bool xtiled = false, bool ytiled = false);
	static bool DrawImage(HDC hDC, CPaintManagerUI* pManager, const RECT& rcItem, const RECT& rcPaint, 
		TDrawInfo& drawInfo);
    static void DrawColor(HDC hDC, const RECT& rc, DWORD color);
    static void DrawGradient(HDC hDC, const RECT& rc, DWORD dwFirst, DWORD dwSecond, bool bVertical, int nSteps);

    // 以下函数中的颜色参数alpha值无效
    static void DrawLine(HDC hDC, const RECT& rc, int nSize, DWORD dwPenColor, int nStyle = PS_SOLID);
    static void DrawRect(HDC hDC, const RECT& rc, int nSize, DWORD dwPenColor, int nStyle = PS_SOLID);
    static void DrawRoundRect(HDC hDC, const RECT& rc, int width, int height, int nSize, DWORD dwPenColor, int nStyle = PS_SOLID);
    static void DrawText(HDC hDC, CPaintManagerUI* pManager, RECT& rc, LPCTSTR pstrText, \
        DWORD dwTextColor, int iFont, UINT uStyle);
    static void DrawHtmlText(HDC hDC, CPaintManagerUI* pManager, RECT& rc, LPCTSTR pstrText, 
        DWORD dwTextColor, RECT* pLinks, CDuiString* sLinks, int& nLinkRects, int iDefaultFont, UINT uStyle);
	static HBITMAP GenerateBitmap(CPaintManagerUI* pManager, RECT rc, CControlUI* pStopControl = NULL, DWORD dwFilterColor = 0);
    static HBITMAP GenerateBitmap(CPaintManagerUI* pManager, CControlUI* pControl, RECT rc, DWORD dwFilterColor = 0);
	static SIZE GetTextSize(HDC hDC, CPaintManagerUI* pManager , LPCTSTR pstrText, int iFont, UINT uStyle);
};

四、其他

DuiLib的双缓存方式:
先在内存中绘图(
HDC hChildMemDC = ::CreateCompatibleDC(m_hDcOffscreen); // 创建内存DC
HBITMAP hChildBitmap = CRenderEngine::CreateARGB32Bitmap() // 创建位图),
再通过BitBlt()将内存中的图像块复制到屏幕。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值