DuiLib的源码分析


1 stdAfx.h
* lengthof(x) 计算数组长度宏
* MAX  两值最大
* MIN  两值最小
* CLAMP(x,a,b) x在a,b之间则取x否则取最小
2 UIBase
* UI_WNDSTYLE_ 窗口风格属性
* UI_CLASSSTYLE_ 窗口类属性
* DUITRACE(LPCTSTR pstrFormat, ...)
  功能 - 调试信息
  参考 - 参考printf
* DUITRACEMSG(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 分析标识字符串获取属性
    2 获取图像数据
    3 绘制图像
 DrawColor()
  功能 - 绘制矩形
  hDC - 设备句柄
  rc - 对象区域
  color - 颜色(alpha, r, g, b)
  实现 -
   如果不需要alpha混合则SetBkColor() ExtTextOut()
   否则 创建一个像素大小的32位DIB
 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 CMarkup -  解析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);
  
=======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在设置不可见时,需要先失去焦点
   
   
=============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 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

27 class CEditUI
    CEditUI();
    GetClass() - 返回控件名
    GetInterface() - 得到对象指针块

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

    void SetEnabled(bool bEnable = true); - 设置编辑框控件是否可用
    void SetText(LPCTSTR pstrText); - 设置文本
    void SetMaxChar(UINT uMax); - 设置输入文本长度限制
    UINT GetMaxChar(); - 获取最大输入文本长度
    void SetReadOnly(bool bReadOnly); - 设置只读模式
    bool IsReadOnly() const; - 获取只读模式
    void SetPasswordMode(bool bPasswordMode); - 获取密码编辑框模式
    bool IsPasswordMode() const; - 设置密码编辑模式
    void SetPasswordChar(TCHAR cPasswordChar); 设置密码模式显示字符
    TCHAR GetPasswordChar() const; 获取密码模式显示字符Edit_SetPasswordChar

    获取设置正常状态图
    LPCTSTR GetNormalImage();
    void SetNormalImage(LPCTSTR pStrImage);
    获取设置悬浮状态图
    LPCTSTR GetHotImage();
    void SetHotImage(LPCTSTR pStrImage);
    获取设置获得焦点状态图
    LPCTSTR GetFocusedImage();
    void SetFocusedImage(LPCTSTR pStrImage);
    获取设置非可用状态图
    LPCTSTR GetDisabledImage();
    void SetDisabledImage(LPCTSTR pStrImage);
    获取设置原生编辑框背景色
    void SetNativeEditBkColor(DWORD dwBkColor);
    DWORD GetNativeEditBkColor() const;

    void SetPos(RECT rc); - 得到编辑框位置

    void SetVisible(bool bVisible = true); - 设置可见状态
    void SetInternVisible(bool bVisible = true); - // 仅供内部调用,有些UI拥有窗口句柄,需要重写此函数
    SIZE EstimateSize(SIZE szAvailable); - 预估控件大小
    void DoEvent(TEventUI& event); - 处理事件
    void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); - 设置属性

    void PaintStatusImage(HDC hDC); - 绘制状态图
    void PaintText(HDC hDC); - 绘制文本

    CEditWnd* m_pWindow; - 原生编辑框窗口

    UINT m_uMaxChar; - 文本长度限制
    bool m_bReadOnly; - 只读方式
    bool m_bPasswordMode; - 显示密码模式
    TCHAR m_cPasswordChar; - 密码模式显示的字符
    UINT m_uButtonState; - 编辑框状态
    CStdString m_sNormalImage; - 正常状态图
    CStdString m_sHotImage; - 悬浮状态图
    CStdString m_sFocusedImage; - 获取焦点状态图
    CStdString m_sDisabledImage; - 不可用状态图
    DWORD m_dwEditbkColor; - 获取设置编辑框背景色

28 class CEditWnd
    CEditWnd(); - 构造函数

    void Init(CEditUI* pOwner); 初始化
    RECT CalPos(); 计算位置

    LPCTSTR GetWindowClassName() const; 得到窗口类名
    LPCTSTR GetSuperClassName() const; 得到超类化名
    void OnFinalMessage(HWND hWnd); 窗口被摧毁后,最后消息处理

    LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); 处理消息
    LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 失去焦点消息
    LRESULT OnEditChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 文本内容改变

    CEditUI* m_pOwner; 编辑框窗口拥有者
    HBRUSH m_hBkBrush; 背景画刷

29 class CScrollBarUI
public:
    CScrollBarUI();

    LPCTSTR GetClass() const; - 返回控件名
    LPVOID GetInterface(LPCTSTR pstrName); - 得到对象指针

    CContainerUI* GetOwner() const; - 得到滚动条拥有者
    void SetOwner(CContainerUI* pOwner); 设置滚动条拥有者

    void SetEnabled(bool bEnable = true); 设置滚动条是否可用
    void SetFocus(); 设置焦点如if (NULL!=m_pOwner)m_pOwner->SetFocus();else CControlUI::SetFocus()

    bool IsHorizontal(); 获取滚动条方向
    void SetHorizontal(bool bHorizontal = true);设置滚动条横竖方向
    int GetScrollRange() const; 得到滚动条范围
    void SetScrollRange(int nRange); 设置滚动条范围
    int GetScrollPos() const; 得到滚动块位置
    void SetScrollPos(int nPos); 设置滚动块位置
    int GetLineSize() const; 得到步长大小
    void SetLineSize(int nSize); 设置步长大小

    获取 设置 上或左位置的按钮 显示状态 正常状态图 悬浮状态图 按下状态图 非可用状态图
    bool GetShowButton1(); 获取设置显示上左按钮
    void SetShowButton1(bool bShow);
    LPCTSTR GetButton1NormalImage();
    void SetButton1NormalImage(LPCTSTR pStrImage);
    LPCTSTR GetButton1HotImage();
    void SetButton1HotImage(LPCTSTR pStrImage);
    LPCTSTR GetButton1PushedImage();
    void SetButton1PushedImage(LPCTSTR pStrImage);
    LPCTSTR GetButton1DisabledImage();
    void SetButton1DisabledImage(LPCTSTR pStrImage);

    获取 设置 下或右位置的按钮 显示状态 正常状态图 悬浮状态图 按下状态图 非可用状态图
    bool GetShowButton1(); 获取设置显示上左按钮
    bool GetShowButton2();
    void SetShowButton2(bool bShow);
    LPCTSTR GetButton2NormalImage();
    void SetButton2NormalImage(LPCTSTR pStrImage);
    LPCTSTR GetButton2HotImage();
    void SetButton2HotImage(LPCTSTR pStrImage);
    LPCTSTR GetButton2PushedImage();
    void SetButton2PushedImage(LPCTSTR pStrImage);
    LPCTSTR GetButton2DisabledImage();
    void SetButton2DisabledImage(LPCTSTR pStrImage);

    获取 设置 滚动块 正常状态图 悬浮状态图 按下状态图 非可用状态图
    LPCTSTR GetThumbNormalImage();
    void SetThumbNormalImage(LPCTSTR pStrImage);
    LPCTSTR GetThumbHotImage();
    void SetThumbHotImage(LPCTSTR pStrImage);
    LPCTSTR GetThumbPushedImage();
    void SetThumbPushedImage(LPCTSTR pStrImage);
    LPCTSTR GetThumbDisabledImage();
    void SetThumbDisabledImage(LPCTSTR pStrImage);

    获取设置 滚动轨迹 正常状态图 悬浮状态图 按下状态图 非可用状态图
    LPCTSTR GetRailNormalImage();
    void SetRailNormalImage(LPCTSTR pStrImage);
    LPCTSTR GetRailHotImage();
    void SetRailHotImage(LPCTSTR pStrImage);
    LPCTSTR GetRailPushedImage();
    void SetRailPushedImage(LPCTSTR pStrImage);
    LPCTSTR GetRailDisabledImage();
    void SetRailDisabledImage(LPCTSTR pStrImage);

    获取设置 滚动条 背景图 悬浮状态图 按下状态图 非可用状态图
    LPCTSTR GetBkNormalImage();
    void SetBkNormalImage(LPCTSTR pStrImage);
    LPCTSTR GetBkHotImage();
    void SetBkHotImage(LPCTSTR pStrImage);
    LPCTSTR GetBkPushedImage();
    void SetBkPushedImage(LPCTSTR pStrImage);
    LPCTSTR GetBkDisabledImage();
    void SetBkDisabledImage(LPCTSTR pStrImage);

    void SetPos(RECT rc); 设置滚动条
    void DoEvent(TEventUI& event); 事件处理
    void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); 设置属性

    void DoPaint(HDC hDC, const RECT& rcPaint); 绘制

    void PaintBk(HDC hDC); 绘制背景
    void PaintButton1(HDC hDC); 绘制上或左向的按钮
    void PaintButton2(HDC hDC);绘制下或右位置的按钮
    void PaintThumb(HDC hDC); 绘制滚动块
    void PaintRail(HDC hDC);绘制滚动轨迹

protected:

    enum {
        DEFAULT_SCROLLBAR_SIZE = 16, 滚动条默认大小
        DEFAULT_TIMERID = 10, 默认计时器id
    };

    bool m_bHorizontal; 滚动条横纵方向
    int m_nRange; 范围
    int m_nScrollPos; 滚动块位置
    int m_nLineSize; 步长
    CContainerUI* m_pOwner; 滚动条拥有者
    POINT ptLastMouse; 鼠标位置
    int m_nLastScrollPos; 滚动块位置
    int m_nLastScrollOffset; 滚动块偏移量 未使用
    int m_nScrollRepeatDelay; 未使用

    CStdString m_sBkNormalImage;
    CStdString m_sBkHotImage;
    CStdString m_sBkPushedImage;
    CStdString m_sBkDisabledImage;

    bool m_bShowButton1;
    RECT m_rcButton1;
    UINT m_uButton1State;
    CStdString m_sButton1NormalImage;
    CStdString m_sButton1HotImage;
    CStdString m_sButton1PushedImage;
    CStdString m_sButton1DisabledImage;

    bool m_bShowButton2;
    RECT m_rcButton2;
    UINT m_uButton2State;
    CStdString m_sButton2NormalImage;
    CStdString m_sButton2HotImage;
    CStdString m_sButton2PushedImage;
    CStdString m_sButton2DisabledImage;

    RECT m_rcThumb;
    UINT m_uThumbState;
    CStdString m_sThumbNormalImage;
    CStdString m_sThumbHotImage;
    CStdString m_sThumbPushedImage;
    CStdString m_sThumbDisabledImage;

    CStdString m_sRailNormalImage;
    CStdString m_sRailHotImage;
    CStdString m_sRailPushedImage;
    CStdString m_sRailDisabledImage;

    CStdString m_sImageModify;

30 class IContainer 容器虚基类
  + GetItemAt() - [v]得到容器中控件项
  + GetItemIndex() - [v]按序号获取容器中控件项
  + SetItemIndex() - [v]设置控件项为容器中存在的指定序号的控件项
  + GetCount() - [v]获取容器控件项数
  + Add() - [v]增加一个控件到容器中
  + AddAt() - [v]插入一个控件到容器中
  +    Remove() - [v]删除容器中控件项
  +    RemoveAt() - [v]删除指定序号的容器控件项
  +    RemoveAll() - [v]删除所有容器中的控件
 
31 class CContainerUI 容器控件
  * CContainerUI() - 构造函数
  * ~CContainerUI() - 析构函数
  * GetInterface() - 得到控件指针
  * GetClass() - 得到控件类名
  *
  + GetItemAt() - 得到容器中控件项
  + GetItemIndex() - 按序号获取容器中控件项
  + SetItemIndex() - 设置控件项为容器中存在的指定序号的控件项
  + GetCount() - 获取容器控件项数
  + Add() - 增加一个控件到容器中
  + AddAt() - 插入一个控件到容器中
  +    Remove() - 删除容器中控件项
  +    RemoveAt() - 删除指定序号的容器控件项

  * DoEvent() - 事件处理
  * SetVisible() - 设置容器是否可见
  * SetInternVisible() // 仅供内部调用,有些UI拥有窗口句柄,需要重写此函数
  * SetMouseEnabled() - 设置是否处理鼠标事件

  - 获取/设置内边距,相当于设置客户区
    * GetInset() -
    * SetInset() -
  - 获取/设置容器内控件项是否自动摧毁
    * IsAutoDestroy()
    * SetAutoDestroy()
  - 获取/设置容器本身是否延迟摧毁
    * IsDelayedDestroy()
    * SetDelayedDestroy()
  - ?获取/设置容器中控件是否响应鼠标事件
    * IsMouseChildEnabled()
    * SetMouseChildEnabled()
  * FindSelectable() - 查找容器中下一个可选项

  * SetPos() - 设置位置
  * DoPaint() - 绘制
  * SetAttribute() - 设置属性
  * SetManager() - 设置界面管理者
  * GetScrollPos() - 获取滚动块位置
  * GetScrollRange() - 获取滚动条范围
  * LineUp() - 向上一行(一行为默认字体高度)
  * LineDown() - 向下一行
  * PageUp() - 向上一页(?)
  * PageDown() - 向下一页(?)
  * HomeUp() - 最上
  * EndDown() - 最下
  * LineLeft() - 向左一行(8个像素)
  * LineRight() - 向右一行(8个像素)
  * PageLeft() - 向左一页
  * PageRight() - 向右一页
  * HomeLeft() - 最左
  * EndRight() - 最右
  * EnableScrollBar() - 滚动条可用
  * GetVerticalScrollBar() - 得到纵向滚动条
  * GetHorizontalScrollBar() - 得到横向滚动条

  * SetFloatPos() - 设置悬浮位置
  * ProcessScrollBar() 处理滚动条
  * m_items 容器中的空间项
  * m_rcInset 设置内边距 客户区
  * m_iChildPadding 控件项间距
  * m_bAtuoDestroy - 自动摧毁子控件
  * m_bMouseChildEnabled - 鼠标可用
  * m_bScrollProcess - 是否处理滚动
  * m_pVerticalScrollBar - 是否使用横滚动条
  * m_pHorizontalScrollBar - 是否使用纵滚动条

32 class CVerticalLayoutUI 纵向布局的容器控件
  + CVerticalLayoutUI()
  * GetInterface() - 得到控件指针
  * GetClass() - 得到控件类名
  * GetControlFlags() - 得到控件的类型标志
   
  - 分割栏高度
  + SetSepHeight()
  + GetSepHeight()
  + SetSepImmMode() 设置刷新模式 立即刷新或延时刷新
  + IsSepImmMode() 获取刷新模式
  + SetAttribute() - 设置属性
  + DoEvent() 处理事件
  +    SetPos() 设置位置
  +    DoPostPaint() 绘制
  +    GetThumbRect() 获取欲刷新的区域

  x    m_iSepHeight 分隔栏高度
  x    m_uButtonState 容器控件状态
  x    ptLastMouse 鼠标位置
  x    m_rcNewPos 刷新区域
  x    m_bImmMode 立即刷新模式

33 class CHorizontalLayoutUI 横向布局的容器控件
  + CHorizontalLayoutUI() - 构造
  * GetInterface() - 得到控件指针
  * GetClass() - 得到控件类名
  * GetControlFlags() - 得到控件的类型标志
   
  -获取 设置分隔栏宽度
  + SetSepWidth()
  + GetSepWidth()
  - 获取 设置刷新模式
  + SetSepImmMode()
  + IsSepImmMode()
  + SetAttribute() - 设置属性
  + DoEvent() - 处理事件
  +    SetPos() - 设置容器位置及容器中控件项位置
  +    DoPostPaint() - 延迟绘制
  +    GetThumbRect() - 获取刷新区域

  x    m_iSepWidth - 分隔栏宽度
  x    m_uButtonState - 控件状态
  x    ptLastMouse - 鼠标位置
  x    m_rcNewPos - 设置位置
  x    m_bImmMode - 立即刷新模式

34 class CTileLayoutUI - 平铺布局
  + CTileLayoutUI() - 构造
  * GetClass() - 得到控件类名
  * GetControlFlags() - 得到控件的类型标志

  + SetPos() - 设置容器及其容器内控件项位置
  -
  + 获取 设置 布局列数
  + GetColumns()
  + SetColumns()
  + SetAttribute() - 设置属性

  x m_nColumns - 布局列数

35 class CDialogLayoutUI 对话框容器控件
  + CDialogLayoutUI() 构造
  * GetInterface() - 得到控件指针
  * GetClass() - 得到控件类名
  + SetStretchMode() 拉伸模式

  + SetPos() 设置容器及其容器内控件项位置
  + EstimateSize() 预估大小
  + RecalcArea() 重新计算区域
 
  x STRETCHMODE 拉伸模式结构
  x m_aModes 拉伸模式列表

36 class CTabLayoutUI 标签页容器
  + CTabLayoutUI() 构造
  * GetInterface() - 得到控件指针
  * GetClass() - 得到控件类名
   bool Add(CControlUI* pControl); 向容器中添加控件,如果不是选中项则设置为非可见
    bool AddAt(CControlUI* pControl, int iIndex); 将控件添加到容器控件列表的指定位置,不为选中项为非可见
    bool Remove(CControlUI* pControl); 移除控件
    void RemoveAll(); 移除所有控件
    int GetCurSel() const; 得到当前选中的控件项(可见控件)
    bool SelectItem(int iIndex); 设置控件项为选中项(设置为可见控件)

    void SetPos(RECT rc); 设置容器及其控件位置

    void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); 设置属性

  m_iCurSel - 当前选中控件(可见)

=======================update 20110731am=============
37 CSafeRelease 安全释放对象t
    CSafeRelease(T* p) : m_p(p) { }; 构造
    ~CSafeRelease() { if( m_p != NULL ) m_p->Release(); }; 析构
    T* Detach() { T* t = m_p; m_p = NULL; return t; }; 分离
    T* m_p; 对象指针

38 CActiveXUI
    CActiveXUI(); 构造
    virtual ~CActiveXUI(); 析构

    LPCTSTR GetClass() const; 得到控件类名
    LPVOID GetInterface(LPCTSTR pstrName); 得到控件指针

    HWND GetHostWindow() const; 得到宿主窗口句柄

    //设置获取延时创建activeX控件
    bool IsDelayCreate() const;
    void SetDelayCreate(bool bDelayCreate = true);

    bool CreateControl(const CLSID clsid); 按clsid创建控件
    bool CreateControl(LPCTSTR pstrCLSID); 按activeX名创建控件
    HRESULT GetControl(const IID iid, LPVOID* ppRet); 获取控件接口
    CLSID GetClisd() const;得到ActiveX控件id
    CStdString GetModuleName() const; 得到控件名称
    void SetModuleName(LPCTSTR pstrText); 设置控件名称

    void SetVisible(bool bVisible = true); 设置是否可见
    void SetInternVisible(bool bVisible = true);
    void SetPos(RECT rc); 设置控件位置
    void DoPaint(HDC hDC, const RECT& rcPaint); 绘制CActiveXCtrl::IViewObject::Draw()

    void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);设置控件属性

    LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled);消息处理

protected:
    void ReleaseControl(); //释放控件
     设置宿主窗口句柄为空
     得到IObjectWithSite接口对象
     IObjectWithSite::SetSite(NULL)
     IObjectWithSite::Release()
     IOleObject::Close(OLECLOSE_NOSAVE)
     IOleObject::SetClientSite(NULL)
    IOleObject::Release()
    CActiveCtrl::Release()

    bool DoCreateControl(); //创建控件
    //释放控件
    //获取IOleControl
     通过模块名调用DllGetClassObject()获取IClassFactory创建IOleControl
    //通过IOleControl枚举出IOleObject[m_pUnk]
    新建CActiveXCtrl
    IOleObject获取ActiveX控件状态
    CActiveXCtrl枚举出IOleClientSite[]
    IOleObject::SetClientSite(IOleClientSite)
    IOleObject枚举出IPersistStreamInit
    IPersistStreamInit::InitNew()
    IPersistStreamInit::Release()
    获取IViewObject 获取显示对象
    IOleObject::DoVerb() //完成激活控件

protected:
    CLSID m_clsid; ActiveX的ID
    CStdString m_sModuleName;ActiveX的模块名
    bool m_bCreated; 是否被创建
    bool m_bDelayCreate; 是否延时创建
    IOleObject* m_pUnk; 提供嵌入对象与其容器之间的联系
    CActiveXCtrl* m_pControl;  ActiveX容器控件
    HWND m_hwndHost;宿主窗口句柄
   
39 CActiveXWnd
public:
    HWND Init(CActiveXCtrl* pOwner, HWND hWndParent);

    LPCTSTR GetWindowClassName() const;
    void OnFinalMessage(HWND hWnd);

    LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);

protected:
    void DoVerb(LONG iVerb);

    LRESULT OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

protected:
    CActiveXCtrl* m_pOwner;

40 CActiveXEnum
    CActiveXEnum(IUnknown* pUnk) : m_pUnk(pUnk), m_dwRef(1), m_iPos(0)
    {
        m_pUnk->AddRef();
    }
    ~CActiveXEnum()
    {
        m_pUnk->Release();
    }

    LONG m_iPos;
    ULONG m_dwRef;
    IUnknown* m_pUnk;

    STDMETHOD_(ULONG,AddRef)()
    {
        return ++m_dwRef;
    }
    STDMETHOD_(ULONG,Release)()
    {
        LONG lRef = --m_dwRef;
        if( lRef == 0 ) delete this;
        return lRef;
    }
    STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject)
    {
        *ppvObject = NULL;
        if( riid == IID_IUnknown ) *ppvObject = static_cast(this);
        else if( riid == IID_IEnumUnknown ) *ppvObject = static_cast(this);
        if( *ppvObject != NULL ) AddRef();
        return *ppvObject == NULL ? E_NOINTERFACE : S_OK;
    }
    STDMETHOD(Next)(ULONG celt, IUnknown **rgelt, ULONG *pceltFetched)
    {
        if( pceltFetched != NULL ) *pceltFetched = 0;
        if( ++m_iPos > 1 ) return S_FALSE;
        *rgelt = m_pUnk;
        (*rgelt)->AddRef();
        if( pceltFetched != NULL ) *pceltFetched = 1;
        return S_OK;
    }
    STDMETHOD(Skip)(ULONG celt)
    {
        m_iPos += celt;
        return S_OK;
    }
    STDMETHOD(Reset)(void)
    {
        m_iPos = 0;
        return S_OK;
    }
    STDMETHOD(Clone)(IEnumUnknown **ppenum)
    {
        return E_NOTIMPL;
    }
   
41 CActiveXFrameWnd
public:
    CActiveXFrameWnd(CActiveXUI* pOwner) : m_dwRef(1), m_pOwner(pOwner), m_pActiveObject(NULL)
    {
    }
    ~CActiveXFrameWnd()
    {
        if( m_pActiveObject != NULL ) m_pActiveObject->Release();
    }

    ULONG m_dwRef;
    CActiveXUI* m_pOwner;
    IOleInPlaceActiveObject* m_pActiveObject;

    // IUnknown
    STDMETHOD_(ULONG,AddRef)()
    {
        return ++m_dwRef;
    }
    STDMETHOD_(ULONG,Release)()
    {
        ULONG lRef = --m_dwRef;
        if( lRef == 0 ) delete this;
        return lRef;
    }
    STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject)
    {
        *ppvObject = NULL;
        if( riid == IID_IUnknown ) *ppvObject = static_cast(this);
        else if( riid == IID_IOleWindow ) *ppvObject = static_cast(this);
        else if( riid == IID_IOleInPlaceFrame ) *ppvObject = static_cast(this);
        else if( riid == IID_IOleInPlaceUIWindow ) *ppvObject = static_cast(this);
        if( *ppvObject != NULL ) AddRef();
        return *ppvObject == NULL ? E_NOINTERFACE : S_OK;
    } 
    // IOleInPlaceFrameWindow
    STDMETHOD(InsertMenus)(HMENU /*hmenuShared*/, LPOLEMENUGROUPWIDTHS /*lpMenuWidths*/)
    {
        return S_OK;
    }
    STDMETHOD(SetMenu)(HMENU /*hmenuShared*/, HOLEMENU /*holemenu*/, HWND /*hwndActiveObject*/)
    {
        return S_OK;
    }
    STDMETHOD(RemoveMenus)(HMENU /*hmenuShared*/)
    {
        return S_OK;
    }
    STDMETHOD(SetStatusText)(LPCOLESTR /*pszStatusText*/)
    {
        return S_OK;
    }
    STDMETHOD(EnableModeless)(BOOL /*fEnable*/)
    {
        return S_OK;
    }
    STDMETHOD(TranslateAccelerator)(LPMSG /*lpMsg*/, WORD /*wID*/)
    {
        return S_FALSE;
    }
    // IOleWindow
    STDMETHOD(GetWindow)(HWND* phwnd)
    {
        if( m_pOwner == NULL ) return E_UNEXPECTED;
        *phwnd = m_pOwner->GetManager()->GetPaintWindow();
        return S_OK;
    }
    STDMETHOD(ContextSensitiveHelp)(BOOL /*fEnterMode*/)
    {
        return S_OK;
    }
    // IOleInPlaceUIWindow
    STDMETHOD(GetBorder)(LPRECT /*lprectBorder*/)
    {
        return S_OK;
    }
    STDMETHOD(RequestBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/)
    {
        return INPLACE_E_NOTOOLSPACE;
    }
    STDMETHOD(SetBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/)
    {
        return S_OK;
    }
    STDMETHOD(SetActiveObject)(IOleInPlaceActiveObject* pActiveObject, LPCOLESTR /*pszObjName*/)
    {
        if( pActiveObject != NULL ) pActiveObject->AddRef();
        if( m_pActiveObject != NULL ) m_pActiveObject->Release();
        m_pActiveObject = pActiveObject;
        return S_OK;
    }
   
42 CActiveXCtrl
public:
    CActiveXCtrl();
    ~CActiveXCtrl();

    // IUnknown
    STDMETHOD_(ULONG,AddRef)();
    STDMETHOD_(ULONG,Release)();
    STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject);

    // IObjectWithSite
    STDMETHOD(SetSite)(IUnknown *pUnkSite);
    STDMETHOD(GetSite)(REFIID riid, LPVOID* ppvSite);

    // IOleClientSite
    STDMETHOD(SaveObject)(void);      
    STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk);
    STDMETHOD(GetContainer)(IOleContainer** ppContainer);       
    STDMETHOD(ShowObject)(void);       
    STDMETHOD(OnShowWindow)(BOOL fShow);       
    STDMETHOD(RequestNewObjectLayout)(void);

    // IOleInPlaceSiteWindowless
    STDMETHOD(CanWindowlessActivate)(void);
    STDMETHOD(GetCapture)(void);
    STDMETHOD(SetCapture)(BOOL fCapture);
    STDMETHOD(GetFocus)(void);
    STDMETHOD(SetFocus)(BOOL fFocus);
    STDMETHOD(GetDC)(LPCRECT pRect, DWORD grfFlags, HDC* phDC);
    STDMETHOD(ReleaseDC)(HDC hDC);
    STDMETHOD(InvalidateRect)(LPCRECT pRect, BOOL fErase);
    STDMETHOD(InvalidateRgn)(HRGN hRGN, BOOL fErase);
    STDMETHOD(ScrollRect)(INT dx, INT dy, LPCRECT pRectScroll, LPCRECT pRectClip);
    STDMETHOD(AdjustRect)(LPRECT prc);
    STDMETHOD(OnDefWindowMessage)(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult);

    // IOleInPlaceSiteEx
    STDMETHOD(OnInPlaceActivateEx)(BOOL *pfNoRedraw, DWORD dwFlags);       
    STDMETHOD(OnInPlaceDeactivateEx)(BOOL fNoRedraw);      
    STDMETHOD(RequestUIActivate)(void);

    // IOleInPlaceSite
    STDMETHOD(CanInPlaceActivate)(void);      
    STDMETHOD(OnInPlaceActivate)(void);       
    STDMETHOD(OnUIActivate)(void);
    STDMETHOD(GetWindowContext)(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc,
      LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo);
    STDMETHOD(Scroll)(SIZE scrollExtant);
    STDMETHOD(OnUIDeactivate)(BOOL fUndoable);
    STDMETHOD(OnInPlaceDeactivate)(void);
    STDMETHOD(DiscardUndoState)( void);
    STDMETHOD(DeactivateAndUndo)( void);
    STDMETHOD(OnPosRectChange)(LPCRECT lprcPosRect);

    // IOleWindow
    STDMETHOD(GetWindow)(HWND* phwnd);
    STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode);

    // IOleControlSite
    STDMETHOD(OnControlInfoChanged)(void);     
    STDMETHOD(LockInPlaceActive)(BOOL fLock);      
    STDMETHOD(GetExtendedControl)(IDispatch** ppDisp);       
    STDMETHOD(TransformCoords)(POINTL* pPtlHimetric, POINTF* pPtfContainer, DWORD dwFlags);      
    STDMETHOD(TranslateAccelerator)(MSG* pMsg, DWORD grfModifiers);
    STDMETHOD(OnFocus)(BOOL fGotFocus);
    STDMETHOD(ShowPropertyFrame)(void);

    // IOleContainer
    STDMETHOD(EnumObjects)(DWORD grfFlags, IEnumUnknown** ppenum);
    STDMETHOD(LockContainer)(BOOL fLock);

    // IParseDisplayName
    STDMETHOD(ParseDisplayName)(IBindCtx* pbc, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut);

protected:
    HRESULT CreateActiveXWnd();

protected:
    LONG m_dwRef;
    CActiveXUI* m_pOwner;
    CActiveXWnd* m_pWindow;
    IUnknown* m_pUnkSite;
    IViewObject* m_pViewObject;
    IOleInPlaceObjectWindowless* m_pInPlaceObject;
    bool m_bLocked;
    bool m_bFocused;
    bool m_bCaptured;
    bool m_bUIActivated;
    bool m_bInPlaceActive;
    bool m_bWindowless;
   
43 CComboWnd -CCombo控件下拉窗体
public:
    void Init(CComboUI* pOwner);初始化Combo窗口
    1 计算窗口创建位置
    2 创建窗口
    LPCTSTR GetWindowClassName() const;
    void OnFinalMessage(HWND hWnd);
    窗口被销毁时,最后消息处理函数

    LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);消息处理
    WM_CREATE:创建一个纵向排列容器控件,把项加入容器中
    WM_CLOSE:CComboUI::SetManager() CComboUI::SetPos9) CComboUI::SetFocus()
    WM_LBUTTONUP:查找当鼠标位置,如果当前位置有控件并不是滚动条控件则向自身发送失去焦点消息
    WM_KEYDOWN:空格键 恢复原来选项 回车键向自身发送失去焦点消息其他键交由CComboUI::DoEvent()处理
    WM_MOUSEWHEEL:由CComboUI::DoEvent
    WM_KILLFOCUS:向自身发送WM_CLOSE
    void EnsureVisible(int iIndex);
    1 计算位置
    2 Scroll
    void Scroll(int dx, int dy);
    设置纵向滚动条位置

public:
    CPaintManagerUI m_pm;   绘制管理者
    CComboUI* m_pOwner; ComboUI控件
    CVerticalLayoutUI* m_pLayout; 纵向容器
    int m_iOldSel; 上一次选中项
   
44 CComboUI - Combo控件
    CComboUI(); //构造

    LPCTSTR GetClass() const;
    LPVOID GetInterface(LPCTSTR pstrName);

    void DoInit();初始化
     如果选中项序号为-1设置第0项为选中项
    UINT GetControlFlags() const;
    返回tab切换停留属性

    CStdString GetText() const; 得到文本
    void SetEnabled(bool bEnable = true); 设置可用

    CStdString GetDropBoxAttributeList(); 获取下拉框属性列表字符串
    void SetDropBoxAttributeList(LPCTSTR pstrList); 设置下拉框属性列表字符串
    SIZE GetDropBoxSize() const;得到下拉框大小
    void SetDropBoxSize(SIZE szDropBox);设置下拉框大小

    int GetCurSel() const;  获取当前选中项
    bool SelectItem(int iIndex); 设置当前选中项

    bool SetItemIndex(CControlUI* pControl, int iIndex); 按项的控件指针获取项序号
    bool Add(CControlUI* pControl); 加入一项
    bool AddAt(CControlUI* pControl, int iIndex); 加入一项到列表指定位置
    bool Remove(CControlUI* pControl); 按项控件的指针移除一项
    bool RemoveAt(int iIndex); 移除指定序号的一项
    void RemoveAll(); 移除所有项

    bool Activate(); 设置控件活跃
     如果处于非活跃状态,且下拉窗口未创建,则创建下拉窗口

    RECT GetTextPadding() const; 获取文本与控件边缘的间距
    void SetTextPadding(RECT rc); 设置文本与控件边缘的间距
    LPCTSTR GetNormalImage() const; 获取正常状态图
    void SetNormalImage(LPCTSTR pStrImage); 设置正常状态图
    LPCTSTR GetHotImage() const; 获取活跃状态图
    void SetHotImage(LPCTSTR pStrImage);设置活跃状态图
    LPCTSTR GetPushedImage() const; 获取按下状态图
    void SetPushedImage(LPCTSTR pStrImage); 设置按下状态图
    LPCTSTR GetFocusedImage() const; 获取焦点状态图
    void SetFocusedImage(LPCTSTR pStrImage);设置焦点状态图
    LPCTSTR GetDisabledImage() const; 非可用状态图
    void SetDisabledImage(LPCTSTR pStrImage); 设置非可用状态图

    TListInfoUI* GetListInfo(); 获取列表信息
    void SetItemFont(int index); 设置项字体
    void SetItemTextStyle(UINT uStyle); 设置项字体大小
    RECT GetItemTextPadding() const 得到项文本间距
    void SetItemTextPadding(RECT rc);设置项文本间距
    DWORD GetItemTextColor() const; 设置项文本色
    void SetItemTextColor(DWORD dwTextColor);得到项目文本色
    DWORD GetItemBkColor() const; 获取项背景色
    void SetItemBkColor(DWORD dwBkColor);设置项背景色
    LPCTSTR GetItemImage() const; 获取项图
    void SetItemImage(LPCTSTR pStrImage); 设置项图
    DWORD GetSelectedItemTextColor() const;选中状态项文本色
    void SetSelectedItemTextColor(DWORD dwTextColor);设置选中状态文本色
    DWORD GetSelectedItemBkColor() const;得到选中项背景色
    void SetSelectedItemBkColor(DWORD dwBkColor);设置项选中状态背景图
    LPCTSTR GetSelectedItemImage() const;获取选中项背景图
    void SetSelectedItemImage(LPCTSTR pStrImage);设置项选中状态背景图
    DWORD GetHotItemTextColor() const;获取项活跃状态文本色
    void SetHotItemTextColor(DWORD dwTextColor);设置项活跃状态文本色
    DWORD GetHotItemBkColor() const;获取项活跃状态背景色
    void SetHotItemBkColor(DWORD dwBkColor);设置项活跃状态背景色
    LPCTSTR GetHotItemImage() const;后去项活跃状态图
    void SetHotItemImage(LPCTSTR pStrImage);设置项活跃状态图
    DWORD GetDisabledItemTextColor() const;得到项非可用状态文本色
    void SetDisabledItemTextColor(DWORD dwTextColor);设置非可用项文本色
    DWORD GetDisabledItemBkColor() const;获取项非可用状态背景色
    void SetDisabledItemBkColor(DWORD dwBkColor);设置项非可用状态背景色
    LPCTSTR GetDisabledItemImage() const; 设置项非可用状态图
    void SetDisabledItemImage(LPCTSTR pStrImage);获取项非可用状态图
    DWORD GetItemLineColor() const;获取项边框色
    void SetItemLineColor(DWORD dwLineColor);设置项边框色
    bool IsItemShowHtml(); 项是否使用内嵌html标识语言
    void SetItemShowHtml(bool bShowHtml = true);设置项是否使用内嵌html标识语言

    SIZE EstimateSize(SIZE szAvailable);计算控件大小
    void SetPos(RECT rc);设置控件位置
    void DoEvent(TEventUI& event);事件处理
    void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);设置属性
   
    void DoPaint(HDC hDC, const RECT& rcPaint);绘制
    void PaintText(HDC hDC);绘制文本
    void PaintStatusImage(HDC hDC);绘制状态图

protected:
    CComboWnd* m_pWindow; 下拉框窗口

    int m_iCurSel; 当前选中项
    RECT m_rcTextPadding; 文本与控件边缘间距
    CStdString m_sDropBoxAttributes; 下拉框属性
    SIZE m_szDropBox; 下拉框窗体大小
    UINT m_uButtonState; 控件状态

    CStdString m_sNormalImage; 正常状态图
    CStdString m_sHotImage; 活跃状态图
    CStdString m_sPushedImage; 按下状态图
    CStdString m_sFocusedImage; 获得焦点状态图
    CStdString m_sDisabledImage; 非可用状态图

    TListInfoUI m_ListInfo; 下拉框项的列表

你可能感兴趣的:(Directui相关)