duilib之源码分析

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

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



2 UIBase

[cpp] view plain copy
 
  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

[cpp] view plain copy
 
  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.   
  17.    [more than] stb_image.c line 100 - 130  
  18.      stbi_image_free()  
  19.    功能 - 释放已加载的图片数据  



4 the 3rd part XUnzip

[cpp] view plain copy
 
  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

[cpp] view plain copy
 
  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

[cpp] view plain copy
 
  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

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




10 class UIMarkup -  解析XML
   

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



11 class CMarkupNode
    CMarkupNode
11 class CMarkupNode
      

[cpp] view plain copy
 
  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.   
  32.       _MapAttributes() - 解析xml属性建立 属性名和值的表映射到xml数据的位置  
  33.   
  34.   enum { MAX_XML_ATTRIBUTES = 64 };        //属性最大数量限制  
  35.   
  36.   typedef struct  
  37.   {  
  38.       ULONG iName;  
  39.       ULONG iValue;  
  40.   } XMLATTRIBUTE;        //属性结构  
  41.   
  42.   int m_iPos;        //节点在xml数据中的位置  
  43.   int m_nAttributes;        //属性数量  
  44.   XMLATTRIBUTE m_aAttributes[MAX_XML_ATTRIBUTES];        //属性-值 映射xml位置 列表  
  45.   CMarkup* m_pOwner;        - CMarkup指针  



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

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


13 class CDialogBuilder - 构建UI
   

[cpp] view plain copy
 
  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.   
  19.   CControlUI* _Parse(CMarkupNode* parent, CControlUI* pParent = NULL, CPaintManagerUI* pManager = NULL);  
  20.       实现 -  
  21.         for(循环顶级标签)   
  22.         {  
  23.             按xml标签创建控件对象  
  24.                 如果不是标准控件则调用m_pCallback->CreateControl()创建用户自定义控件对象  
  25.                 如果有子节点则递归调用_Parse()  
  26.                 因为某些属性和父窗口相关,比如selected,必须先Add到父窗口  
  27.                 初始化控件默认属性  
  28.                 根据xml数据解析处理控件属性  
  29.        }  
  30.  CMarkup m_xml; //CMarkup对象  
  31.  IDialogBuilderCallback* m_pCallback;//构建控件回调  



14 class CControlUI 控件
   

[cpp] view plain copy
 
    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

原文地址:https://www.cnblogs.com/findumars/p/5176678.html