《duilib之源码分析》
1 stdAfx.h

  1. * lengthof(x) 计算数组长度宏
  2. * MAX  两值最大
  3. * MIN  两值最小
  4. * CLAMP(x,a,b) x在a,b之间则取x否则取最小

2 UIBase

  1. * UI_WNDSTYLE_ 窗口风格属性
  2. * UI_CLASSSTYLE_ 窗口类属性
  3. * TRACE(LPCTSTR pstrFormat, ...)
  4. 功能 - 调试信息
  5. 参考 - 参考printf
  6. * TRACEMSG(UINT uMsg)
  7. 功能 - 将windows消息转化成其对应的宏名
  8. uMsg - Windows消息ID
  9. 返回值 - 宏名(字符串)
  10. * class STRINGorID
  11. 功能 - 统一资源ID, 字符串类型和整型统一输出为字符串类型
  12. * class CPoint
  13. 描述 - 点
  14. 函数 -
  15. CPoint(LPARAM lParam) //将消息中lParam转化成点
  16. * class CSize
  17. 描述 - 矩形的宽和高
  18. * class CRect
  19. 描述 - 矩形区域
  20. 函数 -
  21. void Empty() //设置left,right,top,bottom为零
  22. void Join(const RECT& rc) //合并两个矩形产生一个包含两个矩形的新的矩形
  23. void ResetOffset() //将矩形移动到left=0,top=0的位置
  24. void Normalize() //调整left,right,top,bottom使之left < right top < bottom
  25. void Offset(int cx, int cy) //移动矩形, cx 横向移动距离, cy 纵向移动距离
  26. void Inflate(int cx, int cy) //放大矩形, cx左右各放大的大小, cy 上下各放大的大小
  27. void Deflate(int cx, int cy) //缩小矩形, cx左右各缩小的大小, cy上下各缩小的大小
  28. void Union(CRect& rc) //合并矩形, 与Join()函数功能几乎一致, 但对空矩形处理不同
  29. * class CStdPtrArray
  30. 变量 -
  31. m_nAllocated //已申请空间大小(可储存Ptr的数量), 如果空间不足则去realloc m_nAllocated*2的空间
  32. * class CStdString
  33. 实现 - 如果长度小于MAX_LOCAL_STRING_LEN(63)则在栈上分配, 否则在堆上分配
  34. 函数 -
  35. void Assign(LPCTSTR pstr, int nLength = -1) //分配
  36. * class CStdStringMap
  37. 描述 - 字符串map
  38. 实现 - 使用times33哈希算法
  39. * class CWindowWnd
  40. 函数 -
  41. RegisterWindowClass() //RegisterClass的封装
  42. RegisterSuperclass() //超类化窗口
  43. Subclass() //子类化窗口
  44. ShowModal() //窗口模态化
  45. ?MessageBox() //?UIBase.cpp 为utf8
  46. __WndProc() //消息处理函数
  47. __ControlProc() //超类化消息处理函数

实现 - 
    duilib消息处理机制
   1 创建 - 通过CreateEx最后一个参数传递类指针this, 在消息处理函数中对WM_NCCREATE消息进行处理, 通过SetWindowLongPtr(GWLP_USERDATA) 进行保存
   2 消息处理 - 在消息处理函数通过GetWindowLongPtr(GWLP_USERDATA)得到其类指针, 调用虚函数HandleMessage()相应其他消息。
   3 销毁 - 消息处理函数中对WM_NCDESTROY消息进行处理, 调用原消息处理函数, 重置(GWLP_USERDATA), 调用虚函数OnFinalMessage()做最后处理。

3 the 3rd part stb_image

  1. * 描述 - 载入各种图片格式文件
  2. * 函数 -
  3. stbi_load_from_memory()
  4. 功能 - 加载图片
  5. buffer - 内存数据
  6. len - 数据大小,
  7. x - [out]图像宽度(像素)
  8. y - [out]图像高度(像素)
  9. comp - [out]图像数据组成结果
  10. req_comp - 图像数据组成
  11. STBI_default = 0, // only used for req_comp
  12. STBI_grey       = 1,
  13. STBI_grey_alpha = 2,
  14. STBI_rgb        = 3,
  15. STBI_rgb_alpha  = 4
  16. [more than] stb_image.c line 100 - 130
  17. stbi_image_free()
  18. 功能 - 释放已加载的图片数据

4 the 3rd part XUnzip

  1. * 描述 - 解压zip包
  2. * 函数 -
  3. OpenZip
  4. 功能 - 打开一个zip包
  5. z - 内存地址, 文件名, 文件句柄
  6. len - 长度
  7. flag - 标识(ZIP_HANDLE=1, ZIP_FILENAME=2, ZIP_MEMORY=3)
  8. return - HZIP
  9. CloseZip
  10. 功能 - 关闭一个zip包
  11. hz - HZIP
  12. GetZipItem
  13. 功能 - 从zip包中获取一项
  14. hz - HZIP
  15. index - 序号
  16. ze - zip入口点结构
  17. FindZipItem
  18. 功能 - 在zip包中查找项
  19. hz - HZIP
  20. name - 项名
  21. ic - 大小写敏感 CASE_INSENSITIVE=1, CASE_SENSITIVE=2
  22. index - [out]序号
  23. ze - zip入口点结构
  24. UnzipItem
  25. 功能 - 解压项
  26. hz - HZIP
  27. dst - [out]解压后存储位置
  28. len - 储存长度
  29. flags - 标识(ZIP_HANDLE=1, ZIP_FILENAME=2, ZIP_MEMORY=3)

5 class CRenderClip

  1. * 描述 - 区域引擎,设置在dc上绘制的区域,防止子控件绘制到父控件外侧(float属性控件除外)
  2. * 实现 -
  3. * 函数 -
  4. GenerateClip() //产生一个剪切区域, hDC窗口句柄, rc区域, clip[out]剪切区
  5. GenerateRoundClip() //产生一个圆角剪切区域, hDC窗口句柄, rc区域, width 横向圆角弧度, height纵向圆角弧度, clip[out]剪切区
  6. UseOldClipBegin(() //使用整个活跃区域作为剪切区, hDC窗口句柄, clip剪切区
  7. UseOldClipEnd() //使用当前控件有效区域作为剪切区, hDC窗口句柄, clip剪切区

6 class CRenderEngine

  1. * 渲染引擎
  2. * 函数 -
  3. LoadImage()
  4. 功能 - 加载图像
  5. bitmap - 图像
  6. type - 类型
  7. mask - 隐蔽色
  8. 实现 -
  9. 1 读取文件,资源和zip包中图像文件数据到内存[通过HIWORD(bitmap.m_lpstr)区别从资源中或文件中加载MAKEINTRESOURCE  The return value is the specified value in the low-order word and zero in the high-order word. (from msdn)]
  10. 2 创建DIB
  11. 3 通过stbi_load_from_memory加载数据文件并转化后复制到DIB中
  12. 4 返回TImageInfo结构
  13. DrawImage()
  14. 功能 - 绘制图像
  15. hDC - 设备句柄
  16. hBitmap - 位图句柄
  17. rc - 对象区域
  18. rcPaint - 绘制区域
  19. rcBmpPart - 位图区域
  20. rcConrners - 拉伸区域
  21. alphaChannel - alpha通道
  22. uFade - 透明度
  23. hole - 居中
  24. xtiled - 横向平铺
  25. ytiled - 纵向平铺
  26. 实现 -
  27. 1 CreateCompatibleDC (创建内存设备句柄)
  28. 2 SelectObject() (将位图选入内存设备句柄)
  29. 3 AlphaBlend (alpha混合)
  30. 4 BitBlt() or StretchBlt() (绘制到内存设备句柄)
  31. 5 SelectObject() (将老的位图选入内存设备句柄)
  32. 6 DeleteDC (释放内存设备句柄)
  33. DrawImageString()
  34. 功能 - 按标识字符串绘制图像
  35. hDC - 设备句柄
  36. pManager - 绘制管理者
  37. rc - 对象区域
  38. rcPaint - 绘制区域
  39. pStrImage - 标识字符串
  40. pStrModify - 标识字符串
  41. 实现 -
  42. 1 分析标识字符串获取属性
  43. 2 获取图像数据
  44. 3 绘制图像
  45. DrawColor()
  46. 功能 - 绘制矩形
  47. hDC - 设备句柄
  48. rc - 对象区域
  49. color - 颜色(alpha, r, g, b)
  50. 实现 -
  51. 如果不需要alpha混合则SetBkColor() ExtTextOut()
  52. 否则 创建一个像素大小的32位DIB
  53. DrawGradient()
  54. 功能 - 绘制渐变
  55. hDC - 设备句柄
  56. rc - 对象区域
  57. dwFirst - 颜色1
  58. dwSecond - 颜色2
  59. bVertical - 渐变方向 true垂直 false水平
  60. nSteps - 步长 [使用GradientFill() API时无效]
  61. 实现 -
  62. 1 渐变填充
  63. 2 alpha混合
  64. DrawLine() - 绘制直线
  65. DrawRect() - 绘制矩形
  66. DrawRoundRect() - 绘制圆角矩形
  67. DrawText() - 绘制文字
  68. DrawHtmlText()
  69. 功能 - 绘制 "mini-html" 标识字符串
  70. hDC - 设备句柄
  71. pManager - 绘制管理者
  72. rc - 对象区域
  73. pstrText -  "mini-html" 标识字符串
  74. dwTextColor - 字符串类型
  75. pLinks - 产生链接效果的区域组
  76. sLinks - 产生链接效果的区域组数量
  77. nLinkRects - 产生链接效果的区域组数量
  78. uStyle - 类型,同DrawText() Format Flags
  79. GenerateBitmap()
  80. 功能 - 产生一个BMP位图
  81. pManager - 绘制管理者
  82. pControl - 控件句柄
  83. rc - 对象区域
  84. 返回 - BMP句柄

7 class INotifyUI - Listener interface
8 class IMessageFilterUI - MessageFilter interface
9 class CPaintManagerUI

  1. *绘制管理者
  2. * 函数
  3. Init() - 初始化
  4. NeedUpdate() -
  5. Invalidate() - InvalidateRect API的封装
  6. GetPaintDC() - 设备句柄相关函数
  7. GetPaintWindow() - 得到窗口句柄
  8. GetTooltipWindow() - 得到提示窗口句柄
  9. GetMousePos() - 得到鼠标位置
  10. GetClientSize() - 得到客户端区域大小
  11. 获取/设置 窗口初始化时大小
  12. GetInitSize()
  13. SetInitSize()
  14. 获取/设置 托腮大小
  15. GetSizeBox()
  16. SetSizeBox()
  17. 获取/设置 标题区域大小
  18. GetCaptionRect()
  19. SetCaptionRect()
  20. 获取/设置 圆角大小
  21. GetRoundCorner()
  22. SetRoundCorner()
  23. 获取/设置 大小的最小限制
  24. GetMinInfo()
  25. SetMinInfo()
  26. 获取/设置 大小的最大限制
  27. GetMaxInfo()
  28. SetMaxInfo()
  29. 设置透明度
  30. SetTransparent()
  31. 设置背景是否使用透明属性
  32. SetBackgroundTransparent()
  33. 获取/设置 刷新区域属性
  34. IsShowUpdateRect()
  35. SetShowUpdateRect()
  36. 获取/设置 应用程序对象实例句柄
  37. GetInstance()
  38. SetInstance()
  39. 获取 可执行程序所在路径
  40. GetInstancePath()
  41. 获取/设置 当前工作目录
  42. GetCurrentPath()
  43. SetCurrentPath()
  44. 获取/设置 资源动态库句柄
  45. GetResourceDll()
  46. SetResourceDll()
  47. 获取/设置 资源路径
  48. GetResourcePath()
  49. SetResourcePath()
  50. 获取/设置 资源压缩包文件名
  51. GetResourceZip()
  52. SetResourceZip()
  53. 使用绘制管理者的根绘制管理者的资源设置 - 循环得到父绘制管理者直到找到最顶层的绘制管理者
  54. UseParentResource()
  55. 得到绘制管理者
  56. GetParentResource()
  57. 获取/设置 非可用状态文字颜色
  58. GetDefaultDisabledColor()
  59. SetDefaultDisabledColor()
  60. 获取/设置 默认字体颜色
  61. GetDefaultFontColor()
  62. SetDefaultFontColor()
  63. 获取/设置超链接默认字体颜色
  64. GetDefaultLinkFontColor()
  65. SetDefaultLinkFontColor()
  66. 获取/设置 鼠标漂浮在链接上时默认字体颜色
  67. GetDefaultLinkHoverFontColor()
  68. SetDefaultLinkHoverFontColor()
  69. 获取/设置 选中后背景颜色
  70. GetDefaultSelectedBkColor()
  71. SetDefaultSelectedBkColor()
  72. 获取/设置 默认字体
  73. GetDefaultFontInfo()
  74. SetDefaultFont()
  75. 字体列表操作
  76. DWORD GetCustomFontCount() - 得到字体列表中项数量
  77. HFONT AddFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 加入一种字体到字体列表中
  78. HFONT AddFontAt(int index, LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 加入一种字体到字体列表的指定位置
  79. HFONT GetFont(int index) - 按序号得到字体列表中的字体
  80. HFONT GetFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 按字体属性得到字体列表中的字体
  81. bool FindFont(HFONT hFont) - 按句柄查找字体列表中的一项
  82. bool FindFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 按属性查找字体列表中的一项
  83. bool RemoveFont(HFONT hFont)  - 按句柄移除字体列表中的指定项
  84. bool RemoveFontAt(int index) - 按序号移除字体列表中的指定项
  85. void RemoveAllFonts() - 移除字体列表中的所有项
  86. TFontInfo* GetFontInfo(int index) - 按序号得到字体列表中项的属性
  87. TFontInfo* GetFontInfo(HFONT hFont) - 按句柄得到字体列表中项的属性
  88. 图片列表操作
  89. const TImageInfo* GetImage(LPCTSTR bitmap);
  90. const TImageInfo* GetImageEx(LPCTSTR bitmap, LPCTSTR type = NULL, DWORD mask = 0);
  91. const TImageInfo* AddImage(LPCTSTR bitmap, LPCTSTR type = NULL, DWORD mask = 0);
  92. bool RemoveImage(LPCTSTR bitmap);
  93. void RemoveAllImages();
  94. 默认属性列表操作
  95. void AddDefaultAttributeList(LPCTSTR pStrControlName, LPCTSTR pStrControlAttrList);
  96. LPCTSTR GetDefaultAttributeList(LPCTSTR pStrControlName) const;
  97. bool RemoveDefaultAttributeList(LPCTSTR pStrControlName);
  98. const CStdStringPtrMap& GetDefaultAttribultes() const;
  99. void RemoveAllDefaultAttributeList();
  100. 将控件树附加到当前绘制管理者
  101. bool AttachDialog(CControlUI* pControl);
  102. 初始化控件 把控件名称加入到绘制管理者的控件名map中
  103. bool InitControls(CControlUI* pControl, CControlUI* pParent = NULL);
  104. 重置控件
  105. void ReapObjects(CControlUI* pControl);
  106. 选项组操作
  107. bool AddOptionGroup(LPCTSTR pStrGroupName, CControlUI* pControl); - 添加选项组
  108. CStdPtrArray* GetOptionGroup(LPCTSTR pStrGroupName); - 通过名称得到选项组
  109. void RemoveOptionGroup(LPCTSTR pStrGroupName, CControlUI* pControl); - 移除选项组
  110. void RemoveAllOptionGroups(); - 移除所有选项组
  111. 得到控件焦点
  112. CControlUI* GetFocus() const;
  113. 控件获得焦点
  114. void SetFocus(CControlUI* pControl);
  115. 得到标签页控件
  116. bool SetNextTabControl(bool bForward = true);
  117. 定时器操作
  118. bool SetTimer(CControlUI* pControl, UINT nTimerID, UINT uElapse); - 设置一个定时器
  119. bool KillTimer(CControlUI* pControl, UINT nTimerID); - 清除一个定时器
  120. void RemoveAllTimers(); - 清楚所有定时器
  121. 捕获鼠标
  122. void SetCapture();
  123. 释放捕获鼠标
  124. void ReleaseCapture();
  125. 鼠标是否被捕获
  126. bool IsCaptured();
  127. bool AddNotifier(INotifyUI* pControl); - 加入一个Listener
  128. bool RemoveNotifier(INotifyUI* pControl);   - 移除一个Listener
  129. void SendNotify(TNotifyUI& Msg); - 发送一个Notify消息
  130. void SendNotify(CControlUI* pControl, LPCTSTR pstrMessage, WPARAM wParam = 0, LPARAM lParam = 0); - 发送一个Notify消息
  131. bool AddPreMessageFilter(IMessageFilterUI* pFilter); - 加入一个预处理Message Filter
  132. bool RemovePreMessageFilter(IMessageFilterUI* pFilter); - 移除一个预处理Message Filter
  133. bool AddMessageFilter(IMessageFilterUI* pFilter); - 加入一个Message Filter
  134. bool RemoveMessageFilter(IMessageFilterUI* pFilter); - 移除一个Message Filter
  135. PostPaint控件操作
  136. int GetPostPaintCount() const; - 得到PostPaint控件数量
  137. bool AddPostPaint(CControlUI* pControl); - 加入PostPaint控件
  138. bool RemovePostPaint(CControlUI* pControl); - 移除一个PostPaint控件
  139. bool SetPostPaintIndex(CControlUI* pControl, int iIndex); - 设置控件到指定的序列位置
  140. 加入控件到延迟处理列表当中
  141. void AddDelayedCleanup(CControlUI* pControl);
  142. 得到根控件
  143. CControlUI* GetRoot() const;
  144. 按照位置找到控件
  145. CControlUI* FindControl(POINT pt) const;
  146. 按父窗口和位置查找控件
  147. CControlUI* FindControl(CControlUI* pParent, POINT pt) const;
  148. 按名字查找控件
  149. CControlUI* FindControl(LPCTSTR pstrName);
  150. 按父窗口和名字查找控件
  151. CControlUI* FindControl(CControlUI* pParent, LPCTSTR pstrName);
  152. 消息循环
  153. static void MessageLoop();
  154. 消息处理
  155. static bool TranslateMessage(const LPMSG pMsg);
  156. 消息处理
  157. bool MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes);
  158. 消息预处理
  159. bool PreMessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes);
  160. 回调函数 - 比较属性(pData)与控件(pThis)的属性是否相同
  161. static CControlUI* CALLBACK __FindControlFromNameHash(CControlUI* pThis, LPVOID pData); - 按名称查找控件的回调函数
  162. static CControlUI* CALLBACK __FindControlFromCount(CControlUI* pThis, LPVOID pData); - 计算控件数目的回调函数
  163. static CControlUI* CALLBACK __FindControlFromPoint(CControlUI* pThis, LPVOID pData); - 按位置查找控件的回调函数
  164. static CControlUI* CALLBACK __FindControlFromTab(CControlUI* pThis, LPVOID pData); - 查找下一个相应tab的控件
  165. static CControlUI* CALLBACK __FindControlFromShortcut(CControlUI* pThis, LPVOID pData); - 快捷方式对应的控件
  166. static CControlUI* CALLBACK __FindControlFromUpdate(CControlUI* pThis, LPVOID pData); - 查找需要刷新的控件
  167. static CControlUI* CALLBACK __FindControlFromNameByParent(CControlUI* pThis, LPVOID pData); - 查找子控件
  168. HWND m_hWndPaint;    //绘制窗口句柄
  169. HDC m_hDcPaint;        //绘制DC
  170. HDC m_hDcOffscreen; //屏幕兼容DC
  171. HDC m_hDcBackground;    //背景DC
  172. HBITMAP m_hbmpOffscreen;    //屏幕DIB
  173. HBITMAP m_hbmpBackground;    //背景DIB
  174. HWND m_hwndTooltip;    //提示窗口句柄
  175. TOOLINFO m_ToolTip;    //提示结构
  176. bool m_bShowUpdateRect;    //是否更新
  177. //
  178. CControlUI* m_pRoot;    //根控件指针
  179. CControlUI* m_pFocus;    //获得焦点控件指针
  180. CControlUI* m_pEventHover;    //鼠标停留控件指针
  181. CControlUI* m_pEventClick;    //点击事件控件指针
  182. CControlUI* m_pEventKey;    //相应键盘事件控件指针
  183. //
  184. POINT m_ptLastMousePos;    //鼠标位置
  185. SIZE m_szMinWindow;        //窗口最小限制
  186. SIZE m_szMaxWindow;        //窗口最大限制
  187. SIZE m_szInitWindowSize;    //初始化窗口大小
  188. RECT m_rcSizeBox;        //托腮大小
  189. SIZE m_szRoundCorner;    //圆角大小
  190. RECT m_rcCaption;        //标题大小
  191. UINT m_uTimerID;        //计时器ID
  192. bool m_bFirstLayout;    //是否为第一层
  193. bool m_bUpdateNeeded;    //是否需要更新
  194. bool m_bFocusNeeded;    //是否需要焦点
  195. bool m_bOffscreenPaint;    //是否绘制m_hDcOffscreen
  196. bool m_bAlphaBackground;    //背景是否透明
  197. bool m_bMouseTracking;    //是否追踪鼠标
  198. bool m_bMouseCapture;    //是否捕获鼠标
  199. CStdPtrArray m_aNotifiers;    //Listener 列表
  200. CStdPtrArray m_aTimers;        //计时器列表
  201. CStdPtrArray m_aPreMessageFilters;    //预处理消息列表
  202. CStdPtrArray m_aMessageFilters;        //消息处理列表
  203. CStdPtrArray m_aPostPaintControls;    //PostPaint控件列表
  204. CStdPtrArray m_aDelayedCleanup;    //延迟释放控件列表
  205. CStdStringPtrMap m_mNameHash;    //控件名哈希列表
  206. CStdStringPtrMap m_mOptionGroup;    //选项组列表
  207. CPaintManagerUI* m_pParentResourcePM;    //当前绘制管理者的上一层绘制管理者(父绘制管理者)
  208. DWORD m_dwDefalutDisabledColor;    //默认非可用状态字体颜色
  209. DWORD m_dwDefalutFontColor;    //默认字体颜色
  210. DWORD m_dwDefalutLinkFontColor;    //默认链接颜色
  211. DWORD m_dwDefalutLinkHoverFontColor;    //默认鼠标漂浮时字体颜色
  212. DWORD m_dwDefalutSelectedBkColor;    //默认被选择后背景颜色
  213. TFontInfo m_DefaultFontInfo;    //默认字体信息
  214. CStdPtrArray m_aCustomFonts;    //字体列表
  215. CStdStringPtrMap m_mImageHash;    //图片资源名哈希表
  216. CStdStringPtrMap m_DefaultAttrHash;    //默认属性哈希表
  217. static HINSTANCE m_hInstance;    //应用程序对象实例句柄
  218. static HINSTANCE m_hResourceInstance;    //资源对象实例句柄
  219. static CStdString m_pStrResourcePath;    //资源路径
  220. static CStdString m_pStrResourceZip;    //zip包资源名称
  221. static CStdPtrArray m_aPreMessages;    //预处理消息队列

10 class UIMarkup -  解析XML

  1. CMarkup()
  2. 功能 - 构造函数
  3. pstrXML - xml数据
  4. 实现 -
  5. 初始化成员变量
  6. 调用Load()
  7. ~CMarkup()
  8. 功能 - 析构函数
  9. Load()
  10. 功能 - 加载xml数据
  11. pstrXML - xml数据
  12. LoadFromMem()
  13. 功能 - 从内存中加载xml数据
  14. pByte - 内存数据指针
  15. dwSize - 大小
  16. encoding - 编码方式 XMLFILE_ENCODING_UTF8(默认) XMLFILE_ENCODING_UNICODE XMLFILE_ENCODING_ASNI
  17. 实现 -
  18. 进行编码转换
  19. 申请控件
  20. 复制数据
  21. LoadFromFile()
  22. 功能 - 从文件中加载xml数据
  23. pstrFilename - 文件名
  24. encoding - 编码方式
  25. 实现 -
  26. 判断资源类型是否为zip包,如果为zip包则进行解压
  27. 调用LoadFromMem()
  28. Release() - 释放xml数据和元素信息数据
  29. IsValid() - Markup是否有效
  30. SetPreserveWhitespace() - 设置是否保存空白行
  31. GetLastErrorMessage()
  32. 功能 - 得到错误信息
  33. pstrMessage - [out]错误信息内容
  34. cchMax - 信息长度
  35. GetLastErrorLocation
  36. 功能 - 得到出错位置
  37. pstrSource - 错误所在位置内容
  38. cchMax - 内容长度
  39. GetRoot() - 得到根节点
  40. rivate:
  41. tagXMLELEMENT    //元素结构
  42. {
  43. ULONG iStart;    //在m_pstrXML中起始位置
  44. ULONG iChild;    //子标签在m_pstrXML中的位置
  45. ULONG iNext;    //同级下一个标签在m_pstrXML中的位置
  46. ULONG iParent;    //上一级标签在m_pstrXML中的位置
  47. ULONG iData;    //元素数据在m_pstrXML中的位置
  48. } XMLELEMENT;
  49. LPTSTR m_pstrXML;    //xml数据
  50. XMLELEMENT* m_pElements;    //元素列表
  51. ULONG m_nElements;    //元素数量
  52. ULONG m_nReservedElements;    //存储元素空间
  53. TCHAR m_szErrorMsg[100];    //错误消息
  54. TCHAR m_szErrorXML[50];        //错误内容
  55. bool m_bPreserveWhitespace;    //是否过滤空白
  56. 解析xml数据
  57. bool _Parse();
  58. bool _Parse(LPTSTR& pstrText, ULONG iParent);
  59. 实现 -
  60. for(;;)
  61. {
  62. 如果为顶层则返回
  63. 填充element
  64. 解析名字
  65. 解析属性
  66. 标签闭合方式
  67. 如果为/>则continue
  68. 如果为>则递归调用_Parse()
  69. 如果为该标签的对应闭合标签 continue
  70. }
  71. XMLELEMENT* _ReserveElement(); - 申请保存元素空间
  72. 跳过空白
  73. inline void _SkipWhitespace(LPTSTR& pstr) const;
  74. inline void _SkipWhitespace(LPCTSTR& pstr) const;
  75. 跳过标识符
  76. inline void _SkipIdentifier(LPTSTR& pstr) const;
  77. inline void _SkipIdentifier(LPCTSTR& pstr) const;
  78. bool _ParseData(LPTSTR& pstrText, LPTSTR& pstrData, char cEnd);
  79. 功能 - 解析数据
  80. pstrText - 被解析的数据字符串
  81. pstrData - 解析后的数据字符串
  82. cEnd - 终止字符
  83. 解析转义字符
  84. void _ParseMetaChar(LPTSTR& pstrText, LPTSTR& pstrDest);
  85. 解析属性
  86. bool _ParseAttributes(LPTSTR& pstrText);
  87. 记录错误信息返回错误
  88. bool _Failed(LPCTSTR pstrError, LPCTSTR pstrLocation = NULL);

11 class CMarkupNode
    CMarkupNode
11 class CMarkupNode

  1. CMarkupNode() - 构造函数 构造一个空节点
  2. CMarkupNode(CMarkup* pOwner, int iPos)
  3. 功能 - 构造函数
  4. pOwner - CMarkup指针
  5. iPos - 在xml数据中的位置
  6. IsValid() - 节点对象是否有效
  7. GetParent() - 得到父节点
  8. GetSibling() - 得到兄弟节点
  9. GetChild() - 得到子节点
  10. GetChild(LPCTSTR pstrName)
  11. 功能 - 按名字得到子节点
  12. 实现 - 循环查找所有子节点,直到名字匹配
  13. HasSiblings() - 是否有兄弟节点
  14. HasChildren() - 是否有子节点
  15. GetName() - 得到节点对应的标签名
  16. GetValue() - 得到节点对应的标签数据值
  17. HasAttributes() - 是否有属性
  18. HasAttribute(LPCTSTR pstrName) - 是否有名为pstrName的属性
  19. GetAttributeCount() - 得到节点属性的数量
  20. GetAttributeName(int iIndex) - 按序号得到属性名称
  21. bool GetAttributeValue(int iIndex, LPTSTR pstrValue, SIZE_T cchMax)
  22. 功能 - 得到属性
  23. iIndex - 属性序号
  24. pstrValue - [out] 属性值字符串
  25. cchMax - 属性值字符串长度
  26. bool GetAttributeValue(LPCTSTR pstrName, LPTSTR pstrValue, SIZE_T cchMax)
  27. 功能 - 得到属性
  28. pstrName - 属性名
  29. pstrValue - [out] 属性值字符串
  30. cchMax - 属性值字符串长度
  31. _MapAttributes() - 解析xml属性建立 属性名和值的表映射到xml数据的位置
  32. enum { MAX_XML_ATTRIBUTES = 64 };        //属性最大数量限制
  33. typedef struct
  34. {
  35. ULONG iName;
  36. ULONG iValue;
  37. } XMLATTRIBUTE;        //属性结构
  38. int m_iPos;        //节点在xml数据中的位置
  39. int m_nAttributes;        //属性数量
  40. XMLATTRIBUTE m_aAttributes[MAX_XML_ATTRIBUTES];        //属性-值 映射xml位置 列表
  41. CMarkup* m_pOwner;        - CMarkup指针

12 class IDialogBuilderCallback - 构建UI时回调类 用于创造用户自定义的控件

  1. virtual CControlUI* CreateControl(LPCTSTR pstrClass) = 0 - 创建用户自定义控件, pstrClass控件名

13 class CDialogBuilder - 构建UI

  1. CControlUI* Create();
  2. 功能 - 构建UI
  3. STRINGorID xml - 可以是一个内存xml数据或一个文件名
  4. STRINGorID type = (UINT) 0 - 如果xml数据位于EXE资源中则type指定资源类型
  5. IDialogBuilderCallback* pCallback = NULL - 回调函数
  6. CPaintManagerUI* pManager = NULL - 绘制管理者指针
  7. 实现 -
  8. 判断xml类型
  9. 加载xml数据
  10. 调用Create(pCallback, pManager)构建
  11. CControlUI* Create(IDialogBuilderCallback* pCallback = NULL, CPaintManagerUI* pManager = NULL);
  12. 功能 - 构建UI
  13. 实现 -
  14. 得到顶层Window标签,并解析属性
  15. 调用_Parse() 解析xml
  16. void GetLastErrorMessage(LPTSTR pstrMessage, SIZE_T cchMax) const; - 错误信息
  17. void GetLastErrorLocation(LPTSTR pstrSource, SIZE_T cchMax) const; - 出错位置
  18. CControlUI* _Parse(CMarkupNode* parent, CControlUI* pParent = NULL, CPaintManagerUI* pManager = NULL);
  19. 实现 -
  20. for(循环顶级标签)
  21. {
  22. 按xml标签创建控件对象
  23. 如果不是标准控件则调用m_pCallback->CreateControl()创建用户自定义控件对象
  24. 如果有子节点则递归调用_Parse()
  25. 因为某些属性和父窗口相关,比如selected,必须先Add到父窗口
  26. 初始化控件默认属性
  27. 根据xml数据解析处理控件属性
  28. }
  29. CMarkup m_xml; //CMarkup对象
  30. IDialogBuilderCallback* m_pCallback;//构建控件回调

14 class CControlUI 控件

    1. GetName() - 得到控件名称 名称为控件的唯一ID
    2. SetName() - 设置控件名称
    3. GetInterface() - 得到控件指针
    4. GetClass() - 得到控件类名
    5. GetControlFlags() - 得到控件类型标志
    6. Activate() - 控件是否活跃 (非不可用状态,非不可见状态)
    7. GetManager() - 得到绘制管理者
    8. SetMananer()
    9. 功能 - 设置控件的绘制管理者
    10. 实现 -
    11. 设置控件管理者
    12. 初始化
    13. GetParent() - 得到父控件
    14. GetText() - 得到控件显示内容
    15. SetText() - 设置控件显示内容
    16. GetBkColor() - 得到背景色
    17. GetBkColor2() - 得到背景色2
    18. SetBkColor2() - 设置背景色2
    19. GetBkColor3() - 得到背景色3
    20. SetBkColor3() - 设置背景色3
    21. * 背景色1,2,3用于渐变色 颜色渐变过程为1->2->3
    22. GetBkImage() - 得到背景图片
    23. SetBkImage() - 设置背景图片
    24. GetBorderColor() - 得到边的颜色
    25. SetBorderColor() - 设置边的颜色
    26. GetFocusBorderColor() - 设置获得焦点时边的颜色
    27. GetBorderSize() - 得到边的宽度
    28. SetBorderSize() - 设置边的宽度
    29. GetBorderRound() - 得到圆角
    30. SetBorderRound() - 设置圆角
    31. DrawImage() - 绘制图片
    32. GetPos() - 得到控件位置
    33. SetPos() - 设置控件位置并重绘
    34. GetWidth() - 得到控件宽度
    35. GetHeight() - 得到控件高度
    36. GetX() - 得到控件横坐标位置(左上点横坐标)
    37. GetY() - 得到控件纵坐标位置(左上点纵坐标)
    38. GetPadding() - 设置外边距,由上层窗口绘制(求周围控件离它远点或近点(负值,不过受绘制顺序影响,比较少用)
    39. SetPadding() - 设置外边距,由上层窗口绘制
    40. GetFixedXY() - 实际大小位置使用GetPos获取,这里得到的是预设的参考值
    41. SetFixedXY() - 仅float为true时有效
    42. GetFixedWidth() - 实际大小位置使用GetPos获取,这里得到的是预设的参考值
    43. SetFixedWidth() - 预设的参考值
    44. GetFixedHeight() - 实际大小位置使用GetPos获取,这里得到的是预设的参考值
    45. SetFixedHeight() - 预设的参考值
    46. 设置大小的限制值
    47. GetMinWidth()
    48. SetMinWidth()
    49. GetMaxWidth()
    50. SetMaxWidth()
    51. GetMinHeight()
    52. SetMinHeight()
    53. GetMaxHeight()
    54. SetMaxHeight()
    55. SetRelativePos() - 设置相对位置比例
    56. SetRelativeParentSize() - 设置父控件大小
    57. GetRelativePos() - 得到相对位置比例
    58. IsRelativePos() -是使用相对位置
    59. 获取/设置 提示信息
    60. GetToolTip()
    61. SetToolTip()
    62. 获取/设置 快捷键
    63. GetShortcut()
    64. SetShortcut()
    65. 获取/设置 上下文菜单是否被使用
    66. IsContextMenuUsed()
    67. 获取/设置 用户数据(字符串)
    68. GetUserData()
    69. SetUserData()
    70. 获取/设置 用户指针
    71. GetTag()
    72. SetTag()
    73. 获取/设置 控件是否可见
    74. IsVisible()
    75. SetVisible()
    76. SetInternVisible() // 仅供内部调用,有些UI拥有窗口句柄,需要重写此函数
    77. 有窗口句柄的UI在设置不可见时,需要先失去焦点

http://blog.csdn.net/daoqin121/article/details/26234181

duilib之源码分析的更多相关文章

  1. Duilib源码分析(六)整体流程

    在<Duilib源码分析(一)整体框架>.<Duilib源码分析(二)控件构造器—CDialogBuilder>以及<Duilib源码分析(三)XML解析器—CMarku ...

  2. Duilib源码分析(三)XML解析器—CMarkup

    上一节介绍了控件构造器CDialogBuilder,接下来将分析其XML解析器CMarkup: CMarkup:xml解析器,目前内置支持三种编码格式:UTF8.UNICODE.ASNI,默认为UTF ...

  3. Duilib源码分析(一)整体框架

    Duilib界面库是一款由杭州月牙儿网络技术有限公司开发的界面开源库,以viksoe项目下的UiLib库的基础上开发(此后也将对UiLib库进行源码分析):通过XML布局界面,将用户界面和处理逻辑彻底 ...

  4. TeamTalk源码分析(十一) —— pc客户端源码分析

           --写在前面的话  在要不要写这篇文章的纠结中挣扎了好久,就我个人而已,我接触windows编程,已经六七个年头了,尤其是在我读研的三年内,基本心思都是花在学习和研究windows程序上 ...

  5. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  6. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  7. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  8. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  9. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

随机推荐

  1. 面向对象之静态方法(static)和实例化方法的区别

    这是一个经常被时时提出来的问题,很多时候我们以为理解了.懂了,但深究一下,我们却发现并不懂. 方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简 ...

  2. 通过OC实现简单的冒泡排序

    NSMutableArray *arr = [@["] mutableCopy]; ; i<[arr count]-; i++) { ; j<[arr count]--i; j+ ...

  3. php怎样求一个数组中最长的

    <?php $arr = array( 0 => 'd', 1 => '68b3', 2 => 'a86', 3 => 'c9aa97b23b71d5c', 4 => ...

  4. /etc/group文件详解

    Linux /etc/group文件与/etc/passwd和/etc/shadow文件都是有关于系统管理员对用户和用户组管理时相关的文件.linux /etc/group文件是有关于系统管理员对用户 ...

  5. 字节流复制mp3文件(带缓冲区)

    //自定义的缓冲区 import java.io.*; class  MyBufferedInputStream{    private byte[] buf = new byte[1024]; pr ...

  6. NGUI 按钮音效问题

    昨天给NGUI的按钮添加音效时,刚开始是自己新建空对象绑定声音的,后来发现NGUI按钮携带button sound组件,直接将音效拖入即可,不用写一行代码,非常简单.但是后来发现添加相同的音效有的按钮 ...

  7. eclipse没有New Java Class的解决办法

    配置之前的截图: 配置步骤:

  8. php随笔7-thinkphp OA系统 JS 文本框输入实时控制字数

    JS: //多行文本输入框剩余字数计算 function checkMaxInput(obj, maxLen) { if (obj == null || obj == undefined || obj ...

  9. QT学习 之 QwtPlot(数学绘图)

    QT对于统计图像.函数图像等的绘制是没有相关组件的帮助的,只有利用手工绘制图片. QwtPlot是用来绘制二维图像的widget,继承自QFrame 和 QwtPlotDict.不过严格的说来,它只是 ...

  10. BZOJ 3196

    program bzoj3196; ; maxn=; maxm=; var n,m,time,temp:longint; root,a:..maxn] of longint; left,right,r ...