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

  • 相关阅读:
    leetcode 86. Partition List
    leetcode 303. Range Sum Query
    leetcode 1310. XOR Queries of a Subarray
    leetcode 1309. Decrypt String from Alphabet to Integer Mapping
    leetcode 215. Kth Largest Element in an Array
    将numpy.ndarray写入excel
    leetcode 1021 Remove Outermost Parentheses
    leetcode 1306. Jump Game III
    leetcode 1305. All Elements in Two Binary Search Trees
    ICCV2019 oral:Wavelet Domain Style Transfer for an Effective Perception-distortion Tradeoff in Single Image Super-Resolution
  • 原文地址:https://www.cnblogs.com/findumars/p/5176678.html
Copyright © 2011-2022 走看看