duilib各种Api

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<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  
  
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<IEnumUnknown*>(this);  
        else if( riid == IID_IEnumUnknown ) *ppvObject = static_cast<IEnumUnknown*>(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<IOleInPlaceFrame*>(this);  
        else if( riid == IID_IOleWindow ) *ppvObject = static_cast<IOleWindow*>(this);  
        else if( riid == IID_IOleInPlaceFrame ) *ppvObject = static_cast<IOleInPlaceFrame*>(this);  
        else if( riid == IID_IOleInPlaceUIWindow ) *ppvObject = static_cast<IOleInPlaceUIWindow*>(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; 下拉框项的列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值