• 关于duilib的理解


    0 duilib文件(5/17)
      [x] stb_image.c
      [x] stdafx.h stdafx.cpp
      [ ] UIActiveX.h UIActiveX.cpp
      [x] UIBase.h UIBase.cpp
      [ ] UICombo.h UICombo.cpp
      [x] UICommonControls.h UICommonControls.cpp
      [ ] UIContainer.h UIContainer.cpp
      [x] UIControl.h UIControl.cpp
      [x] UIDelegate.h UIDelegate.cpp
      [x] UIDlgBuilder.h UIDlgBuilder.cpp
      [x] UIlib.h UIlib.cpp
      [ ] UIList.h UIList.cpp
      [x] UIManager.h UIManager.cpp
      [x] UIMarkup.h UIMarkup.cpp
      [x] UIRender.h UIRender.cpp
      [ ] UIRichEdit.h UIRichEdit.cpp
      [x] XUnzip.cpp
    1 stdAfx 预编译
      * int lengthof(x)    计算数组长度宏
      * MAX        两值最大
      * MIN        两值最小
      * CLAMP(x,a,b)    xa,b之间则取x否则取最小
      * winmm.lib Windows 多媒体相关应用程序接口库
      * comctl32.lib Windows 通用控件库
    2 UIBase
      * UI_WNDSTYLE_ 窗口风格属性
      * UI_CLASSSTYLE_ 窗口类属性
        /////<TODO:增加具体每项的解释>

      * ASSERT(expr) - 断言 同_ASSERTE(expr) 显示断言所在文件,行以及expr的内容

      * TRACE(LPCTSTR pstrFormat, ...)
        功能 调试信息
        参考 参考printf
      * TRACEMSG(UINT uMsg)
        功能 windows消息转化成其对应的宏名
        uMsg - Windows消息ID
        返回值 宏名(字符串)

      * class STRINGorID
        功能 统一资源ID, 字符串类型和整型统一输出为字符串类型

      * class CPoint
        描述 
        函数 -
          CPoint(LPARAM lParam)    //将消息中lParam转化成点

      * class CSize
        描述 矩形的宽和高

      * class CRect
        描述 矩形区域
        函数 -
          void Empty()    //设置left,right,top,bottom为零
          void Join(const RECT& rc)    //合并两个矩形产生一个包含两个矩形的新的矩形
          void ResetOffset()    //将矩形移动到left=0,top=0的位置
          void Normalize()    //调整left,right,top,bottom使之left < right top < bottom
          void Offset(int cx, int cy)    //移动矩形, cx 横向移动距离, cy 纵向移动距离
          void Inflate(int cx, int cy)    //放大矩形, cx左右各放大的大小, cy 上下各放大的大小
          void Deflate(int cx, int cy)    //缩小矩形, cx左右各缩小的大小, cy上下各缩小的大小
          void Union(CRect& rc)    //合并矩形Join()函数功能几乎一致但对空矩形处理不同

      * class CStdPtrArray
        变量 -
          m_nAllocated    //已申请空间大小(可储存Ptr的数量), 如果空间不足则去realloc m_nAllocated*2的空间

      * class CStdString    
        实现 如果长度小于MAX_LOCAL_STRING_LEN(63)则在栈上分配否则在堆上分配
        函数 -
          void Assign(LPCTSTR pstr, int nLength = -1)    //分配

      * class CStdStringMap
        描述 字符串map
        实现 使用times33哈希算法

      * class CWindowWnd
        函数 -
          RegisterWindowClass()    //RegisterClass的封装
          RegisterSuperclass()    //超类化窗口
          Subclass()    //子类化窗口
          ShowModal()    //窗口模态化
          ?MessageBox()    //?UIBase.cpp utf8
          __WndProc()    //消息处理函数
          __ControlProc()    //超类化消息处理函数
       实现 -
         duilib消息处理机制
         1 创建 通过CreateEx最后一个参数传递类指针this, 在消息处理函数中对WM_NCCREATE消息进行处理通过SetWindowLongPtr(GWLP_USERDATA)进行保存
         2 消息处理 在消息处理函数通过GetWindowLongPtr(GWLP_USERDATA)得到其类指针调用虚函数HandleMessage()相应其他消息。
         3 销毁 消息处理函数中对WM_NCDESTROY消息进行处理调用原消息处理函数重置(GWLP_USERDATA), 调用虚函数OnFinalMessage()做最后处理。
    ============update 2011 06 07 =====================
    3 the 3rd part stb_image
      * 描述 载入各种图片格式文件
      * 函数 -
        stbi_load_from_memory()
          功能 加载图片
          buffer - 内存数据
          len - 数据大小,
          x - [out]图像宽度(像素)
          y - [out]图像高度(像素)
          comp - [out]图像数据组成结果
          req_comp - 图像数据组成
            STBI_default = 0, // only used for req_comp
            STBI_grey       = 1,
            STBI_grey_alpha = 2,
            STBI_rgb        = 3,
            STBI_rgb_alpha  = 4
        
            [more than] stb_image.c line 100 - 130
          stbi_image_free()
          功能 释放已加载的图片数据
    4 the 3rd part XUnzip
    描述 解压zip
    函数 -
         OpenZip
          功能 打开一个zip
          z - 内存地址文件名文件句柄
          len - 长度
          flag - 标识(ZIP_HANDLE=1, ZIP_FILENAME=2, ZIP_MEMORY=3)
          return - HZIP
         CloseZip
           功能 关闭一个zip
             hz - HZIP
         GetZipItem
           功能 zip包中获取一项
           hz - HZIP
           index - 序号
           ze - zip入口点结构
         FindZipItem
           功能 zip包中查找项
           hz - HZIP
           name - 项名
           ic - 大小写敏感 CASE_INSENSITIVE=1, CASE_SENSITIVE=2
           index - [out]序号
           ze - zip入口点结构
         UnzipItem
           功能 解压项
           hz - HZIP
           dst - [out]解压后存储位置
           len - 储存长度
           flags - 标识(ZIP_HANDLE=1, ZIP_FILENAME=2, ZIP_MEMORY=3)
    5 class CRenderClip
      * 描述 渲染区域控制,设置在dc上绘制的区域,防止子控件绘制到父控件外侧(float属性控件除外)
      * 实现 -
      * 函数 -
        GenerateClip()    //产生一个剪切区域, hDC窗口句柄, rc区域, clip[out]剪切区
        GenerateRoundClip()    //产生一个圆角剪切区域, hDC窗口句柄, rc区域, width 横向圆角弧度, height纵向圆角弧度, clip[out]剪切区
        UseOldClipBegin()    //使用整个活跃区域作为剪切区, hDC窗口句柄, clip剪切区
        UseOldClipEnd()    //使用当前控件有效区域作为剪切区, hDC窗口句柄, clip剪切区
    ============update 2011 06 15 =====================
    6 class CRenderEngine
      * 渲染引擎
      * 函数 -
        LoadImage()
          功能 加载图像
          bitmap - 图像
          type - 类型
          mask - 隐蔽色
          实现 -
            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))
            2 创建DIB
            3 通过stbi_load_from_memory加载数据文件并转化后复制到DIB
            4 返回TImageInfo结构
        DrawImage()
          功能 绘制图像
          hDC - 设备句柄
          hBitmap - 位图句柄
          rc - 对象区域
          rcPaint - 绘制区域
          rcBmpPart - 位图区域
          rcConrners - 拉伸区域
          alphaChannel - alpha通道
          uFade - 透明度
          hole - 居中
          xtiled - 横向平铺
          ytiled - 纵向平铺
          实现 -
            1 CreateCompatibleDC (创建内存设备句柄)
            2 SelectObject() (将位图选入内存设备句柄)
            3 AlphaBlend (alpha混合)
            4 BitBlt() or StretchBlt() (绘制到内存设备句柄)
            5 SelectObject() (将老的位图选入内存设备句柄)
            6 DeleteDC (释放内存设备句柄)
        DrawImageString()
          功能 按标识字符串绘制图像
          hDC - 设备句柄
          pManager - 绘制管理者
          rc - 对象区域
          rcPaint - 绘制区域
          pStrImage - 标识字符串
          pStrModify - 标识字符串
          实现 -
            1 分析标识字符串获取属性
              1.1 先分析pStrImage信息后再分析pStrModify的信息
            2 获取图像数据
            3 绘制图像
        DrawColor()
          功能 绘制矩形
          hDC - 设备句柄
          rc - 对象区域
          color - 颜色(alpha, r, g, b)
          实现 -
            如果不需要alpha混合则SetBkColor() ExtTextOut()
            否则 创建一个像素大小的32DIB
        DrawGradient()
          功能 绘制渐变
          hDC - 设备句柄
          rc - 对象区域
          dwFirst - 颜色1
          dwSecond - 颜色2
          bVertical - 渐变方向 true垂直 false水平
          nSteps - 步长 [使用GradientFill() API时无效]
          实现 -
            1 渐变填充
            2 alpha混合
        DrawLine() - 绘制直线
        DrawRect() - 绘制矩形
        DrawRoundRect() - 绘制圆角矩形
        DrawText() - 绘制文字
        DrawHtmlText()
          功能 绘制 "mini-html" 标识字符串
          hDC - 设备句柄
          pManager - 绘制管理者
          rc - 对象区域
          pstrText -  "mini-html" 标识字符串
          dwTextColor - 字符串类型
          pLinks - 产生链接效果的区域组
          sLinks - 产生链接效果的区域组数量
          nLinkRects - 产生链接效果的区域组数量
          uStyle - 类型,同DrawText() Format Flags
        GenerateBitmap()
          功能 产生一个BMP位图
          pManager - 绘制管理者
          pControl - 控件句柄
          rc - 对象区域
          返回 - BMP句柄
        
    ===============update 2011-06-16
    7 class INotifyUI - Listener interface
    8 class IMessageFilterUI - MessageFilter interface
    9 class CPaintManagerUI
      * 绘制管理者
      * 函数
        Init() - 初始化
        NeedUpdate() -
        Invalidate() - InvalidateRect API的封装
        GetPaintDC() - 设备句柄相关函数
        GetPaintWindow() - 得到窗口句柄
        GetTooltipWindow() - 得到提示窗口句柄
        GetMousePos() - 得到鼠标位置
        GetClientSize() - 得到客户端区域大小
        获取/设置 窗口初始化时大小
          GetInitSize()
          SetInitSize()
        获取/设置 托腮大小
          GetSizeBox()
          SetSizeBox()
        获取/设置 标题区域大小
          GetCaptionRect()
          SetCaptionRect()
        获取/设置 圆角大小
          GetRoundCorner()
          SetRoundCorner()
        获取/设置 大小的最小限制
          GetMinInfo()
          SetMinInfo()
        获取/设置 大小的最大限制
          GetMaxInfo()
          SetMaxInfo()
        设置透明度
          SetTransparent()
        设置背景是否使用透明属性
          SetBackgroundTransparent()
        获取/设置 刷新区域属性
          IsShowUpdateRect()
          SetShowUpdateRect()
        获取/设置 应用程序对象实例句柄
          GetInstance()
          SetInstance()
        获取 可执行程序所在路径
          GetInstancePath()
        获取/设置 当前工作目录
          GetCurrentPath()
          SetCurrentPath()
        获取/设置 资源动态库句柄
          GetResourceDll()
          SetResourceDll()
        获取/设置 资源路径
          GetResourcePath()
          SetResourcePath()
        获取/设置 资源压缩包文件名
          GetResourceZip()
        SetResourceZip()
      使用绘制管理者的根绘制管理者的资源设置 循环得到父绘制管理者直到找到最顶层的绘制管理者
        UseParentResource()
      得到绘制管理者
        GetParentResource()
      获取/设置 非可用状态文字颜色
        GetDefaultDisabledColor()
        SetDefaultDisabledColor()
      获取/设置 默认字体颜色
        GetDefaultFontColor()
        SetDefaultFontColor()
      获取/设置超链接默认字体颜色
        GetDefaultLinkFontColor()
        SetDefaultLinkFontColor()
      获取/设置 鼠标漂浮在链接上时默认字体颜色
        GetDefaultLinkHoverFontColor()
        SetDefaultLinkHoverFontColor()
      获取/设置 选中后背景颜色
        GetDefaultSelectedBkColor()
        SetDefaultSelectedBkColor()
      获取/设置 默认字体
        GetDefaultFontInfo()
        SetDefaultFont()
      字体列表操作
        DWORD GetCustomFontCount() - 得到字体列表中项数量
        HFONT AddFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 加入一种字体到字体列表中
        HFONT AddFontAt(int index, LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 加入一种字体到字体列表的指定位置
        HFONT GetFont(int index) - 按序号得到字体列表中的字体
        HFONT GetFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 按字体属性得到字体列表中的字体
        bool FindFont(HFONT hFont) - 按句柄查找字体列表中的一项
        bool FindFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 按属性查找字体列表中的一项
        bool RemoveFont(HFONT hFont)  - 按句柄移除字体列表中的指定项
        bool RemoveFontAt(int index) - 按序号移除字体列表中的指定项
        void RemoveAllFonts() - 移除字体列表中的所有项
        TFontInfo* GetFontInfo(int index) - 按序号得到字体列表中项的属性
        TFontInfo* GetFontInfo(HFONT hFont) - 按句柄得到字体列表中项的属性
      图片列表操作
        const TImageInfo* GetImage(LPCTSTR bitmap);
        const TImageInfo* GetImageEx(LPCTSTR bitmap, LPCTSTR type = NULL, DWORD mask = 0);
        const TImageInfo* AddImage(LPCTSTR bitmap, LPCTSTR type = NULL, DWORD mask = 0);
        bool RemoveImage(LPCTSTR bitmap);
        void RemoveAllImages();
      默认属性列表操作
        void AddDefaultAttributeList(LPCTSTR pStrControlName, LPCTSTR pStrControlAttrList);
        LPCTSTR GetDefaultAttributeList(LPCTSTR pStrControlName) const;
        bool RemoveDefaultAttributeList(LPCTSTR pStrControlName);
        const CStdStringPtrMap& GetDefaultAttribultes() const;
        void RemoveAllDefaultAttributeList();
      将控件树附加到当前绘制管理者
        bool AttachDialog(CControlUI* pControl);
      初始化控件 把控件名称加入到绘制管理者的控件名map
        bool InitControls(CControlUI* pControl, CControlUI* pParent = NULL);
      重置控件
        void ReapObjects(CControlUI* pControl);
      选项组操作
        bool AddOptionGroup(LPCTSTR pStrGroupName, CControlUI* pControl); - 添加控件到组中如果组选贤存在则加入pControl到此组中,如果不存在则创建新组并加入pControl
        CStdPtrArray* GetOptionGroup(LPCTSTR pStrGroupName); - 通过名称得到选项组
        void RemoveOptionGroup(LPCTSTR pStrGroupName, CControlUI* pControl); - 移除组中控件,如果组中没有控件则移除组
        void RemoveAllOptionGroups(); - 移除所有选项组
      得到控件焦点
        CControlUI* GetFocus() const;
      控件获得焦点
        void SetFocus(CControlUI* pControl);
      得到标签页控件
        bool SetNextTabControl(bool bForward = true);
      定时器操作
        bool SetTimer(CControlUI* pControl, UINT nTimerID, UINT uElapse); - 设置一个定时器
        bool KillTimer(CControlUI* pControl, UINT nTimerID); - 清除一个定时器
        void RemoveAllTimers(); - 清楚所有定时器
      捕获鼠标
        void SetCapture();
      释放捕获鼠标
        void ReleaseCapture();
      鼠标是否被捕获
        bool IsCaptured();

        bool AddNotifier(INotifyUI* pControl); - 加入一个Listener
        bool RemoveNotifier(INotifyUI* pControl);   - 移除一个Listener
        void SendNotify(TNotifyUI& Msg); - 发送一个通知
        void SendNotify(CControlUI* pControl, LPCTSTR pstrMessage, WPARAM wParam = 0, LPARAM lParam = 0); - 发送一个通知

        bool AddPreMessageFilter(IMessageFilterUI* pFilter); - 加入一个预处理Message Filter
        bool RemovePreMessageFilter(IMessageFilterUI* pFilter); - 移除一个预处理Message Filter

        bool AddMessageFilter(IMessageFilterUI* pFilter); - 加入一个Message Filter
        bool RemoveMessageFilter(IMessageFilterUI* pFilter); - 移除一个Message Filter

      PostPaint控件操作
        int GetPostPaintCount() const; - 得到PostPaint控件数量
        bool AddPostPaint(CControlUI* pControl); - 加入PostPaint控件
        bool RemovePostPaint(CControlUI* pControl); - 移除一个PostPaint控件
        bool SetPostPaintIndex(CControlUI* pControl, int iIndex); - 设置控件到指定的序列位置

      加入控件到延迟处理列表当中
        void AddDelayedCleanup(CControlUI* pControl);
      得到根控件
        CControlUI* GetRoot() const;
      调用根节点控件的函数按位置匹配控件
        CControlUI* FindControl(POINT pt) const;
      调用父控件的函数按名字匹配控件
        CControlUI* FindControl(CControlUI* pParent, POINT pt) const;
      在控件名map中按名字匹配控件
        CControlUI* FindControl(LPCTSTR pstrName);
      调用父控件的函数按名字匹配控件
        CControlUI* FindControl(CControlUI* pParent, LPCTSTR pstrName);
      消息循环
        static void MessageLoop();
      消息处理
        static bool TranslateMessage(const LPMSG pMsg);
      消息处理
        bool MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes);
      消息预处理
        bool PreMessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes);

      回调函数 比较属性(pData)与控件(pThis)的属性是否相同
        static CControlUI* CALLBACK __FindControlFromNameHash(CControlUI* pThis, LPVOID pData); - 按名称查找控件的回调函数
        static CControlUI* CALLBACK __FindControlFromCount(CControlUI* pThis, LPVOID pData); - 计算控件数目的回调函数
        static CControlUI* CALLBACK __FindControlFromPoint(CControlUI* pThis, LPVOID pData); - 按位置查找控件的回调函数
        static CControlUI* CALLBACK __FindControlFromTab(CControlUI* pThis, LPVOID pData); - 查找下一个相应tab的控件
        static CControlUI* CALLBACK __FindControlFromShortcut(CControlUI* pThis, LPVOID pData); - 快捷方式对应的控件
        static CControlUI* CALLBACK __FindControlFromUpdate(CControlUI* pThis, LPVOID pData); - 查找需要刷新的控件
        static CControlUI* CALLBACK __FindControlFromNameByParent(CControlUI* pThis, LPVOID pData); - 查找子控件

        HWND m_hWndPaint;    //绘制窗口句柄
        HDC m_hDcPaint;        //绘制DC
        HDC m_hDcOffscreen; //屏幕兼容DC
        HDC m_hDcBackground;    //背景DC
        HBITMAP m_hbmpOffscreen;    //屏幕DIB
        HBITMAP m_hbmpBackground;    //背景DIB
        HWND m_hwndTooltip;    //提示窗口句柄
        TOOLINFO m_ToolTip;    //提示结构
        bool m_bShowUpdateRect;    //是否更新
        //
        CControlUI* m_pRoot;    //根控件指针
        CControlUI* m_pFocus;    //获得焦点控件指针
        CControlUI* m_pEventHover;    //鼠标停留控件指针
        CControlUI* m_pEventClick;    //点击事件控件指针
        CControlUI* m_pEventKey;    //相应键盘事件控件指针
        //
        POINT m_ptLastMousePos;    //鼠标位置
        SIZE m_szMinWindow;        //窗口最小限制
        SIZE m_szMaxWindow;        //窗口最大限制
        SIZE m_szInitWindowSize;    //初始化窗口大小
        RECT m_rcSizeBox;        //托腮大小
        SIZE m_szRoundCorner;    //圆角大小
        RECT m_rcCaption;        //标题大小
        UINT m_uTimerID;        //计时器ID
        bool m_bFirstLayout;    //是否为第一层
        bool m_bUpdateNeeded;    //是否需要更新
        bool m_bFocusNeeded;    //是否需要焦点
        bool m_bOffscreenPaint;    //是否绘制m_hDcOffscreen
        bool m_bAlphaBackground;    //背景是否透明
        bool m_bMouseTracking;    //是否追踪鼠标
        bool m_bMouseCapture;    //是否捕获鼠标
        
        CStdPtrArray m_aNotifiers;    //Listener 列表
        CStdPtrArray m_aTimers;        //计时器列表
        CStdPtrArray m_aPreMessageFilters;    //预处理消息列表
        CStdPtrArray m_aMessageFilters;        //消息处理列表
        CStdPtrArray m_aPostPaintControls;    //PostPaint控件列表
        CStdPtrArray m_aDelayedCleanup;    //延迟释放控件列表
        CStdStringPtrMap m_mNameHash;    //控件名哈希列表
        CStdStringPtrMap m_mOptionGroup;    //选项组列表
        
        CPaintManagerUI* m_pParentResourcePM;    //当前绘制管理者的上一层绘制管理者(父绘制管理者)
        DWORD m_dwDefalutDisabledColor;    //默认非可用状态字体颜色
        DWORD m_dwDefalutFontColor;    //默认字体颜色
        DWORD m_dwDefalutLinkFontColor;    //默认链接颜色
        DWORD m_dwDefalutLinkHoverFontColor;    //默认鼠标漂浮时字体颜色
        DWORD m_dwDefalutSelectedBkColor;    //默认被选择后背景颜色
        TFontInfo m_DefaultFontInfo;    //默认字体信息
        CStdPtrArray m_aCustomFonts;    //字体列表

        CStdStringPtrMap m_mImageHash;    //图片资源名哈希表
        CStdStringPtrMap m_DefaultAttrHash;    //默认属性哈希表
        
        static HINSTANCE m_hInstance;    //应用程序对象实例句柄
        static HINSTANCE m_hResourceInstance;    //资源对象实例句柄
        static CStdString m_pStrResourcePath;    //资源路径
        static CStdString m_pStrResourceZip;    //zip包资源名称
        static CStdPtrArray m_aPreMessages;    //预处理消息队列

    10 class UIMarkup -  解析XML
        CMarkup()
          功能 构造函数
          pstrXML - xml数据
          实现 -
            初始化成员变量
            调用Load()
        ~CMarkup()
          功能 析构函数

        Load()
          功能 加载xml数据
          pstrXML - xml数据
        LoadFromMem()
          功能 从内存中加载xml数据
          pByte - 内存数据指针
          dwSize - 大小
          encoding - 编码方式 XMLFILE_ENCODING_UTF8(默认) XMLFILE_ENCODING_UNICODE XMLFILE_ENCODING_ASNI
          实现 -
            进行编码转换
            申请控件
            复制数据

        LoadFromFile()
         功能 从文件中加载xml数据
         pstrFilename - 文件名
         encoding - 编码方式
         实现 -
           判断资源类型是否为zip,如果为zip包则进行解压
           调用LoadFromMem()
        Release() - 释放xml数据和元素信息数据
        IsValid() - Markup是否有效

        SetPreserveWhitespace() - 设置是否保存空白行
        GetLastErrorMessage()
          功能 得到错误信息
          pstrMessage - [out]错误信息内容
          cchMax - 信息长度
        GetLastErrorLocation
          功能 得到出错位置
          pstrSource - 错误所在位置内容
          cchMax - 内容长度

        GetRoot() - 得到根节点

        tagXMLELEMENT    //元素结构
        {
            ULONG iStart;    //m_pstrXML中起始位置
            ULONG iChild;    //子标签在m_pstrXML中的位置
            ULONG iNext;    //同级下一个标签在m_pstrXML中的位置
            ULONG iParent;    //上一级标签在m_pstrXML中的位置
            ULONG iData;    //元素数据在m_pstrXML中的位置
        } XMLELEMENT;

        LPTSTR m_pstrXML;    //xml数据
        XMLELEMENT* m_pElements;    //元素列表
        ULONG m_nElements;    //元素数量
        ULONG m_nReservedElements;    //存储元素空间
        TCHAR m_szErrorMsg[100];    //错误消息
        TCHAR m_szErrorXML[50];        //错误内容
        bool m_bPreserveWhitespace;    //是否过滤空白
        解析xml数据
        bool _Parse();
        bool _Parse(LPTSTR& pstrText, ULONG iParent);
          实现 -
            for(;;)
            {
                如果为顶层则返回
                填充element
                解析名字
                解析属性
                标签闭合方式
                如果为/>continue
                如果为>则递归调用_Parse()
                如果为该标签的对应闭合标签 continue
            }
        XMLELEMENT* _ReserveElement(); - 申请保存元素空间
        跳过空白
          inline void _SkipWhitespace(LPTSTR& pstr) const;
          inline void _SkipWhitespace(LPCTSTR& pstr) const;
        跳过标识符
          inline void _SkipIdentifier(LPTSTR& pstr) const;
          inline void _SkipIdentifier(LPCTSTR& pstr) const;
        
        bool _ParseData(LPTSTR& pstrText, LPTSTR& pstrData, char cEnd);
         功能 解析数据
         pstrText - 被解析的数据字符串
         pstrData - 解析后的数据字符串
         cEnd - 终止字符
        解析转义字符
          void _ParseMetaChar(LPTSTR& pstrText, LPTSTR& pstrDest);
        解析属性
          bool _ParseAttributes(LPTSTR& pstrText);
        记录错误信息返回错误
          bool _Failed(LPCTSTR pstrError, LPCTSTR pstrLocation = NULL);
    =======update 2011-07-10========
    11 class CMarkupNode
        CMarkupNode() - 构造函数 构造一个空节点
        CMarkupNode(CMarkup* pOwner, int iPos)
          功能 构造函数
          pOwner - CMarkup指针
          iPos - xml数据中的位置
        IsValid() - 节点对象是否有效
        GetParent() - 得到父节点
        GetSibling() - 得到兄弟节点
        GetChild() - 得到子节点
        GetChild(LPCTSTR pstrName)
          功能 按名字得到子节点
          实现 循环查找所有子节点,直到名字匹配
        HasSiblings() - 是否有兄弟节点
        HasChildren() - 是否有子节点
        GetName() - 得到节点对应的标签名
        GetValue() - 得到节点对应的标签数据值
        HasAttributes() - 是否有属性
        HasAttribute(LPCTSTR pstrName) - 是否有名为pstrName的属性
        GetAttributeCount() - 得到节点属性的数量
        GetAttributeName(int iIndex) - 按序号得到属性名称
        bool GetAttributeValue(int iIndex, LPTSTR pstrValue, SIZE_T cchMax)
          功能 得到属性
          iIndex - 属性序号
          pstrValue - [out] 属性值字符串
          cchMax - 属性值字符串长度
        bool GetAttributeValue(LPCTSTR pstrName, LPTSTR pstrValue, SIZE_T cchMax)
          功能 得到属性
          pstrName - 属性名
          pstrValue - [out] 属性值字符串
          cchMax - 属性值字符串长度

        _MapAttributes() - 解析xml属性建立 属性名和值的表映射到xml数据的位置

        enum { MAX_XML_ATTRIBUTES = 64 };    //属性最大数量限制

        typedef struct
        {
            ULONG iName;
            ULONG iValue;
        } XMLATTRIBUTE;    //属性结构

        int m_iPos;    //节点在xml数据中的位置
        int m_nAttributes;    //属性数量
        XMLATTRIBUTE m_aAttributes[MAX_XML_ATTRIBUTES];    //属性-值 映射xml位置 列表
        CMarkup* m_pOwner;    - CMarkup指针
    12 class IDialogBuilderCallback - 构建UI时回调类 用于创造用户自定义的控件
       virtual CControlUI* CreateControl(LPCTSTR pstrClass) = 0 - 创建用户自定义控件, pstrClass控件名
    13 class CDialogBuilder - UI构建者用于构建UI
         CControlUI* Create();
           功能 构建UI
         STRINGorID xml - 可以是一个内存xml数据或一个文件名
         STRINGorID type = (UINT) 0 - 如果xml数据位于EXE资源中则type指定资源类型
         IDialogBuilderCallback* pCallback = NULL - 回调函数
         CPaintManagerUI* pManager = NULL - 绘制管理者指针
           实现 -
             判断xml类型
             加载xml数据
             调用Create(pCallback, pManager)构建
        CControlUI* Create(IDialogBuilderCallback* pCallback = NULL, CPaintManagerUI* pManager = NULL);
          功能 构建UI
          实现 -
            得到顶层Window标签,并解析属性
            调用_Parse() 解析xml
        void GetLastErrorMessage(LPTSTR pstrMessage, SIZE_T cchMax) const; - 错误信息
        void GetLastErrorLocation(LPTSTR pstrSource, SIZE_T cchMax) const; - 出错位置

        CControlUI* _Parse(CMarkupNode* parent, CControlUI* pParent = NULL, CPaintManagerUI* pManager = NULL);
        实现 -
          for(循环顶级标签)
          {
              按xml标签创建控件对象
              如果不是标准控件则调用m_pCallback->CreateControl()创建用户自定义控件对象
              如果有子节点则递归调用_Parse()
              因为某些属性和父窗口相关,比如selected,必须先Add到父窗口
              初始化控件默认属性
              根据xml数据解析处理控件属性
         }
       CMarkup m_xml; //CMarkup对象
       IDialogBuilderCallback* m_pCallback;//构建控件回调
    14 class CControlUI - 控件
        GetName() - 得到控件名称 名称为控件的唯一ID
        SetName() - 设置控件名称
        GetInterface() - 得到控件指针
        GetClass() - 得到控件类名
        GetControlFlags() - 得到控件的类型标志
        Activate() - 控件是否活跃 (非不可用状态,非不可见状态)
        GetManager() - 得到绘制管理者
        SetMananer()
          功能 设置控件的绘制管理者
          实现 -
            设置控件管理者
            初始化
        GetParent() - 得到父控件
        GetText() - 得到控件显示内容
        SetText() - 设置控件显示内容
        GetBkColor() - 得到背景色
        GetBkColor2() - 得到背景色2
        SetBkColor2() - 设置背景色2
        GetBkColor3() - 得到背景色3
        SetBkColor3() - 设置背景色3
    背景色1,2,3用于渐变色 颜色渐变过程为1->2->3
        GetBkImage() - 得到背景图片
        SetBkImage() - 设置背景图片
        GetBorderColor() - 得到边的颜色
        SetBorderColor() - 设置边的颜色
        GetFocusBorderColor() - 设置获得焦点时边的颜色
        GetBorderSize() - 得到边的宽度
        SetBorderSize() - 设置边的宽度
        GetBorderRound() - 得到圆角
        SetBorderRound() - 设置圆角
        DrawImage() - 绘制图片
        GetPos() - 得到控件位置
        SetPos() - 设置控件位置并重绘
        GetWidth() - 得到控件宽度
        GetHeight() - 得到控件高度
        GetX() - 得到控件横坐标位置(左上点横坐标)
        GetY() - 得到控件纵坐标位置(左上点纵坐标)
        GetPadding() - 设置外边距,由上层窗口绘制(求周围控件离它远点或近点(负值,不过受绘制顺序影响,比较少用)
        SetPadding() - 设置外边距,由上层窗口绘制
        GetFixedXY() - 实际大小位置使用GetPos获取,这里得到的是预设的参考值
        SetFixedXY() - floattrue时有效
        GetFixedWidth() - 实际大小位置使用GetPos获取,这里得到的是预设的参考值
        SetFixedWidth() - 预设的参考值
        GetFixedHeight() - 实际大小位置使用GetPos获取,这里得到的是预设的参考值
        SetFixedHeight() - 预设的参考值
        设置大小的限制值
          GetMinWidth()
          SetMinWidth()
          GetMaxWidth()
          SetMaxWidth()
          GetMinHeight()
          SetMinHeight()
          GetMaxHeight()
          SetMaxHeight()
        SetRelativePos() - 设置相对位置比例
        SetRelativeParentSize() - 设置父控件大小
        GetRelativePos() - 得到相对位置比例
        IsRelativePos() -是使用相对位置
        获取/设置 提示信息
          GetToolTip()
          SetToolTip()
        获取/设置 快捷键
          GetShortcut()
          SetShortcut()
        获取/设置 上下文菜单是否被使用
          IsContextMenuUsed()
        获取/设置 用户数据(字符串)
          GetUserData()
          SetUserData()
        获取/设置 用户指针
          GetTag()
          SetTag()
        获取/设置 控件是否可见
          IsVisible()
          SetVisible()
          SetInternVisible() // 仅供内部调用,有些UI拥有窗口句柄,需要重写此函数
    =============update 2011-07-11
        获取/设置 控件可用
          IsEnabled()
          SetEnabled()
        获取/设置 是否处理鼠标事件
          IsMouseEnabled()
          SetMouseEnabled()
        控件是否获得焦点
          IsFocused()
        设置控件获得焦点
          SetFocuse()
        控件是否悬浮
          IsFloat()
        设置控件为悬浮
          SetFloat()
        FindControl() - 查找控件
        Invalidate()
          功能 设置无效,引起刷新
          实现 循环至顶层控件为止计算当前无效区域与父控件交叉区域作为新无效区域。
        获取/设置 需更新状态
          IsUpdateNeeded()
          NeedUpdate()
        Init() - 初始化控件事件响应SetManager()中被调用
        DoInit() - 做初始化处理函数Init()调用
        DoEvent() - 事件响应函数
        SetAttribute() - 设置属性根据解析后的名称对所关心的属性设置状态成员变量的值
        ApplyAttributeList() - 解析标签的属性字符串调用SetAttribute()
        EstimateSize() - 预估控件大小
        DoPaint()
          功能 控件绘制
          实现 绘制循序:背景颜色->背景图->状态图->文本->边框
        PaintBkColor()
          功能 绘制背景色
        PaintBkImage()
          功能 绘制背景图片
        PaintStatusImage()
          功能 根据状态绘制背景图片
        PaintText() - 绘制文字
        PaintBorder() - 绘制边框
        DoPostPaint() - ?
        事件源 可以通过委托的设计模式为初始化,销毁,事件处理过程中加入更多的处理过程
        CEventSource OnInit; - 初始化事件源
        CEventSource OnDestroy; - 销毁事件源
        CEventSource OnEvent; - 事件响应事件源
        
    ======update 2011 07 16
    15 UIlib.h/UIlib.cpp
       * UIlib.h
         导出导入宏
         包含系统的头文件
         包含duilib库的头文件
       * UIlib.cpp
         Bjarke Viksoe UI library
         dllmain() 函数
    16 class CDelegateBase 委托模式中的虚基类
         CDelegateBase(void* pObject, void* pFn); - 构造函数,pObject为委托者的对象, pFn为执行方法
         CDelegateBase(const CDelegateBase& rhs); - 拷贝构造函数
         virtual ~CDelegateBase(); - 析构函数
         bool Equals(const CDelegateBase& rhs) const; - 比较两个委托者, true 一致 false不同
         bool operator() (TEventUI& event); - 响应委托进行处理 event为响应的事件
         virtual CDelegateBase* Copy() = 0; - 拷贝一个委托者
         void* GetFn(); - 得到执行方法
         void* GetObject(); - 得到委托者对象
         virtual bool Invoke(TEventUI& event) = 0; - 调用执行方法
         void* m_pObject; - 委托者
         void* m_pFn; - 执行方法
    17 class CDelegateStatic 静态委托,委托者为空,但有执行过程
    18 class CDelegate 委托,委托者不为空
    19 产生委托
       CDelegate<O, T> MakeDelegate(O* pObject, bool (T::* pFn)(TEventUI&))
      inline CDelegateStatic MakeDelegate(bool (*pFn)(TEventUI&))
    20 class CEventSource - 事件源
         加入一个委托者
           void operator+= (CDelegateBase& d);
           void operator+= (FnType pFn);
        删除一个委托者
           void operator-= (CDelegateBase& d);
           void operator-= (FnType pFn);
        响应事件进行处理
        bool operator() (TEventUI& event);
        CStdPtrArray m_aDelegates; - 委托者列表
    21 class CLabelUI - 标签控件
        CLabelUI() - 构造函数
        m_uTextStyle - 样式默认居中
        m_dwTextColor - 可用时文字颜色
        m_dwDisabledTextColor - 不可用时文字颜色
        m_iFont - 字体序号
        m_bShowHtml - 是否使用内嵌hmtl标记格式
        GetClass() - 返回控件名
        GetInterface() - 得到对象指针
        获取/设置 文本样式
          GetTextStyle()
          SetTextStyle()
        获取/设置 可用状态文字颜色
          SetTextColor()
          GetTextColor()
        获取/设置 为可用状态文字颜色
          SetDisableTextColor()
          GetDisabledTextColor()
        获取/设置 控件使用的字体对应在字体列表中的序号
          SetFont()
          GetFont()
        获取/设置 文字与边框之间填充距离
          GetTextPadding()
          SetTextPadding()
        获取/设置 是否使用内嵌html标记格式
          IsShowHtml()
          SetShowHtml()
        EstimateSize() - 预估控件大小
        DoEvent() - 事件处理
        SetAttribute() - 设置属性
        PaintText() - 绘制文本
    22 class CButtonUI
        CButtonUI() - 构造函数文本样式为单行居中
        GetClass() - 返回控件名
        GetInterface() - 得到对象指针
        GetControlFlags() - 得到控件的类型标志
        DoEvent() - 事件处理
        非鼠标事件交给基类CLabelUI处理鼠标事件由此函数处理
        Activate()
          功能 激活按钮控件
          实现 判断是否活跃,如活跃发送通知
        SetEnabled() - 设置按钮控件是否可用
          实现 调用基类设置如不可用则清空按钮状态
        设置/获取 鼠标悬时文本的颜色
          SetHotTextColor()
          GetHotTextColor()
        设置/获取 按钮按下时文本颜色
          SetPushedTextColor()
          GetPushedTextColor()
        设置/获取 按钮获得焦点时文本颜色
          SetFocusedTextColor()
          GetFocusedTextColor()
        获取/设置 正常状态下按钮背景图片
          GetNormalImage()
          SetNormalImage()
        获取/设置 鼠标悬浮时按钮背景图片
          SetHotImage()
          GetHotImage()
        获取/设置 按钮被按下时背景图片
          GetPushedImage()
          SetPushedImage()
        获取/设置 按钮获得焦点时背景图片
          GetFocusedImage()
          SetFocusedImage()
        获取/设置 非可用状态下按钮背景图片
          GetDisabledImage()
          SetDisabledImage()
        EstimateSize() - 预估大小
        SetAttribute() - 设置属性根据解析后的名称对所关心的属性设置状态成员变量的值
        PaintText() - 绘制文本
        PaintStatusImage() - 绘制状态背景图片
    23 class COptionUI - 选项控件(CheckBox RadioBox)
        COptionUI() - 构造函数
        ~COptionUI() - 析构函数
          CPaintManaerUI::RemoveOptionGroup()
        GetClass() - 返回控件名
        GetInterface() - 得到对象指针
        SetManager() - 设置绘制管理者父控件
        获取/设置 选项所属组
        GetGroup()
        SetGroup()
        获取/设置 选项是否处于选中状态
        IsSelected()
        Selected()
        Activate() - 激活选项控件
        获取/设置 选中状态背景图片
          GetSelectedImage()
          SetSelectedImage()
        获取/设置 前景图片
          GetForeImage()
          SetForeImage()
        EstimateSize() - 预估选项控件大小
        SetAttribute() - 设置属性根据解析后的名称对所关心的属性设置状态成员变量的值
        PaintStatusImage() - 绘制状态背景图片
    24 class CTextUI
      * CTextUI() - 构造
        ~CTextUI() - 析构
        GetClass() - 返回控件名
        GetControlFlags() - 得到控件的类型标志
        GetInterface() - 得到对象指针

        GetLinkContent() - 得到当前控件中指定序号的超文本的内容
        DoEvent() - 事件处理
        EstimateSize() - 预估选项控件大小
        PaintText() - 绘制文字

        MAX_LINK - 超文本数量限制
        m_nLinks - 超文本数量
        m_rcLinks - 超文本区域数组
        m_sLinks - 超文本内容数组
        int m_bHoverLink - 鼠标浮动的超文本链接序号

    25 class CProgressUI
        GetClass() - 返回控件名
        GetInterface() - 得到对象指针

        - 获取/设置 进度条方向
          bool IsHorizontal();
          void SetHorizontal(bool bHorizontal = true);
        -获取/设置 最小值
        int GetMinValue() const;
        void SetMinValue(int nMin);
        获取/设置 最大值
        int GetMaxValue() const;
        void SetMaxValue(int nMax);
        获取 设置 最小值
        int GetValue() const;
        void SetValue(int nValue);
        获取 设置 前景图
        LPCTSTR GetFgImage() const;
        void SetFgImage(LPCTSTR pStrImage);

        void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); - 设置属性
        void PaintStatusImage(HDC hDC); - 绘制状态图

        bool m_bHorizontal - 进度条控件方向
        int m_nMax; 最大值
        int m_nMin; 最小值
        int m_nValue; 当前值

        CStdString m_sFgImage; - 前景图
        CStdString m_sFgImageModify; - 前景图2

    26 class CSliderUI
        CSliderUI() - 构造
        GetClass() - 返回控件名
        GetInterface() - 得到对象指针

        UINT GetControlFlags() const; -  得到控件的类型标志

        void SetEnabled(bool bEnable = true); - 设置滑块控件是否可用

        获取 设置滑块步长
        int GetChangeStep();
        void SetChangeStep(int step);

        获取设置滑块大小
        void SetThumbSize(SIZE szXY);
        RECT GetThumbRect() const;
        获取设置滑块图
        LPCTSTR GetThumbImage() const;
        void SetThumbImage(LPCTSTR pStrImage);
        获取设置鼠标悬浮状态滑块图
        LPCTSTR GetThumbHotImage() const;
        void SetThumbHotImage(LPCTSTR pStrImage);
        获取设置滑块按下状态滑块图
        LPCTSTR GetThumbPushedImage() const;
        void SetThumbPushedImage(LPCTSTR pStrImage);
      
        void DoEvent(TEventUI& event); - 事件处理
        void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); - 设置属性
        void PaintStatusImage(HDC hDC); - 绘制状态图

        SIZE m_szThumb; - 滑块大小
        UINT m_uButtonState; - 控件状态
        int m_nStep; - 步长

        CStdString m_sThumbImage; - 正常状态滑块块图
        CStdString m_sThumbHotImage; - 鼠标悬浮状态滑块图
        CStdString m_sThumbPushedImage; - 按下状态滑块图

        CStdString m_sImageModify; - 滑块图2

  • 相关阅读:
    layui 参照赋值的两种方式
    c笔记
    Linux操作系统笔记
    make笔记
    Gcc如何知道文件类型。
    #include <xxx.h>和#include "xxx.h"的区别
    GCC编译流程
    c++ Socket客户端和服务端示例版本三(多线程版本)
    c++ Socket客户端和服务端示例版本二
    c++ Socket客户端和服务端示例版本一
  • 原文地址:https://www.cnblogs.com/weinyzhou/p/3112059.html
Copyright © 2020-2023  润新知