zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    设计模式之原型模式
    【转载】 吵翻了!这张图里到底是人还是狗?心理学家这样说
    【转载】 DeepMind 提出元梯度强化学习算法,显著提高大规模深度强化学习应用的性能
    ubuntu18.04 安装wine64出现错误: X 64-bit development files not found.
    ubuntu18.04 源码方式安装wine , 警告,libxrender 64-bit development files not found, XRender won't be supported.
    【转载】 信息如何像零食、金钱一样掌控你的大脑
    图像处理算法 之 滤波 模糊(基于OpenCV)
    图像处理之FPN校正
    ISP-黑电平校正(BLC)
    ISP基础(0y):图像传感器
  • 原文地址:https://www.cnblogs.com/findumars/p/5176678.html
Copyright © 2011-2022 走看看