duilib之源码分析

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

《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(LPCTSTRpstrFormat,...)
  4. 功能-调试信息
  5. 参考-参考printf
  6. *TRACEMSG(UINTuMsg)
  7. 功能-将windows消息转化成其对应的宏名
  8. uMsg-Windows消息ID
  9. 返回值-宏名(字符串)
  10. *classSTRINGorID
  11. 功能-统一资源ID,字符串类型和整型统一输出为字符串类型
  12. *classCPoint
  13. 描述-点
  14. 函数-
  15. CPoint(LPARAMlParam)//将消息中lParam转化成点
  16. *classCSize
  17. 描述-矩形的宽和高
  18. *classCRect
  19. 描述-矩形区域
  20. 函数-
  21. voidEmpty()//设置left,right,top,bottom为零
  22. voidJoin(constRECT&rc)//合并两个矩形产生一个包含两个矩形的新的矩形
  23. voidResetOffset()//将矩形移动到left=0,top=0的位置
  24. voidNormalize()//调整left,right,top,bottom使之left<righttop<bottom
  25. voidOffset(intcx,intcy)//移动矩形,cx横向移动距离,cy纵向移动距离
  26. voidInflate(intcx,intcy)//放大矩形,cx左右各放大的大小,cy上下各放大的大小
  27. voidDeflate(intcx,intcy)//缩小矩形,cx左右各缩小的大小,cy上下各缩小的大小
  28. voidUnion(CRect&rc)//合并矩形,与Join()函数功能几乎一致,但对空矩形处理不同
  29. *classCStdPtrArray
  30. 变量-
  31. m_nAllocated//已申请空间大小(可储存Ptr的数量),如果空间不足则去reallocm_nAllocated*2的空间
  32. *classCStdString
  33. 实现-如果长度小于MAX_LOCAL_STRING_LEN(63)则在栈上分配,否则在堆上分配
  34. 函数-
  35. voidAssign(LPCTSTRpstr,intnLength=-1)//分配
  36. *classCStdStringMap
  37. 描述-字符串map
  38. 实现-使用times33哈希算法
  39. *classCWindowWnd
  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,//onlyusedforreq_comp
  12. STBI_grey=1,
  13. STBI_grey_alpha=2,
  14. STBI_rgb=3,
  15. STBI_rgb_alpha=4
  16. [morethan]stb_image.cline100-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)区别从资源中或文件中加载MAKEINTRESOURCEThereturnvalueisthespecifiedvalueinthelow-orderwordandzerointhehigh-orderword.(frommsdn)]
  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. 1CreateCompatibleDC(创建内存设备句柄)
  28. 2SelectObject()(将位图选入内存设备句柄)
  29. 3AlphaBlend(alpha混合)
  30. 4BitBlt()orStretchBlt()(绘制到内存设备句柄)
  31. 5SelectObject()(将老的位图选入内存设备句柄)
  32. 6DeleteDC(释放内存设备句柄)
  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. 2alpha混合
  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()FormatFlags
  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()-InvalidateRectAPI的封装
  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. DWORDGetCustomFontCount()-得到字体列表中项数量
  77. HFONTAddFont(LPCTSTRpStrFontName,intnSize,boolbBold,boolbUnderline,boolbItalic)-加入一种字体到字体列表中
  78. HFONTAddFontAt(intindex,LPCTSTRpStrFontName,intnSize,boolbBold,boolbUnderline,boolbItalic)-加入一种字体到字体列表的指定位置
  79. HFONTGetFont(intindex)-按序号得到字体列表中的字体
  80. HFONTGetFont(LPCTSTRpStrFontName,intnSize,boolbBold,boolbUnderline,boolbItalic)-按字体属性得到字体列表中的字体
  81. boolFindFont(HFONThFont)-按句柄查找字体列表中的一项
  82. boolFindFont(LPCTSTRpStrFontName,intnSize,boolbBold,boolbUnderline,boolbItalic)-按属性查找字体列表中的一项
  83. boolRemoveFont(HFONThFont)-按句柄移除字体列表中的指定项
  84. boolRemoveFontAt(intindex)-按序号移除字体列表中的指定项
  85. voidRemoveAllFonts()-移除字体列表中的所有项
  86. TFontInfo*GetFontInfo(intindex)-按序号得到字体列表中项的属性
  87. TFontInfo*GetFontInfo(HFONThFont)-按句柄得到字体列表中项的属性
  88. 图片列表操作
  89. constTImageInfo*GetImage(LPCTSTRbitmap);
  90. constTImageInfo*GetImageEx(LPCTSTRbitmap,LPCTSTRtype=NULL,DWORDmask=0);
  91. constTImageInfo*AddImage(LPCTSTRbitmap,LPCTSTRtype=NULL,DWORDmask=0);
  92. boolRemoveImage(LPCTSTRbitmap);
  93. voidRemoveAllImages();
  94. 默认属性列表操作
  95. voidAddDefaultAttributeList(LPCTSTRpStrControlName,LPCTSTRpStrControlAttrList);
  96. LPCTSTRGetDefaultAttributeList(LPCTSTRpStrControlName)const;
  97. boolRemoveDefaultAttributeList(LPCTSTRpStrControlName);
  98. constCStdStringPtrMap&GetDefaultAttribultes()const;
  99. voidRemoveAllDefaultAttributeList();
  100. 将控件树附加到当前绘制管理者
  101. boolAttachDialog(CControlUI*pControl);
  102. 初始化控件把控件名称加入到绘制管理者的控件名map中
  103. boolInitControls(CControlUI*pControl,CControlUI*pParent=NULL);
  104. 重置控件
  105. voidReapObjects(CControlUI*pControl);
  106. 选项组操作
  107. boolAddOptionGroup(LPCTSTRpStrGroupName,CControlUI*pControl);-添加选项组
  108. CStdPtrArray*GetOptionGroup(LPCTSTRpStrGroupName);-通过名称得到选项组
  109. voidRemoveOptionGroup(LPCTSTRpStrGroupName,CControlUI*pControl);-移除选项组
  110. voidRemoveAllOptionGroups();-移除所有选项组
  111. 得到控件焦点
  112. CControlUI*GetFocus()const;
  113. 控件获得焦点
  114. voidSetFocus(CControlUI*pControl);
  115. 得到标签页控件
  116. boolSetNextTabControl(boolbForward=true);
  117. 定时器操作
  118. boolSetTimer(CControlUI*pControl,UINTnTimerID,UINTuElapse);-设置一个定时器
  119. boolKillTimer(CControlUI*pControl,UINTnTimerID);-清除一个定时器
  120. voidRemoveAllTimers();-清楚所有定时器
  121. 捕获鼠标
  122. voidSetCapture();
  123. 释放捕获鼠标
  124. voidReleaseCapture();
  125. 鼠标是否被捕获
  126. boolIsCaptured();
  127. boolAddNotifier(INotifyUI*pControl);-加入一个Listener
  128. boolRemoveNotifier(INotifyUI*pControl);-移除一个Listener
  129. voidSendNotify(TNotifyUI&Msg);-发送一个Notify消息
  130. voidSendNotify(CControlUI*pControl,LPCTSTRpstrMessage,WPARAMwParam=0,LPARAMlParam=0);-发送一个Notify消息
  131. boolAddPreMessageFilter(IMessageFilterUI*pFilter);-加入一个预处理MessageFilter
  132. boolRemovePreMessageFilter(IMessageFilterUI*pFilter);-移除一个预处理MessageFilter
  133. boolAddMessageFilter(IMessageFilterUI*pFilter);-加入一个MessageFilter
  134. boolRemoveMessageFilter(IMessageFilterUI*pFilter);-移除一个MessageFilter
  135. PostPaint控件操作
  136. intGetPostPaintCount()const;-得到PostPaint控件数量
  137. boolAddPostPaint(CControlUI*pControl);-加入PostPaint控件
  138. boolRemovePostPaint(CControlUI*pControl);-移除一个PostPaint控件
  139. boolSetPostPaintIndex(CControlUI*pControl,intiIndex);-设置控件到指定的序列位置
  140. 加入控件到延迟处理列表当中
  141. voidAddDelayedCleanup(CControlUI*pControl);
  142. 得到根控件
  143. CControlUI*GetRoot()const;
  144. 按照位置找到控件
  145. CControlUI*FindControl(POINTpt)const;
  146. 按父窗口和位置查找控件
  147. CControlUI*FindControl(CControlUI*pParent,POINTpt)const;
  148. 按名字查找控件
  149. CControlUI*FindControl(LPCTSTRpstrName);
  150. 按父窗口和名字查找控件
  151. CControlUI*FindControl(CControlUI*pParent,LPCTSTRpstrName);
  152. 消息循环
  153. staticvoidMessageLoop();
  154. 消息处理
  155. staticboolTranslateMessage(constLPMSGpMsg);
  156. 消息处理
  157. boolMessageHandler(UINTuMsg,WPARAMwParam,LPARAMlParam,LRESULT&lRes);
  158. 消息预处理
  159. boolPreMessageHandler(UINTuMsg,WPARAMwParam,LPARAMlParam,LRESULT&lRes);
  160. 回调函数-比较属性(pData)与控件(pThis)的属性是否相同
  161. staticCControlUI*CALLBACK__FindControlFromNameHash(CControlUI*pThis,LPVOIDpData);-按名称查找控件的回调函数
  162. staticCControlUI*CALLBACK__FindControlFromCount(CControlUI*pThis,LPVOIDpData);-计算控件数目的回调函数
  163. staticCControlUI*CALLBACK__FindControlFromPoint(CControlUI*pThis,LPVOIDpData);-按位置查找控件的回调函数
  164. staticCControlUI*CALLBACK__FindControlFromTab(CControlUI*pThis,LPVOIDpData);-查找下一个相应tab的控件
  165. staticCControlUI*CALLBACK__FindControlFromShortcut(CControlUI*pThis,LPVOIDpData);-快捷方式对应的控件
  166. staticCControlUI*CALLBACK__FindControlFromUpdate(CControlUI*pThis,LPVOIDpData);-查找需要刷新的控件
  167. staticCControlUI*CALLBACK__FindControlFromNameByParent(CControlUI*pThis,LPVOIDpData);-查找子控件
  168. HWNDm_hWndPaint;//绘制窗口句柄
  169. HDCm_hDcPaint;//绘制DC
  170. HDCm_hDcOffscreen;//屏幕兼容DC
  171. HDCm_hDcBackground;//背景DC
  172. HBITMAPm_hbmpOffscreen;//屏幕DIB
  173. HBITMAPm_hbmpBackground;//背景DIB
  174. HWNDm_hwndTooltip;//提示窗口句柄
  175. TOOLINFOm_ToolTip;//提示结构
  176. boolm_bShowUpdateRect;//是否更新
  177. //
  178. CControlUI*m_pRoot;//根控件指针
  179. CControlUI*m_pFocus;//获得焦点控件指针
  180. CControlUI*m_pEventHover;//鼠标停留控件指针
  181. CControlUI*m_pEventClick;//点击事件控件指针
  182. CControlUI*m_pEventKey;//相应键盘事件控件指针
  183. //
  184. POINTm_ptLastMousePos;//鼠标位置
  185. SIZEm_szMinWindow;//窗口最小限制
  186. SIZEm_szMaxWindow;//窗口最大限制
  187. SIZEm_szInitWindowSize;//初始化窗口大小
  188. RECTm_rcSizeBox;//托腮大小
  189. SIZEm_szRoundCorner;//圆角大小
  190. RECTm_rcCaption;//标题大小
  191. UINTm_uTimerID;//计时器ID
  192. boolm_bFirstLayout;//是否为第一层
  193. boolm_bUpdateNeeded;//是否需要更新
  194. boolm_bFocusNeeded;//是否需要焦点
  195. boolm_bOffscreenPaint;//是否绘制m_hDcOffscreen
  196. boolm_bAlphaBackground;//背景是否透明
  197. boolm_bMouseTracking;//是否追踪鼠标
  198. boolm_bMouseCapture;//是否捕获鼠标
  199. CStdPtrArraym_aNotifiers;//Listener列表
  200. CStdPtrArraym_aTimers;//计时器列表
  201. CStdPtrArraym_aPreMessageFilters;//预处理消息列表
  202. CStdPtrArraym_aMessageFilters;//消息处理列表
  203. CStdPtrArraym_aPostPaintControls;//PostPaint控件列表
  204. CStdPtrArraym_aDelayedCleanup;//延迟释放控件列表
  205. CStdStringPtrMapm_mNameHash;//控件名哈希列表
  206. CStdStringPtrMapm_mOptionGroup;//选项组列表
  207. CPaintManagerUI*m_pParentResourcePM;//当前绘制管理者的上一层绘制管理者(父绘制管理者)
  208. DWORDm_dwDefalutDisabledColor;//默认非可用状态字体颜色
  209. DWORDm_dwDefalutFontColor;//默认字体颜色
  210. DWORDm_dwDefalutLinkFontColor;//默认链接颜色
  211. DWORDm_dwDefalutLinkHoverFontColor;//默认鼠标漂浮时字体颜色
  212. DWORDm_dwDefalutSelectedBkColor;//默认被选择后背景颜色
  213. TFontInfom_DefaultFontInfo;//默认字体信息
  214. CStdPtrArraym_aCustomFonts;//字体列表
  215. CStdStringPtrMapm_mImageHash;//图片资源名哈希表
  216. CStdStringPtrMapm_DefaultAttrHash;//默认属性哈希表
  217. staticHINSTANCEm_hInstance;//应用程序对象实例句柄
  218. staticHINSTANCEm_hResourceInstance;//资源对象实例句柄
  219. staticCStdStringm_pStrResourcePath;//资源路径
  220. staticCStdStringm_pStrResourceZip;//zip包资源名称
  221. staticCStdPtrArraym_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_UNICODEXMLFILE_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. ULONGiStart;//在m_pstrXML中起始位置
  44. ULONGiChild;//子标签在m_pstrXML中的位置
  45. ULONGiNext;//同级下一个标签在m_pstrXML中的位置
  46. ULONGiParent;//上一级标签在m_pstrXML中的位置
  47. ULONGiData;//元素数据在m_pstrXML中的位置
  48. }XMLELEMENT;
  49. LPTSTRm_pstrXML;//xml数据
  50. XMLELEMENT*m_pElements;//元素列表
  51. ULONGm_nElements;//元素数量
  52. ULONGm_nReservedElements;//存储元素空间
  53. TCHARm_szErrorMsg[100];//错误消息
  54. TCHARm_szErrorXML[50];//错误内容
  55. boolm_bPreserveWhitespace;//是否过滤空白
  56. 解析xml数据
  57. bool_Parse();
  58. bool_Parse(LPTSTR&pstrText,ULONGiParent);
  59. 实现-
  60. for(;;)
  61. {
  62. 如果为顶层则返回
  63. 填充element
  64. 解析名字
  65. 解析属性
  66. 标签闭合方式
  67. 如果为/>则continue
  68. 如果为>则递归调用_Parse()
  69. 如果为该标签的对应闭合标签continue
  70. }
  71. XMLELEMENT*_ReserveElement();-申请保存元素空间
  72. 跳过空白
  73. inlinevoid_SkipWhitespace(LPTSTR&pstr)const;
  74. inlinevoid_SkipWhitespace(LPCTSTR&pstr)const;
  75. 跳过标识符
  76. inlinevoid_SkipIdentifier(LPTSTR&pstr)const;
  77. inlinevoid_SkipIdentifier(LPCTSTR&pstr)const;
  78. bool_ParseData(LPTSTR&pstrText,LPTSTR&pstrData,charcEnd);
  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(LPCTSTRpstrError,LPCTSTRpstrLocation=NULL);

11 class CMarkupNode
CMarkupNode
11 class CMarkupNode

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

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

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

13 class CDialogBuilder - 构建UI

  1. CControlUI*Create();
  2. 功能-构建UI
  3. STRINGorIDxml-可以是一个内存xml数据或一个文件名
  4. STRINGorIDtype=(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. voidGetLastErrorMessage(LPTSTRpstrMessage,SIZE_TcchMax)const;-错误信息
  17. voidGetLastErrorLocation(LPTSTRpstrSource,SIZE_TcchMax)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. CMarkupm_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之源码分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SQLite事务管理强制重启Linux系统的几种方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

饿了么vue-cli3.0+cube-ui笔记

1、目录结构 模板文件是public里的index.html,运行项目的时候,会引用src/main.js(入口文件) 详细文档在这里:https://cli.vuejs.org/zh/config/#pwa public:放着html模板和静态资源,public/index.html文件是一个会被html-webpack-plugin处理的模板。在构建...

xml中xsd、xsi、xmlns的含义

Maven的pom.xml文件头信息如下:<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0...

Android内核开发:理解和掌握repo工具【转】

本文转载自:http://ticktick.blog.51cto.com/823160/1653304 由于Android源码是用repo工具来管理的,因此,搞Android内核开发,首先要搞清楚repo是什么东西,它该怎么使用?作为《Android内核开发》系列文章的第二篇,我们首先谈谈对repo工具的理解和使用。 1. repo是什么? repo是一种...

jenkins参数化配置,pom.xml配置

1、要实现Jenkins参数化构建,要先在代码里写好能接收该参数value的配置,在pom.xml文件里加配置,如下:   1)<properties></properties>里添加参数的key和value,通过本地执行时,可以直接从pom文件获取,或者从config.properitites获取   l  <propert...

关于JSON.parse(JSON.stringify(obj))实现深拷贝应该注意的坑

### 关于JSON.parse(JSON.stringify(obj))实现深拷贝应该注意的坑 JSON.parse(JSON.stringify(obj))我们一般用来深拷贝,其过程说白了 就是利用JSON.stringify 将js对象序列化(JSON字符串),再使用JSON.parse来反序列化(还原)js对象; 在使用的时候要注意几点 1.如果o...

MFC中UpdateData函数解析

当你使用了ClassWizard(类向导)建立了控件和变量之间的联系后: 当你修改了变量的值,而希望对话框控件更新显示,就应该在修改变量后调用 UpdateData(FALSE); 如果你希望知道用户在对话框中到底输入了什么,就应该在访问变量前调用UpdateData(TRUE)。 用处: 主要控制ddx_data 把控件中的值和变量进行交换。 比如你有个...