duilib 源码分析

来源:互联网 发布:vue 页面初始化数据 编辑:程序博客网 时间:2024/05/25 13:32

  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); - 添加选项组
    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); - 发送一个Notify消息
    void SendNotify(CControlUI* pControl, LPCTSTR pstrMessage, WPARAM wParam = 0, LPARAM lParam = 0); - 发送一个Notify消息

    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;
  按名字查找控件
    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;    //预处理消息队列
======update 2011-07-09========================================
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() - 得到根节点

private:
    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);
11 class CMarkupNode
    CMarkupNode
=======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
     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() - 仅float为true时有效
    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拥有窗口句柄,需要重写此函数
            有窗口句柄的UI在设置不可见时,需要先失去焦点
原创粉丝点击