https://github.com/zanders3/json是一个C#实现的json库,只有几百行代码,为了简便牺牲了效率(No JIT Emit support to parse structures quickly)。

接口

  • 将json字符串解析成c#中的T类型
T TinyJson.JSONParser.FromJson< T >(this string json)
  • 将C#的object导出成json格式的字符串
string TinyJson.JSONWriter.ToJson(this object item)

json结构与C#的对应关系

  • object应设为c#中的dictionary<string,object>或object;

  • array映射为ArrayList;number映射为int,float或double;

  • string还是string;boolean还是boolean。

实现思路

如果是基本数据类型则直接返回,如果是容器类型则以递归的方式根据不同类型调用不同方法进行解析和序列化。

示例

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using TinyJson;
namespace TinyJsonTester
{
    class Program
    {
        static void Main(string[] args)
        {
            object json = new Dictionary< string, object >
            {
                {"string", "" },
                {"number", new Dictionary< string, object > {
                                {"int",0 },
                                {"float", 0.1f },
                                {"double", 0.0001 }
                            }
                },
                {"array", new ArrayList {
                                    0,
                                    "0",
                                    null,
                                    true
                                }
                }
            };
            string jsonText = JSONWriter.ToJson(json);
            Console.WriteLine(jsonText);
            Dictionary< string, object > root = JSONParser.FromJson< Dictionary< string, object > > (jsonText);
            string stringValue = (string)root["string"];
            //Dictionary< string, object > number = (Dictionary< string, object >)root["number"];
            float f = (float)(double)((Dictionary< string, object >)root["number"])["float"];
            //List< object > array = (List< object >)root["array"];
            int zero = (int)(((List< object >)root["array"])[0]);
            Console.WriteLine($"{root}, {stringValue}, {f} , {zero}");
        }
    }
}
标签: json, CSharp
日期: 2016-12-16 17:30:06, 8 years and 30 days ago


Version:1.0
<!--
date:20110820c
Author:studyduilib
changelog:
  add file
todo:
  Synchronous with the lastest duilib source
-->
* duilib架构
  * 模块结构
    <img src=duilib_sa_html/duilib_architecture_v1.2.jpg>
  * 文件结构
    * stb_image.c
    * stdafx.h stdafx.cpp
    * UIActiveX.h UIActiveX.cpp
    * UIBase.h UIBase.cpp
    * UICombo.h UICombo.cpp
    * UICommonControls.h UICommonControls.cpp
    * UIContainer.h UIContainer.cpp
    * UIControl.h UIControl.cpp
    * UIDelegate.h UIDelegate.cpp
    * UIDlgBuilder.h UIDlgBuilder.cpp
    * UIlib.h UIlib.cpp
    * UIList.h UIList.cpp
    * UIManager.h UIManager.cpp
    * UIMarkup.h UIMarkup.cpp
    * UIRender.h UIRender.cpp
    * UIRichEdit.h UIRichEdit.cpp
    * XUnzip.cpp
  * 消息处理机制
     1 创建  通过CreateEx最后一个参数传递类指针this, 在消息处理函数中对WM_NCCREATE消息进行处理, 通过SetWindowLongPtr(GWLP_USERDATA)进行保存
     2 消息处理  在消息处理函数通过GetWindowLongPtr(GWLP_USERDATA)得到其类指针, 调用虚函数HandleMessage()响应其他消息。
     3 销毁  消息处理函数中对WM_NCDESTROY消息进行处理, 调用原消息处理函数, 重置(GWLP_USERDATA), 调用虚函数OnFinalMessage()做最后处理。
  * 绘制过程
    <img src=duilib_sa_html/duilib_paint_v1.0.jpg>

* 第三方库简介
  * stb_image
    * 版本 1.29
    * 描述 载入各种图片格式文件
    * 函数
      * 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()
        * 功能  释放已加载的图片数据
  * XUnzip
    * 版本 1.3 
    * 描述 解压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)

* 预编译模块与uilib模块
  * 预处理模块
    * [macro] lengthof(x) 计算数组长度宏
    * [macro] MAX 两值最大
    * [macro] MIN 两值最小
    * [macro] CLAMP(x,a,b)  x在a,b之间则取x否则取最小,在a小于b时才有意义
    * [library] winmm.lib Windows多媒体相关应用程序接口库
    * [library] comctl32.lib  Windows通用控件库
  * uilib模块
    * 导出导入宏
    * 包含系统的头文件
    * 包含duilib库的公共头文件
    * Bjarke Viksoe UI library lisence
    * dllmain() 函数
* 基础模块
  * [macro] UI_WNDSTYLE_ 窗口风格属性 
    * UI_WNDSTYLE_CONTAINER 容器 
    * UI_WNDSTYLE_FRAME 框架 
    * UI_WNDSTYLE_CHILD 子窗口 
    * UI_WNDSTYLE_DIALOG 对话框 
    * UI_WNDSTYLE_EX_FRAME 扩展框架 
    * UI_WNDSTYLE_EX_DIALOG 扩展对话框 
  * [macro] UI_CLASSSTYLE_ 窗口类属性 
    * UI_CLASSSTYLE_CONTAINER 容器 
    * UI_CLASSSTYLE_FRAME 框架 
    * UI_CLASSSTYLE_CHILD 子窗口 
    * UI_CLASSSTYLE_DIALOG 对话框 
  * [macro] ASSERT(expr)
    * 功能  断言 显示断言所在文件,行以及expr的内容
    * 参考  _ASSERTE(expr)
  * [macro] TRACE(LPCTSTR pstrFormat, ...)
    [+][function] void __Trace(LPCTSTR pstrFormat, ...)
    * 功能  调试信息
    * 参考  参考printf
  * [macro] TRACEMSG(UINT uMsg)
    [+][function] LPCTSTR __TraceMsg(UINT uMsg)
    * 功能  将windows消息转化成其对应的宏名
    * uMsg  Windows消息ID
    返回值  宏名(字符串)
  * [-][class]  STRINGorID  资源名称或ID
    * 继承  无
    * 描述  将资源ID和名称统一字符床形式名称
  * [+][class]  CPoint  点
    * 继承  tagPOINT
    * 方法
      CPoint(LPARAM lParam)  将消息中lParam转化成点
  * [+][class] CSize  尺寸
    * 继承  tagSIZE
  * [+][class]  CRect 矩形区域
    * 继承  tagRECT 
    * 方法 
      * void Empty()  设置left,right,top,bottom为零
      * void Join()  合并两个矩形产生一个包含两个矩形的新的矩形
      * 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]  CStdValArray 值数组
    * 说明
      实现与CStdPtrArray类似
      存储元素为值
  * [+][class]  CStdString 字符串  
    * 实现
      如果长度小于MAX_LOCAL_STRING_LEN(63)则在栈上分配, 否则在堆上分配
    * 方法 
      * void Assign(LPCTSTR pstr, int nLength = -1)
        * 功能  分配并存储字符串
        * 参数
          * pstr  字符串指针
          * nLength 字符串大小
  * [+][class]  CStdStringMap 字符串-指针map
    * 实现  
      使用times33哈希算法

  * [+][class] CWindowWnd windows窗口的封装类
    * 方法
      * RegisterWindowClass()  RegisterClass的封装
      * RegisterSuperclass()  超类化窗口
    * Subclass()  子类化窗口
      * ShowModal()  窗口模态化
      * __WndProc()  消息处理函数
      * __ControlProc()  超类化消息处理函数
  * [+][class]  CWaitCursor 沙漏形鼠标
    * 描述
      * 构造函数中设置鼠标形状为沙漏
      * 析构函数中还原鼠标形状

* 核心模块
  * [+][class] CRenderClip
    * 描述  渲染区域控制,设置在dc上绘制的区域,防止子控件绘制到父控件外侧(float属性控件除外)
    * 函数
      * GenerateClip()  产生一个剪切区域, hDC窗口句柄, rc区域, clip[out]剪切区
      * GenerateRoundClip()  产生一个圆角剪切区域, hDC窗口句柄, rc区域, width 横向圆角弧度, height纵向圆角弧度, clip[out]剪切区
      * UseOldClipBegin()  使用整个活跃区域作为剪切区, hDC窗口句柄, clip剪切区
      * UseOldClipEnd()  使用当前控件有效区域作为剪切区, hDC窗口句柄, clip剪切区
  * [+][class] CRenderEngine 渲染引擎
    * 函数  
    * LoadImage()
      * 功能  加载图像
      * bitmap  图像
      * type  类型
      * mask  隐蔽色
    * 实现
      1 读取文件,资源和zip包中图像文件数据到内存(通过HIWORD(bitmap.m_lpstr)区别从资源中或文件中加载MAKEINTRESOURCE  The return value is the specified value in the low-order word and zero in the high-order word. (from msdn))
      2 创建DIB
      3 通过stbi_load_from_memory加载数据文件并转化后复制到DIB中
      4 返回TImageInfo结构
    * DrawImage()
      * 功能  绘制图像
      * hDC  设备句柄
      * hBitmap  位图句柄
      * rc  对象区域
      * rcPaint  绘制区域
      * rcBmpPart  位图区域
      * rcConrners  拉伸区域
      * alphaChannel  alpha通道
      * uFade  透明度
      * hole  居中
      * xtiled  横向平铺
      * ytiled  纵向平铺
      * 实现  
        1 CreateCompatibleDC (创建内存设备句柄)
        2 SelectObject() (将位图选入内存设备句柄)
        3 AlphaBlend (alpha混合)
        4 BitBlt() or StretchBlt() (绘制到内存设备句柄)
        5 SelectObject() (将老的位图选入内存设备句柄)
        6 DeleteDC (释放内存设备句柄)
    * DrawImageString()
      * 功能  按标识字符串绘制图像
      * hDC  设备句柄
      * pManager  绘制管理者
      * rc  对象区域
      * rcPaint  绘制区域
      * pStrImage  标识字符串
      * pStrModify  标识字符串
      * 实现  
        1 分析标识字符串获取属性
          1.1 先分析pStrImage信息后再分析pStrModify的信息
        2 获取图像数据
        3 绘制图像
    * DrawColor()
      * 功能  绘制矩形
      * hDC  设备句柄
      * rc  对象区域
      * color  颜色(alpha, r, g, b)
      * 实现  
        如果不需要alpha混合则SetBkColor() ExtTextOut()
        否则 创建一个像素大小的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句柄
  * [-][class] INotifyUI  Listener interface
  * [-][class] IMessageFilterUI  MessageFilter interface
  * [+][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() 设置默认字体
      * 字体列表操作
        * GetCustomFontCount()  得到字体列表中项数量
        * AddFont()  加入一种字体到字体列表中
        * AddFontAt()  加入一种字体到字体列表的指定位置
        * GetFont()  按序号得到字体列表中的字体
        * GetFont()  按字体属性得到字体列表中的字体
        * FindFont(HFONT)  按句柄查找字体列表中的一项
        * FindFont(LPCTSTR, int, bool, bool, bool)  按属性查找字体列表中的一项
        * RemoveFont()   按句柄移除字体列表中的指定项
        * RemoveFontAt()  按序号移除字体列表中的指定项 
        * RemoveAllFonts()  移除字体列表中的所有项
        * GetFontInfo(int)  按序号得到字体列表中项的属性
        * GetFontInfo(HFONT)  按句柄得到字体列表中项的属性
      * 图片列表操作
        * GetImage(LPCTSTR bitmap) 获取图片项 如果列表中不存依次从其上层绘制管理者中获取
        * GetImageEx() 获取图片项 如果不存在则向图片列表中添加一项
        * RemoveAllImages() 移除图片列表中所有项
      * 默认属性列表操作
        * AddDefaultAttributeList() 加入项到默认属性列表
        * GetDefaultAttributeList() 从默认属性列表中获取项
        * RemoveDefaultAttributeList() 从默认属性列表中移除项
        * GetDefaultAttribultes() 获取默认属性列表中的项
        * RemoveAllDefaultAttributeList() 移除默认属性列表中所有项
      * AttachDialog() 将控件树附加到当前绘制管理者
      * InitControls() 初始化控件 把控件名称加入到绘制管理者的控件名map中
      * ReapObjects(CControlUI* pControl) 重置控件
      * 选项组操作
        * AddOptionGroup()
          * 功能 添加控件到组中
          * 实现 如果组选项存在则加入pControl到此组中 如果不存在则创建新组并加入pControl
        * GetOptionGroup()  通过名称得到选项组
        * RemoveOptionGroup()  移除组中控件 如果组中没有控件则移除组
        * RemoveAllOptionGroups()  移除所有选项组
      * GetFocus()  得到控件焦点
      * SetFocus(CControlUI* pControl)  控件获得焦点
      * SetNextTabControl()  得到标签页控件
      * 定时器操作
        * SetTimer()  设置一个定时器
        * KillTimer()  清除一个定时器
        * RemoveAllTimers()  清除所有定时器
      * SetCapture() 捕获鼠标
      * ReleaseCapture() 释放捕获鼠标
      * IsCaptured() 鼠标是否被捕获
      * AddNotifier()  加入一个Listener
      * RemoveNotifier()    移除一个Listener
      * SendNotify(TNotifyUI&)  发送一个通知
      * SendNotify(CControlUI*, LPCTSTR, WPARAM, LPARAM)  发送一个通知
      * AddPreMessageFilter()  加入一个预处理Message Filter
      * RemovePreMessageFilter()  移除一个预处理Message Filter
      * AddMessageFilter(IMessageFilterUI* pFilter)  加入一个Message Filter
      * RemoveMessageFilter(IMessageFilterUI* pFilter)  移除一个Message Filter

    * PostPaint控件操作
      * GetPostPaintCount() 得到PostPaint控件数量
      * AddPostPaint()  加入PostPaint控件
      * RemovePostPaint()  移除一个PostPaint控件
      * SetPostPaintIndex()  设置控件到指定的序列位置
    * AddDelayedCleanup() 加入控件到延迟处理列表当中
    * GetRoot() 得到根控件
    * FindControl(POINT) 调用根节点控件的函数, 按位置匹配控件
    * FindControl(CControlUI*, POINT) 调用父控件的函数, 按名字匹配控件
    * FindControl(LPCTSTR) 在控件名map中按名字匹配控件
    * FindControl(CControlUI*, LPCTSTR) 调用父控件的函数, 按名字匹配控件
    * MessageLoop() 消息循环
    * TranslateMessage() 消息处理
    * MessageHandler() 消息处理
    * PreMessageHandler() 消息预处理
    * 回调函数
      * 功能 比较属性(pData)与控件(pThis)的属性是否相同
      * 相关函数
        * __FindControlFromNameHash()  按名称查找控件的回调函数
        * __FindControlFromCount()  计算控件数目的回调函数
        * __FindControlFromPoint()  按位置查找控件的回调函数
        * __FindControlFromTab()  查找下一个相应tab的控件
        * __FindControlFromShortcut()  快捷方式对应的控件
        * __FindControlFromUpdate() 查找需要刷新的控件
        * __FindControlFromNameByParent()  查找子控件
  * 属性
    * 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  默认属性哈希表
    * HINSTANCE m_hInstance  应用程序对象实例句柄
    * HINSTANCE m_hResourceInstance  资源对象实例句柄
    * CStdString m_pStrResourcePath  资源路径
    * CStdString m_pStrResourceZip  zip包资源名称
    * CStdPtrArray m_aPreMessages  预处理消息队列
  * [+][class] UIMarkup   解析XML
    * CMarkup()
      * 功能  构造函数
      * pstrXML  xml数据
      * 实现
      初始化成员变量
      调用Load()
    * ~CMarkup()  析构函数
    * Load()
      * 功能  加载xml数据
      * pstrXML  xml数据
    * LoadFromMem()
      * 功能  从内存中加载xml数据
      * pByte  内存数据指针
      * dwSize  大小
      * encoding  编码方式
        * XMLFILE_ENCODING_UTF8(默认) 
        * XMLFILE_ENCODING_UNICODE
        * XMLFILE_ENCODING_ASNI
      * 实现
        1 进行编码转换
        2 申请控件
        3 复制数据

    * LoadFromFile()
      * 功能  从文件中加载xml数据
      * pstrFilename  文件名
      * encoding  编码方式
      * 实现
        1 判断资源类型是否为zip包,如果为zip包则进行解压
        2 调用LoadFromMem()
    * Release()  释放xml数据和元素信息数据
    * IsValid()  Markup是否有效
    * SetPreserveWhitespace()  设置是否保存空白行
    * GetLastErrorMessage()
      * 功能  得到错误信息
      * pstrMessage  [out]错误信息内容
      * cchMax  信息长度
    * GetLastErrorLocation()
      * 功能  得到出错位置
      * pstrSource  错误所在位置内容
      * cchMax  内容长度

    * GetRoot()  得到根节点
    * XMLELEMENT 元素结构
      <pre>
    tagXMLELEMENT  元素结构
    {
        ULONG iStart  在m_pstrXML中起始位置
        ULONG iChild  子标签在m_pstrXML中的位置
        ULONG iNext  同级下一个标签在m_pstrXML中的位置
        ULONG iParent  上一级标签在m_pstrXML中的位置
        ULONG iData  元素数据在m_pstrXML中的位置
    } XMLELEMENT
      </pre>
    * 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)
        * 实现
      <pre>
        for()
        {
          如果为顶层则返回
          填充element
          解析名字
          解析属性
          标签闭合方式
          如果为/>则continue
          如果为>则递归调用_Parse()
          如果为该标签的对应闭合标签 continue
        }
      </pre>
    * _ReserveElement()  申请保存元素空间
    * _SkipWhitespace(LPCTSTR&) 跳过空白
    * _SkipIdentifier(LPCTSTR&)   跳过标识符
    * _ParseData()
      * 功能  解析数据
      * pstrText  被解析的数据字符串
      * pstrData  解析后的数据字符串
      * cEnd  终止字符
    * _ParseMetaChar() 解析转义字符
    * _ParseAttributes() 解析属性
    * _Failed() 记录错误信息返回错误
  * [+][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()  是否有名为pstrName的属性
    * GetAttributeCount()  得到节点属性的数量
    * GetAttributeName(int)  按序号得到属性名称
    * GetAttributeValue(int, LPTSTR, SIZE_T)
      * 功能  得到属性
      * iIndex  属性序号
      * pstrValue  [out] 属性值字符串
      * cchMax  属性值字符串长度
    * GetAttributeValue(LPCTSTR pstrName, LPTSTR pstrValue, SIZE_T cchMax)
      * 功能  得到属性
      * pstrName  属性名
      * pstrValue  [out] 属性值字符串
      * cchMax  属性值字符串长度
    * _MapAttributes()  解析xml属性建立 属性名和值的表映射到xml数据的位置
    * MAX_XML_ATTRIBUTES = 64 属性最大数量限制
    * XMLATTRIBUTE 属性结构
    <pre>
      typedef struct
      {
          ULONG iName
          ULONG iValue
      } XMLATTRIBUTE  属性结构
    </pre>
    * int m_iPos  节点在xml数据中的位置
    * int m_nAttributes  属性数量
    * m_aAttributes[MAX_XML_ATTRIBUTES]  属性-值 映射xml位置 列表
    * m_pOwner CMarkup指针
  * [-][class] IDialogBuilderCallback
    * 功能  构建UI时回调类 用于创造用户自定义的控件
    * 函数  
      * virtual CControlUI* CreateControl(LPCTSTR)
        * 功能 创建用户自定义控件
        * pstrClass 控件名
  * [+][class] CDialogBuilder
    * UI构建者, 用于构建UI
    * 函数
      * CControlUI* Create(STRINGorID, LPCTSTR, IDialogBuilderCallback*, CPaintManagerUI*)
        * 功能  构建UI
        * xml  可以是一个内存xml数据或一个文件名
        * type = (UINT) 0  如果xml数据位于EXE资源中则type指定资源类型
        * pCallback = NULL  回调函数
        * pManager = NULL 绘制管理者指针
        * 实现  判断xml类型->加载xml数据->调用Create(pCallback, pManager)构建
      * CControlUI* Create(IDialogBuilderCallback*, CPaintManagerUI*)
        * 功能  构建UI
        * 实现  得到顶层Window标签,并解析属性->调用_Parse() 解析xml
      * void GetLastErrorMessage()
        * 功能 获取错误信息
      * void GetLastErrorLocation()
        * 功能 出错位置
      * [-]CControlUI* _Parse()
        * 实现
          <pre>
          for(循环顶级标签) 
          {
            按xml标签创建控件对象
            如果不是标准控件则调用m_pCallback->CreateControl()创建用户自定义控件对象
            如果有子节点则递归调用_Parse()
            因为某些属性和父窗口相关,比如selected,必须先Add到父窗口
            初始化控件默认属性
            根据xml数据解析处理控件属性
          }
        </pre>
    * 属性
      * CMarkup m_xml CMarkup对象
      * IDialogBuilderCallback* m_pCallback构建控件回调

* 控件模块
  * 控件基类
    * [+]class CControlUI  控件
      * GetName()  得到控件名称 名称为控件的唯一ID
      * SetName()  设置控件名称
      * GetInterface()  得到控件指针
      * GetClass()  得到控件类名
      * GetControlFlags()  得到控件的类型标志
      * Activate()  控件是否活跃 (非不可用状态,非不可见状态)
      * GetManager()  得到绘制管理者
      * SetMananer()
        * 功能  设置控件的绘制管理者
        * 实现
          1 设置控件管理者
          2 初始化
      * 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()  预设的参考值
      * 获取 OR 设置大小的限制值
        * GetMinWidth()
        * SetMinWidth()
        * GetMaxWidth()
        * SetMaxWidth()
        * GetMinHeight()
        * SetMinHeight()
        * GetMaxHeight()
        * SetMaxHeight()
      * SetRelativePos()  设置相对位置比例
      * SetRelativeParentSize()  设置父控件大小
      * GetRelativePos()  得到相对位置比例
      * IsRelativePos() -是使用相对位置
      * GetToolTip() 获取提示信息
      * SetToolTip() 设置提示信息
      * 获取 OR 设置 快捷键
        * GetShortcut()
        * SetShortcut()
      * IsContextMenuUsed() 获取上下文菜单是否被使用
      * 获取 OR 设置 用户数据(字符串)
        * GetUserData()
        * SetUserData()
      * 获取 OR 设置 用户指针
        * GetTag()
        * SetTag()
      * 获取 OR 设置 控件是否可见
        * IsVisible()
        * SetVisible()
      * SetInternVisible()  仅供内部调用,有些UI拥有窗口句柄,需要重写此函数
      * 获取 OR 设置 控件可用
        * IsEnabled()
        * SetEnabled()
      * 获取 OR 设置 是否处理鼠标事件
        * IsMouseEnabled()
        * SetMouseEnabled()
        * IsFocused() 控件是否获得焦点
        * SetFocuse() 设置控件获得焦点
        * IsFloat() 控件是否悬浮
        * SetFloat() 设置控件为悬浮
      * FindControl()  查找控件
      * Invalidate()
        * 功能  设置无效,引起刷新
        * 实现  循环至顶层控件为止, 计算当前无效区域与父控件交叉区域作为新无效区域。
      * 获取 OR 设置 需更新状态
        * IsUpdateNeeded()
        * NeedUpdate()
      * Init()  初始化控件事件响应, 在SetManager()中被调用
      * DoInit()  做初始化处理函数, 被Init()调用
      * DoEvent()  事件响应函数
      * SetAttribute()  设置属性, 根据解析后的名称对所关心的属性设置状态成员变量的值
      * ApplyAttributeList()  解析标签的属性字符串, 调用SetAttribute()
      * EstimateSize()  预估控件大小
      * DoPaint() 
        * 功能  控件绘制
        * 实现  绘制循序:背景颜色->背景图->状态图->文本->边框
      * PaintBkColor()
        * 功能  绘制背景色
      * PaintBkImage()
        * 功能  绘制背景图片
      * PaintStatusImage()
        * 功能  根据状态绘制背景图片
      * PaintText()  绘制文字
      * PaintBorder()  绘制边框
      * DoPostPaint() 延时绘制
        当容器被拖拽改变大小时,可以使用延时绘制
      * 事件源
        * 说明 可以通过委托的设计模式为初始化,销毁,事件处理过程中加入更多的处理过程
        * CEventSource OnInit  初始化事件源
        * CEventSource OnDestroy  销毁事件源
        * CEventSource OnEvent  事件响应事件源
  * 委托模式
    * [+]class CDelegateBase 委托模式中的虚基类
      * CDelegateBase()  构造函数,pObject为委托者的对象, pFn为执行方法
      * CDelegateBase()  拷贝构造函数
      * ~CDelegateBase()  析构函数
      * Equals() 比较两个委托者, true 一致 false不同
      * operator()  响应委托进行处理 event为响应的事件
      * CDelegateBase* Copy() = 0  拷贝一个委托者
      * GetFn()  得到执行方法
      * GetObject()  得到委托者对象
      * Invoke() = 0  调用执行方法
      * m_pObject  委托者
      * m_pFn  执行方法
    * [+]class CDelegateStatic 静态委托,委托者为空,但有执行过程
    * [+]class CDelegate 委托,委托者不为空
  * 产生委托
    * CDelegate<O, T> MakeDelegate(O* pObject, bool (T::* pFn)(TEventUI&))
    * CDelegateStatic MakeDelegate(bool (*pFn)(TEventUI&))
    * [+]class CEventSource  事件源
      * 加入一个委托者
        * operator+= (CDelegateBase& d)
        * operator+= (FnType pFn)
      * 删除一个委托者
        * operator-= (CDelegateBase& d)
        * operator-= (FnType pFn)
      * 响应事件进行处理
        * operator() (TEventUI& event)
        * CStdPtrArray m_aDelegates  委托者列表
  * 标签控件
    * [+]class CLabelUI  标签控件
      * CLabelUI()  构造函数
      * m_uTextStyle  样式, 默认居中
      * m_dwTextColor  可用时文字颜色
      * m_dwDisabledTextColor  不可用时文字颜色
      * m_iFont  字体序号
      * m_bShowHtml  是否使用内嵌hmtl标记格式
      * GetClass()  返回控件名
      * GetInterface()  得到对象指针
      * 获取 OR 设置 文本样式
        * GetTextStyle()
        * SetTextStyle()
      * 获取 OR 设置 可用状态文字颜色
        * SetTextColor()
        * GetTextColor()
        * 获取 OR 设置 为可用状态文字颜色
        * SetDisableTextColor()
        * GetDisabledTextColor()
      * 获取 OR 设置 控件使用的字体, 对应在字体列表中的序号
        * SetFont()
        * GetFont()
      * 获取 OR 设置 文字与边框之间填充距离
        * GetTextPadding()
        * SetTextPadding()
      * 获取 OR 设置 是否使用内嵌html标记格式
        * IsShowHtml()
        * SetShowHtml()
      * EstimateSize()  预估控件大小
      * DoEvent()  事件处理
      * SetAttribute()  设置属性
      * PaintText()  绘制文本
  * 按钮控件
    * [+]class CButtonUI
      * CButtonUI()  构造函数, 文本样式为单行居中
      * GetClass()  返回控件名
      * GetInterface()  得到对象指针
      * GetControlFlags()  得到控件的类型标志
      * DoEvent()  事件处理
        * 说明 非鼠标事件交给基类CLabelUI处理, 鼠标事件由此函数处理
      * Activate()
        * 功能  激活按钮控件
        * 实现  判断是否活跃,如活跃发送通知 
      * SetEnabled()  设置按钮控件是否可用
        * 实现  调用基类设置, 如不可用则清空按钮状态
      * 设置/获取 鼠标悬时文本的颜色
        * SetHotTextColor()
        * GetHotTextColor()
      * 设置/获取 按钮按下时文本颜色
        * SetPushedTextColor()
        * GetPushedTextColor()
      * 设置/获取 按钮获得焦点时文本颜色
        * SetFocusedTextColor()
        * GetFocusedTextColor()
      * 获取 OR 设置 正常状态下按钮背景图片
        * GetNormalImage()
        * SetNormalImage()
      * 获取 OR 设置 鼠标悬浮时按钮背景图片
        * SetHotImage()
        * GetHotImage()
      * 获取 OR 设置 按钮被按下时背景图片
        * GetPushedImage()
        * SetPushedImage()
      * 获取 OR 设置 按钮获得焦点时背景图片
        * GetFocusedImage()
        * SetFocusedImage()
      * 获取 OR 设置 非可用状态下按钮背景图片
        * GetDisabledImage()
        * SetDisabledImage()
      * EstimateSize()  预估大小
      * SetAttribute()  设置属性, 根据解析后的名称对所关心的属性设置状态成员变量的值
      * PaintText()  绘制文本
      * PaintStatusImage()  绘制状态背景图片
  * 选项控件
    * [+]class COptionUI  选项控件(如CheckBox RadioBox等)
      * COptionUI()  构造函数
      * ~COptionUI()  析构函数
        * 说明 如果该选项组没有其他选项 调用CPaintManaerUI::RemoveOptionGroup()移除选项组
      * GetClass()  返回控件名
      * GetInterface()  得到对象指针
      * SetManager()  设置绘制管理者, 父控件
      * 获取 OR 设置 选项所属组
        * GetGroup()
        * SetGroup()
      * 获取 OR 设置 选项是否处于选中状态
        * IsSelected()
        * Selected()
      * Activate()  激活选项控件
      * 获取 OR 设置 选中状态背景图片
        * GetSelectedImage()
        * SetSelectedImage()
      * 获取 OR 设置 前景图片
        * GetForeImage()
        * SetForeImage()
        * EstimateSize()  预估选项控件大小
        * SetAttribute()  设置属性, 根据解析后的名称对所关心的属性设置状态成员变量的值
        * PaintStatusImage()  绘制状态背景图片
  * 文本控件
    * [+]class CTextUI
      * CTextUI()  构造
      * ~CTextUI()  析构
      * GetClass()  返回控件名
      * GetControlFlags()  得到控件的类型标志
      * GetInterface()  得到对象指针
      * GetLinkContent()  得到当前控件中指定序号的超文本的内容
      * DoEvent()  事件处理
      * EstimateSize()  预估选项控件大小
      * PaintText()  绘制文字
      * MAX_LINK  超文本数量限制
      * m_nLinks  超文本数量
      * m_rcLinks  超文本区域数组
      * m_sLinks  超文本内容数组
      * m_bHoverLink  鼠标浮动的超文本链接序号
  * 进度条控件
    * [+]class CProgressUI
      * GetClass()  返回控件名
      * GetInterface()  得到对象指针
      * 获取 OR 设置 进度条方向
        * IsHorizontal()
        * SetHorizontal()
      * 获取 OR 设置 最小值
        * GetMinValue()
        * SetMinValue()
      * 获取 OR 设置 最大值
        * GetMaxValue()
        * SetMaxValue()
      * 获取 OR 设置 最小值
        * GetValue()
        * SetValue()
      * 获取 OR 设置 前景图
        * GetFgImage()
        * SetFgImage()
        * SetAttribute()  设置属性
        * PaintStatusImage()  绘制状态图
      * m_bHorizontal  进度条控件方向
      * m_nMax 最大值
      * m_nMin 最小值
      * m_nValue 当前值
      * CStdString m_sFgImage  前景图
      * CStdString m_sFgImageModify  前景图2
  * 滑块控件
    * [+]class CSliderUI
      * CSliderUI()  构造
      * GetClass()  返回控件名
      * GetInterface()  得到对象指针
      * UINT GetControlFlags() const   得到控件的类型标志
      * void SetEnabled()  设置滑块控件是否可用
      * 获取 OR 设置滑块步长
      * int GetChangeStep()
      * void SetChangeStep()
      * 获取 OR 设置滑块大小
      * void SetThumbSize()
      * RECT GetThumbRect() const
      * 获取 OR 设置滑块图
      * LPCTSTR GetThumbImage() const
      * void SetThumbImage()
      * 获取 OR 设置鼠标悬浮状态滑块图
      * LPCTSTR GetThumbHotImage() const
      * void SetThumbHotImage()
      * 获取 OR 设置滑块按下状态滑块图
      * LPCTSTR GetThumbPushedImage() const
      * void SetThumbPushedImage()
      * void DoEvent()  事件处理
      * void SetAttribute()  设置属性
      * void PaintStatusImage()  绘制状态图
      * SIZE m_szThumb  滑块大小
      * UINT m_uButtonState  控件状态
      * int m_nStep  步长
      * CStdString m_sThumbImage  正常状态滑块块图
      * CStdString m_sThumbHotImage  鼠标悬浮状态滑块图
      * CStdString m_sThumbPushedImage  按下状态滑块图
      * CStdString m_sImageModify  滑块图2
  * 编辑框控件
    * [+]class CEditUI
      * CEditUI()
      * GetClass()  返回控件名
      * GetInterface()  得到对象指针块
      * GetControlFlags() const  得到控件的类型标志
      * SetEnabled()  设置编辑框控件是否可用
      * SetText()  设置文本
      * SetMaxChar()  设置输入文本长度限制
      * GetMaxChar()  获取最大输入文本长度
      * SetReadOnly()  设置只读模式
      * IsReadOnly() const  获取只读模式
      * SetPasswordMode()  获取密码编辑框模式
      * IsPasswordMode() const  设置密码编辑模式
      * SetPasswordChar() 设置密码模式显示字符
      * GetPasswordChar() const 获取密码模式显示字符Edit_SetPasswordChar
      * 获取 OR 设置正常状态图
      * GetNormalImage() 
      * SetNormalImage()
      * 获取 OR 设置悬浮状态图
      * GetHotImage()
      * SetHotImage()
      * 获取 OR 设置获得焦点状态图
      * GetFocusedImage()
      * SetFocusedImage()
      * 获取 OR 设置非可用状态图
      * GetDisabledImage()
      * SetDisabledImage()
      * 获取 OR 设置原生编辑框背景色
      * SetNativeEditBkColor()
      * GetNativeEditBkColor() const
      * SetPos()  得到编辑框位置
      * SetVisible()  设置可见状态
      * SetInternVisible()   仅供内部调用,有些UI拥有窗口句柄,需要重写此函数
      * EstimateSize()  预估控件大小
      * DoEvent()  处理事件
      * SetAttribute()  设置属性
      * PaintStatusImage()  绘制状态图
      * PaintText()  绘制文本
      * 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  获取 OR 设置编辑框背景色
    * [+]class CEditWnd
      * CEditWnd()  构造函数
      * void Init() 初始化
      * RECT CalPos() 计算位置
      * LPCTSTR GetWindowClassName() 得到窗口类名
      * LPCTSTR GetSuperClassName() 得到超类化名
      * void OnFinalMessage() 窗口被摧毁后,最后消息处理
      * LRESULT HandleMessage() 处理消息
      * LRESULT OnKillFocus() 失去焦点消息
      * LRESULT OnEditChanged() 文本内容改变
      * CEditUI* m_pOwner 编辑框窗口拥有者
      * HBRUSH m_hBkBrush 背景画刷
  * 滚动条控件
      * * [+]class CScrollBarUI
      * CScrollBarUI()
      * GetClass()   返回控件名
      * GetInterface()  得到对象指针
      * CContainerUI* GetOwner()   得到滚动条拥有者
      * SetOwner() 设置滚动条拥有者
      * SetEnabled() 设置滚动条是否可用
      * SetFocus()
      * IsHorizontal() 获取滚动条方向
      * SetHorizontal()设置滚动条横竖方向
      * GetScrollRange()  得到滚动条范围
      * SetScrollRange() 设置滚动条范围
      * GetScrollPos()  得到滚动块位置
      * SetScrollPos() 设置滚动块位置
      * GetLineSize()  得到步长大小
      * SetLineSize() 设置步长大小
      * 获取 OR 设置 上或左位置的按钮 显示状态 正常状态图 悬浮状态图 按下状态图 非可用状态图
        * GetShowButton1() 获取 OR 设置显示上左按钮
        * SetShowButton1()
        * GetButton1NormalImage()
        * SetButton1NormalImage()
        * GetButton1HotImage()
        * SetButton1HotImage()
        * GetButton1PushedImage()
        * SetButton1PushedImage()
        * GetButton1DisabledImage()
        * SetButton1DisabledImage()
      * 获取 OR 设置 下或右位置的按钮 显示状态 正常状态图 悬浮状态图 按下状态图 非可用状态图
        * GetShowButton1() 获取 OR 设置显示上左按钮
        * GetShowButton2()
        * SetShowButton2()
        * GetButton2NormalImage()
        * SetButton2NormalImage()
        * GetButton2HotImage()
        * SetButton2HotImage()
        * GetButton2PushedImage()
        * SetButton2PushedImage()
        * GetButton2DisabledImage()
        * SetButton2DisabledImage()
      * 获取 OR 设置 滚动块 正常状态图 悬浮状态图 按下状态图 非可用状态图
        * GetThumbNormalImage()
        * SetThumbNormalImage()
        * GetThumbHotImage()
        * SetThumbHotImage()
        * GetThumbPushedImage()
        * SetThumbPushedImage()
        * GetThumbDisabledImage()
        * SetThumbDisabledImage()
      * 获取 OR 设置 滚动轨迹 正常状态图 悬浮状态图 按下状态图 非可用状态图
        * GetRailNormalImage()
        * SetRailNormalImage()
        * GetRailHotImage()
        * SetRailHotImage()
        * GetRailPushedImage()
        * SetRailPushedImage()
        * GetRailDisabledImage()
        * SetRailDisabledImage()
      * 获取 OR 设置 滚动条 背景图 悬浮状态图 按下状态图 非可用状态图
        * GetBkNormalImage()
        * SetBkNormalImage()
        * GetBkHotImage()
        * SetBkHotImage()
        * GetBkPushedImage()
        * SetBkPushedImage()
        * GetBkDisabledImage()
        * SetBkDisabledImage()
      * SetPos() 设置滚动条
      * DoEvent() 事件处理
      * SetAttribute() 设置属性
      * DoPaint() 绘制
      * PaintBk() 绘制背景
      * PaintButton1() 绘制上或左向的按钮
      * PaintButton2()绘制下或右位置的按钮
      * PaintThumb() 绘制滚动块
      * PaintRail()绘制滚动轨迹
      * 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
  * 布局器(容器)
    * [+]class IContainer 容器虚基类
      * GetItemAt()  [v]得到容器中控件项
      * GetItemIndex()  [v]按序号获取容器中控件项
      * SetItemIndex()  [v]设置控件项为容器中存在的指定序号的控件项
      * GetCount()  [v]获取容器控件项数
      * Add()  [v]增加一个控件到容器中
      * AddAt()  [v]插入一个控件到容器中
      *  Remove()  [v]删除容器中控件项
      *  RemoveAt()  [v]删除指定序号的容器控件项
      *  RemoveAll()  [v]删除所有容器中的控件
    * [+]class CContainerUI 容器控件
      * CContainerUI()  构造函数
      * ~CContainerUI()  析构函数
      * GetInterface()  得到控件指针
      * GetClass()  得到控件类名
      * GetItemAt()  得到容器中控件项
      * GetItemIndex()  按序号获取容器中控件项
      * SetItemIndex()  设置控件项为容器中存在的指定序号的控件项
      * GetCount()  获取容器控件项数
      * Add()  增加一个控件到容器中
      * AddAt()  插入一个控件到容器中
      * Remove()  删除容器中控件项
      * RemoveAt()  删除指定序号的容器控件项
      * DoEvent()  事件处理
      * SetVisible()  设置容器是否可见
      * SetInternVisible()  仅供内部调用,有些UI拥有窗口句柄,需要重写此函数
      * SetMouseEnabled()  设置是否处理鼠标事件
      * 获取 OR 设置内边距,相当于设置客户区
        * GetInset() -
        * SetInset() -
      * 获取 OR 设置容器内控件项是否自动摧毁
        * IsAutoDestroy()
        * SetAutoDestroy()
      * 获取 OR 设置容器本身是否延迟摧毁
        * IsDelayedDestroy()
        * SetDelayedDestroy()
      ?获取 OR 设置容器中控件是否响应鼠标事件
        * 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  是否使用纵滚动条
    * [+]class CVerticalLayoutUI 纵向布局的容器控件
      * CVerticalLayoutUI()
      * GetInterface()  得到控件指针
      * GetClass()  得到控件类名
      * GetControlFlags()  得到控件的类型标志
      * 分割栏高度
        * SetSepHeight()
        * GetSepHeight()
      * SetSepImmMode() 设置刷新模式 立即刷新或延时刷新
      * IsSepImmMode() 获取刷新模式
      * SetAttribute()  设置属性
      * DoEvent() 处理事件
      * SetPos() 设置位置
      * DoPostPaint() 绘制
      * GetThumbRect() 获取欲刷新的区域
      * m_iSepHeight 分隔栏高度
      * m_uButtonState 容器控件状态
      * ptLastMouse 鼠标位置
      * m_rcNewPos 刷新区域
      * m_bImmMode 立即刷新模式
    * [+]class CHorizontalLayoutUI 横向布局的容器控件
      * CHorizontalLayoutUI()  构造
      * GetInterface()  得到控件指针
      * GetClass()  得到控件类名
      * GetControlFlags()  得到控件的类型标志
      * 获取 OR 设置分隔栏宽度
        * SetSepWidth()
        * GetSepWidth()
      * 获取 OR 设置刷新模式
        * SetSepImmMode()
        * IsSepImmMode()
      * SetAttribute()  设置属性
      * DoEvent()  处理事件
      *  SetPos()  设置容器位置及容器中控件项位置
      *  DoPostPaint()  延迟绘制
      *  GetThumbRect()  获取刷新区域
      *  m_iSepWidth  分隔栏宽度
      *  m_uButtonState  控件状态
      *  ptLastMouse  鼠标位置
      *  m_rcNewPos  设置位置
      *  m_bImmMode  立即刷新模式
    * [+]class CTileLayoutUI  平铺布局
      * CTileLayoutUI()  构造
      * GetClass()  得到控件类名
      * GetControlFlags()  得到控件的类型标志
      * SetPos()  设置容器及其容器内控件项位置
      * 获取 OR 设置 布局列数
        * GetColumns()
        * SetColumns()
      * SetAttribute()  设置属性
      * m_nColumns  布局列数
    * [+]class CDialogLayoutUI 对话框容器控件
      * CDialogLayoutUI() 构造
      * GetInterface()  得到控件指针
      * GetClass()  得到控件类名
      * SetStretchMode() 拉伸模式
      * SetPos() 设置容器及其容器内控件项位置
      * EstimateSize() 预估大小
      * RecalcArea() 重新计算区域 
      * STRETCHMODE 拉伸模式结构
      * m_aModes 拉伸模式列表
    * [+]class CTabLayoutUI 标签页容器
      * CTabLayoutUI() 构造
      * GetInterface()  得到控件指针
      * GetClass()  得到控件类名
      * Add() 向容器中添加控件,如果不是选中项则设置为非可见
      * AddAt() 将控件添加到容器控件列表的指定位置,不为选中项为非可见
      * Remove() 移除控件
      * RemoveAll() 移除所有控件
      * GetCurSel() const 得到当前选中的控件项(可见控件)
      * SelectItem() 设置控件项为选中项(设置为可见控件)
      * SetPos() 设置容器及其控件位置
      * SetAttribute() 设置属性
      * m_iCurSel  当前选中控件(可见)
  * ActiveX控件
    * 关系图
      <img src=duilib_sa_html/duilib_activex.jpg>
    * 描述 
      CActiveXCtrl 是一个ActiveX对象的容器
      CActiveXWnd 是一个窗口供有窗口需要的ActiveX对象使用
      CActiveXUI 为主要类包装了CActiveXCtrl和CActiveXWnd作为控件供用户使用
      CSafeRelease CActiveXEnum CActiveXFrameWnd为辅助类提供辅助功能
    * [+]class CSafeRelease 安全释放对象t
      * CSafeRelease() 构造
      * ~CSafeRelease() 析构
      * Detach() 分离
      * T* m_p 对象指针
    * [+]CActiveXUI
      * CActiveXUI() 构造
      * ~CActiveXUI() 析构
      * GetClass() 得到控件类名
      * GetInterface() 得到控件指针
      * GetHostWindow() 得到宿主窗口句柄
      * 获取 OR 设置延时创建activeX控件
        * IsDelayCreate()
        * SetDelayCreate()
        * CreateControl() 按clsid创建控件
        * CreateControl() 按activeX名创建控件
      * GetControl(const IID iid, LPVOID* ppRet) 获取控件接口
      * GetClisd() const得到ActiveX控件id
      * GetModuleName() const 得到控件名称
      * SetModuleName(LPCTSTR pstrText) 设置控件名称
      * SetVisible(bool bVisible = true) 设置是否可见
      * SetInternVisible(bool bVisible = true) 
      * SetPos(RECT rc) 设置控件位置
      * DoPaint(HDC hDC, const RECT& rcPaint) 绘制
        * 实现 调用CActiveXCtrl::IViewObject::Draw()
      * SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue)设置控件属性
      * MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled)消息处理
        * 实现
          通过m_bCaptured属性判断是否捕获鼠标时间
          通过IViewObjectEx::QueryHitPoint()判断鼠标是否在控件区域内
          如果是捕获或在区域内则处理鼠标消息,否则不处理
          调用IOleInPlaceSiteWindowless::OnWindowMessage()处理消息
      * ReleaseControl() 释放控件
        * 实现
          设置宿主窗口句柄为空
          得到IObjectWithSite接口对象
          IObjectWithSite::SetSite(NULL)
          IObjectWithSite::Release()
          IOleObject::Close(OLECLOSE_NOSAVE)
          IOleObject::SetClientSite(NULL)
          IOleObject::Release()
          CActiveCtrl::Release()

      * DoCreateControl() 创建控件
        * 实现
          释放控件
          创建与clsid关联的未初始化的对象pOleControl
          获取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() 完成激活控件
      * CLSID m_clsid ActiveX的ID
      * CStdString m_sModuleNameActiveX的模块名
      * bool m_bCreated 是否被创建
      * bool m_bDelayCreate 是否延时创建
      * IOleObject* m_pUnk 提供嵌入对象与其容器之间的联系
      * CActiveXCtrl* m_pControl  ActiveX容器控件
      * HWND m_hwndHost宿主窗口句柄
    * [+]class CActiveXWnd
      * Init() 创建窗口
      * GetWindowClassName() 得到窗口类名称
      * OnFinalMessage() 摧毁时,消息处理
      * HandleMessage()消息处理
        * 说明 处理WM_PAINT WM_SETFOCUS WM_KILLFOCUS WM_ERASEBKGND WM_MOUSEACTIVATE消息
      * DoVerb() 动作
        * 实现
          获取IOleObject接口
          获取IOleClientSite
          IOleObject::DoVerb()
      * OnMouseActivate()鼠标激活
        * 实现 获取当前对象是否支持激活状态,如果支持则DoVerb(OLEIVERB_INPLACEACTIVATE) 
      * OnSetFocus()设置焦点
        * 实现 DoVerb(OLEVERB_UIACTIVATE)
      * OnKillFocus()失去焦点
      * OnEraseBkgnd()清除背景
      * OnPaint()绘制
      * CActiveXCtrl* m_pOwner 窗口拥有者
    * [+]class CActiveXEnum
      * 继承 IEnumUnknown 
        枚举对象的IUnknown接口。它可用于通过一个包含多个对象的组件对象来枚举。
      * CActiveXEnum(IUnknown* pUnk) 构造
      * ~CActiveXEnum() 析构

      * LONG m_iPos 接口队列中
      * ULONG m_dwRef 引用
      * IUnknown* m_pUnk IUnknow指针
      * STDMETHOD_(ULONG,AddRef)() 引用加1
      * STDMETHOD_(ULONG,Release)() 引用减1,如果引用为0则释放
      * STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject) 查询接口 提供 IUnknown和IEnumUnknown
      * STDMETHOD(Next)(ULONG celt, IUnknown **rgelt, ULONG *pceltFetched) 取得一个IUnknow指针
      * STDMETHOD(Skip)(ULONG celt) 跳过一个
      * STDMETHOD(Reset)(void) 重置队列到开始位置
      * STDMETHOD(Clone)(IEnumUnknown **ppenum) 拷贝一份队列 不支持
    * [+]class CActiveXFrameWnd
      * 功能 控制容器顶层窗口,允许容器和控件之间互相插入移除菜单,显示状态文本可用非模态对话框等
      * CActiveXFrameWnd() 构造
      * ~CActiveXFrameWnd() 析构
      * ULONG m_dwRef 引用计数器
      * CActiveXUI* m_pOwner 容器
      * IOleInPlaceActiveObject* m_pActiveObject 提供控件与应用程序框架窗口和文档窗口直接通信的通道
      * IUnknown接口
        * STDMETHOD_(ULONG,AddRef)()
        * STDMETHOD_(ULONG,Release)()
        * STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject) 
      * IOleInPlaceFrameWindow接口
        * STDMETHOD(InsertMenus)(HMENU /*hmenuShared*/, LPOLEMENUGROUPWIDTHS /*lpMenuWidths*/)允许容器插入菜单
        * STDMETHOD(SetMenu)(HMENU /*hmenuShared*/, HOLEMENU /*holemenu*/, HWND /*hwndActiveObject*/) 加入混合菜单到窗口框架
        * STDMETHOD(RemoveMenus)(HMENU /*hmenuShared*/) 移除菜单
        * STDMETHOD(SetStatusText)(LPCOLESTR /*pszStatusText*/) 设置和现实状态文本
        * STDMETHOD(EnableModeless)(BOOL /*fEnable*/) 非模态窗口是否可用
        * STDMETHOD(TranslateAccelerator)(LPMSG /*lpMsg*/, WORD /*wID*/) 处理菜单快捷键
      * IOleWindow接口
        * STDMETHOD(GetWindow)(HWND* phwnd) 得到窗口句柄
        * STDMETHOD(ContextSensitiveHelp)(BOOL /*fEnterMode*/) 上下文帮助是否可用
      * IOleInPlaceUIWindow
        * STDMETHOD(GetBorder)(LPRECT /*lprectBorder*/) 得到工具栏和小控件放置区域
        * STDMETHOD(RequestBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/) 确认是否有放置工具栏和小控件的区域 返回 INPLACE_E_NOTOOLSPACE
        * STDMETHOD(SetBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/) 计算边框大小
        * STDMETHOD(SetActiveObject)(IOleInPlaceActiveObject* pActiveObject, LPCOLESTR /*pszObjName*/) 设置对象与窗口文档和框架直接通信的通道

    * [+]class CActiveXCtrl
      * 继承
        * IOleClientSite,    由容器向嵌入对象提供位置 显示 名称 用户接口等资源
        * IOleInPlaceSiteWindowless,  使一个无窗口对象能够响应windows消息,参与拖拽操作
        * IOleControlSite,  提供使site对象能够管理容器中的嵌入控件的方法
        * IObjectWithSite,  提供对象和在容器中的site的通信方式
        * IOleContainer  枚举一个复合文档中的对象或锁处于运行状态的容器。
        * CActiveXCtrl()
      * IUnknown接口
        * STDMETHOD_(ULONG,AddRef)()增加引用数
        * STDMETHOD_(ULONG,Release)()减少引用数
        * STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject)枚举提供的接口
      * IObjectWithSite
        * STDMETHOD(SetSite)(IUnknown *pUnkSite) 设置site的IUnknow接口
        * STDMETHOD(GetSite)(REFIID riid, LPVOID* ppvSite)获取site的接口
      * IOleClientSite
        * STDMETHOD(SaveObject)(void) 保存嵌入对象 为实现     
        * STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk) 获取名称 为实现
        * STDMETHOD(GetContainer)(IOleContainer** ppContainer) 得到容器指针
          * 实现 
              先通过site的IUnknow指针m_pUnkSite枚举IID_IOleContainer
              如果失败在调用QueryInterface枚举本身的IID_IOleContainer
        * STDMETHOD(ShowObject)(void)
          实现 调用IViewObject::Draw向其拥有者m_pOwner->m_hwndHost(ActiveUI中的宿主窗口)的DC绘制        
        * STDMETHOD(OnShowWindow)(BOOL fShow)  当内嵌对象可见或不可见时通知其容器 未实现      
        * STDMETHOD(RequestNewObjectLayout)(void) 请求容器调整显示site 未实现
      * IOleInPlaceSiteWindowless
        * STDMETHOD(CanWindowlessActivate)(void) 是否具有活跃性,返回S_OK
        * 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) 设置当激活时,是否重绘 
          * 实现 
            锁定已运行的对象
            获取框架窗口句柄
            处理无窗口的对象
            如果处理失败则创建ActiveX窗口
            设置激活状态为激活
        * STDMETHOD(OnInPlaceDeactivateEx)(BOOL fNoRedraw) 当失去活跃状态时,是否重绘       
        * STDMETHOD(RequestUIActivate)(void) 对象激活时通知容器

      * OleInPlaceSite
        * 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) 获取用于包装真实控件的扩展控件的IDispatch方法
        * 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)
          功能 解析显示名称,返回一个与之对应的名称
      * HRESULT CreateActiveXWnd()
      * LONG m_dwRef 引用次数
      * CActiveXUI* m_pOwner 拥有者
      * CActiveXWnd* m_pWindow 窗口句柄
      * IUnknown* m_pUnkSite site的IUnknow接口
      * IViewObject* m_pViewObject 绘制IUnknow接口
      * IOleInPlaceObjectWindowless* m_pInPlaceObject
      * bool m_bLocked 是否锁定
      * bool m_bFocused 是否获得焦点
      * bool m_bCaptured 是否捕获鼠标
      * bool m_bUIActivated 是否激活
      * bool m_bInPlaceActive 
      * bool m_bWindowless  是否是无窗体状态
  * 组合控件
    * [+]CComboUI  Combo控件
      * CComboUI() 构造
      * GetClass() 析构造
      * GetInterface()
      * DoInit()初始化
        说明 如果选中项序号为-1设置第0项为选中项
      * UINT GetControlFlags()
        * 说明 返回tab切换停留属性
      * CStdString GetText() 得到文本
      * SetEnabled() 设置可用
      * CStdString GetDropBoxAttributeList() 获取下拉框属性列表字符串
      * SetDropBoxAttributeList() 设置下拉框属性列表字符串
      * GetDropBoxSize() 得到下拉框大小
      * SetDropBoxSize()设置下拉框大小
      * int GetCurSel()  获取当前选中项
      * SelectItem() 设置当前选中项
      * SetItemIndex() 按项的控件指针获取项序号
      * Add() 加入一项
      * AddAt() 加入一项到列表指定位置
      * Remove() 按项控件的指针移除一项
      * RemoveAt() 移除指定序号的一项
      * RemoveAll() 移除所有项
      * Activate() 设置控件活跃
        * 说明 如果处于非活跃状态,且下拉窗口未创建,则创建下拉窗口
      * RECT GetTextPadding() 获取文本与控件边缘的间距
      * SetTextPadding() 设置文本与控件边缘的间距
      * GetNormalImage() 获取正常状态图
      * SetNormalImage() 设置正常状态图
      * GetHotImage() 获取活跃状态图
      * SetHotImage()设置活跃状态图
      * GetPushedImage() 获取按下状态图
      * SetPushedImage() 设置按下状态图
      * GetFocusedImage() 获取焦点状态图
      * SetFocusedImage()设置焦点状态图
      * GetDisabledImage() 非可用状态图
      * SetDisabledImage() 设置非可用状态图
      * TListInfoUI* GetListInfo() 获取列表信息
      * SetItemFont() 设置项字体
      * SetItemTextStyle() 设置项字体大小
      * RECT GetItemTextPadding() 得到项文本间距
      * SetItemTextPadding()设置项文本间距
      * GetItemTextColor() 设置项文本色
      * SetItemTextColor()得到项目文本色
      * GetItemBkColor() 获取项背景色
      * SetItemBkColor()设置项背景色
      * GetItemImage() 获取项图
      * SetItemImage() 设置项图
      * GetSelectedItemTextColor() t选中状态项文本色
      * SetSelectedItemTextColor()设置选中状态文本色
      * GetSelectedItemBkColor() 得到选中项背景色
      * SetSelectedItemBkColor()设置项选中状态背景图
      * GetSelectedItemImage() 获取选中项背景图
      * SetSelectedItemImage()设置项选中状态背景图
      * GetHotItemTextColor() 获取项活跃状态文本色
      * SetHotItemTextColor()设置项活跃状态文本色
      * GetHotItemBkColor() 获取项活跃状态背景色
      * SetHotItemBkColor()设置项活跃状态背景色
      * GetHotItemImage() 后去项活跃状态图
      * SetHotItemImage()设置项活跃状态图
      * GetDisabledItemTextColor() 得到项非可用状态文本色
      * SetDisabledItemTextColor()设置非可用项文本色
      * GetDisabledItemBkColor() 获取项非可用状态背景色
      * SetDisabledItemBkColor()设置项非可用状态背景色
      * GetDisabledItemImage() 设置项非可用状态图
      * SetDisabledItemImage()获取项非可用状态图
      * GetItemLineColor() 获取项边框色
      * SetItemLineColor()设置项边框色
      * IsItemShowHtml() 项是否使用内嵌html标识语言
      * SetItemShowHtml()设置项是否使用内嵌html标识语言
      * EstimateSize()计算控件大小
      * SetPos()设置控件位置
      * DoEvent()事件处理
      * SetAttribute()设置属性
      * DoPaint()绘制
      * PaintText()绘制文本
      * PaintStatusImage()绘制状态图
      * 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 下拉框项的列表
    * [-]class CComboWnd CCombo控件下拉窗体
      * Init()初始化Combo窗口
        实现
          1 计算窗口创建位置
          2 创建窗口
      * GetWindowClassName()
      * OnFinalMessage() 窗口被销毁时,最后消息处理函数
      * HandleMessage()消息处理
      * WM_CREATE:创建一个纵向排列容器控件,把项加入容器中
      * WM_CLOSE:CComboUI::SetManager()
      * WM_LBUTTONUP:查找当鼠标位置,如果当前位置有控件并不是滚动条控件则向自身发送失去焦点消息
      * WM_KEYDOWN:空格键 恢复原来选项 回车键向自身发送失去焦点消息其他键交由CComboUI::DoEvent()处理
      * WM_MOUSEWHEEL:由CComboUI::DoEvent
      * WM_KILLFOCUS:向自身发送WM_CLOSE
      * EnsureVisible()
        1 计算位置
        2 Scroll
      * Scroll() 设置纵向滚动条位置
      * CPaintManagerUI m_pm   绘制管理者
      * CComboUI* m_pOwner ComboUI控件
      * CVerticalLayoutUI* m_pLayout 纵向容器
      * int m_iOldSel 上一次选中项
  * 列表控件
    * 关系图
      <img src=duilib_sa_html/duilib_list.jpg>
    * [-]struct tagTListInfoUI 列表属性信息
      * int nColumns 列数量
      * RECT rcColumn[UILIST_MAX_COLUMNS] 列位置
      * int nFont文本字大小
      * UINT uTextStyle文本字体
      * RECT rcTextPadding文本与控件边框距离
      * DWORD dwTextColor文本颜色
      * DWORD dwBkColor背景颜色
      * CStdString sImage背景图
      * DWORD dwSelectedTextColor选中状态文本颜色
      * DWORD dwSelectedBkColor选中状态背景颜色
      * CStdString sSelectedImage选中状态图
      * DWORD dwHotTextColor激活状态文本颜色
      * DWORD dwHotBkColor激活状态背景颜色
      * CStdString sHotImage激活状态图
      * DWORD dwDisabledTextColor非可用状态文本色
      * DWORD dwDisabledBkColor非可用状态背景色
      * CStdString sDisabledImage非可用状态图
      * DWORD dwLineColor 边框颜色
      * bool bShowHtml 是否使用内嵌html标记
      * bool bMultiExpandable
    * [-]IListCallbackUI 
      * GetItemText() 得到列表指定项的文本
    * [-]IListOwnerUI 
      * TListInfoUI* GetListInfo() 获取列表属性
      * GetCurSel() 获取当前选中项
      * SelectItem() 设置选中项
      * DoEvent() 事件处理
    * [-]IListUI 列表控件
      * CListHeaderUI* GetHeader() 获取列表头
      * GetList() 获取列表
      * GetTextCallback() 获取列表回调
      * SetTextCallback() 设置列表回调
      * ExpandItem() 展开项
      * GetExpandedItem() 获取展开项
    * [+]class CListUI List控件
      * CListUI()构造
      * GetClass()析构
      * GetControlFlags()控件标识
      * GetInterface(pstrName)获得指针
      * GetScrollSelect() 获取滚动条是否被选中
      * SetScrollSelect() 设置滚动条被选中
      * GetCurSel() 得到当前选中项
      * SelectItem() 设置当前选中项 可设置是否获得焦点
      * GetHeader() 得到列表头指针
      * GetList() 得到列表体指针
      * GetListInfo() 得到列表属性
      * GetItemAt(iIndex) 按序号获取列表项
      * GetItemIndex(pControl) 按控件指针获取序号
      * SetItemIndex(pControl, iIndex) 设置列表项
      * GetCount() 得到列表项数
      * Add(pControl) 加入一个控件
      * AddAt(pControl, iIndex) 加入一个控件到指定位置
      * Remove(pControl) 移除制定控件
      * RemoveAt(iIndex) 移除指定序号的项
      * RemoveAll() 移除所有
      * EnsureVisible(iIndex) 确保显示第iIndex项
      * Scroll(dx, int dy) 滚动
      * GetChildPadding() 获取子控件间距
      * SetChildPadding(iPadding) 设置子控件间距
      * SetItemFont(index) 设置字体
      * SetItemTextStyle(uStyle) 设置文本类型
      * SetItemTextPadding(rc) 设置文本间距
      * SetItemTextColor(dwTextColor) 设置文本色
      * SetItemBkColor(dwBkColor) 设置背景色
      * SetItemBkImage(pStrImage) 设置背景图
      * SetAlternateBk(bAlternateBk) 设置备用背景属性
      * SetSelectedItemTextColor(dwTextColor) 设置选中项文本色 
      * SetSelectedItemBkColor(dwBkColor) 设置选中项背景色
      * SetSelectedItemImage(pStrImage) 设置选中项背景图
      * SetHotItemTextColor(dwTextColor) 设置活跃项文本色
      * SetHotItemBkColor(dwBkColor) 设置活跃项背景色
      * SetHotItemImage(pStrImage) 设置活跃项背景图
      * SetDisabledItemTextColor(dwTextColor) 设置非可用项文本色
      * SetDisabledItemBkColor(dwBkColor) 设置非可用项背景色
      * SetDisabledItemImage(pStrImage) 设置非可用项背景图
      * SetItemLineColor(dwLineColor) 设置项边框色
      * IsItemShowHtml() 获取项是否使用内嵌html标识
      * SetItemShowHtml(bShowHtml = true) 设置项是否使用内嵌html标识
      * GetItemTextPadding() 获取文本间距
      * GetItemTextColor() 获取文本颜色
      * GetItemBkColor() 获取项背景色
      * GetItemBkImage() 获取项背图
      * IsAlternateBk() 获取备用背景属性
      * GetSelectedItemTextColor() 获取选中项文本色
      * GetSelectedItemBkColor() 获取选中项背景色
      * GetSelectedItemImage() 获取选中项背景图
      * GetHotItemTextColor() 获取激活状态项文本色
      * GetHotItemBkColor() 获取激活状态项背景色
      * GetHotItemImage() 获取激活状态项背景图
      * GetDisabledItemTextColor() 获取非可用项文本色
      * GetDisabledItemBkColor() 获取非可用项背景色
      * GetDisabledItemImage() 获取非可用状态项背景图
      * GetItemLineColor() 获取项边框色
      * SetMultiExpanding(bMultiExpandable) 设置多项展开属性
      * GetExpandedItem() 获取展开项序号
      * ExpandItem(iIndex, bool bExpand = true) 展开项
      * SetPos(rc) 设置位置
      * DoEvent(TEventUI& event) 事件处理
      * SetAttribute(pstrName, LPCTSTR pstrValue) 设置属性
      * GetTextCallback() 获取文本回调
      * SetTextCallback(pCallback) 设置文本回调
      * GetScrollPos() 获取滚动条位置
      * GetScrollRange() 获取滚动条范围
      * SetScrollPos(szPos) 设置滚动条位置
      * LineUp() 向上一行
      * LineDown() 向下一行
      * PageUp() 向上一页
      * PageDown() 向下一页
      * HomeUp() 置顶
      * EndDown() 置低
      * LineLeft() 向左一列
      * LineRight() 向右一列
      * PageLeft() 向左一页
      * PageRight() 向右一页
      * HomeLeft() 置左
      * EndRight() 置右
      * EnableScrollBar() 设置是否使用滚动条
      * GetVerticalScrollBar() 获取纵向滚动条
      * CScrollBarUI* GetHorizontalScrollBar() 获取横向滚动条
      * m_bScrollSelect 滚动条被选中
      * m_iCurSel 当前选中项
      * m_iExpandedItem 展开项
      * m_pCallback 回调
      * m_pList CListBodyUI 列体指针
      * m_pHeader 表头
      * m_ListInfo 表属性
    * [+]class CListBodyUI 
      * CListBodyUI() 构造
      * SetScrollPos() 设置滚动条位置
      * SetPos() 设置位置
      * DoEvent() 事件处理
      * CListUI* m_pOwner 拥有者指针
    * [+]class ClistHeaderUI 列表头
      * CListHeaderUI()构造
      * GetClass()获取类名
      * GetInterface()接口指针
      * EstimateSize()计算大小
    * [+]class CListHeaderItemUI  
      * CListHeaderItemUI()构造
      * GetClass()类名
      * GetInterface()得到接口
      * GetControlFlags()控件标志
      * SetEnabled() 获取是否可用
      * IsDragable() 获取是否支持拖拽
      * SetDragable() 设置是否可拖拽
      * GetSepWidth() 获取分隔条宽度
      * SetSepWidth() 设置分隔条宽度
      * GetTextStyle() 获取文本类型
      * SetTextStyle() 设置文本类型
      * GetTextColor() 获取文本颜色
      * SetTextColor() 设置文本颜色
      * SetTextPadding() 设置文本间距
      * GetTextPadding() 获取文本间距
      * SetFont() 设置文本
      * IsShowHtml() 获取是否使用内嵌html标记
      * SetShowHtml() 设置使用内嵌html标记
      * GetNormalImage() 获取正常状态图
      * SetNormalImage() 设置正常状态图
      * GetHotImage() 获取激活状态图
      * SetHotImage() 设置激活状态图
      * GetPushedImage() 获取按下状态图
      * SetPushedImage() 设置按下状态图
      * GetFocusedImage() 获取焦点状态图
      * SetFocusedImage() 设置焦点状态图
      * GetSepImage() 获取分隔条背景图
      * SetSepImage() 设置分隔条背景图
      * DoEvent() 时间处理
      * EstimateSize() 计算宽度
      * SetAttribute() 设置属性
      * GetThumbRect() 获取宽度
      * PaintText() 绘制文本
      * PaintStatusImage() 绘制状态图
      * POINT ptLastMouse 鼠标位置
      * bool m_bDragable 可拖拽属性
      * UINT m_uButtonState 控件状态
      * int m_iSepWidth 分隔条宽度
      * DWORD m_dwTextColor 文本颜色
      * int m_iFont 字体
      * UINT m_uTextStyle 文本类型
      * bool m_bShowHtml 是否使用内嵌html
  * RECT m_rcTextPadding 文本间距
      * CStdString m_sNormalImage 正常状态背景图
      * CStdString m_sHotImage 激活状态背景图
      * CStdString m_sPushedImage 按下状态背景图
      * CStdString m_sFocusedImage 获得焦点背景图
      * CStdString m_sSepImage 分隔条背景图
      * CStdString m_sSepImageModify 分各条背景图2
    * IListItemUI 列表项
      * GetIndex() 得到项序号
      * SetIndex() 设置项序号
      * IListOwnerUI* GetOwner()获取列表拥有者
      * SetOwner() 设置列表拥有者
      * IsSelected() 获取是否被选中
      * Select()设置被选中
      * IsExpanded()获取是否展开项
      * Expand()设置是否展开项
      * DrawItemText()绘制项的文本
    * [+]class CListElementUI 列表元素
      * CListElementUI()构造
      * GetClass()类名
      * GetControlFlags()  控件标志 用回车换行
      * GetInterface()
      * SetEnabled()
      * GetIndex()  得到列表元素序号
      * SetIndex() 设置列表元素序号
      * IListOwnerUI* GetOwner() 获取列表元素拥有者
      * SetOwner() 设置列表元素拥有者
      * SetVisible() 设置列表元素可见性
      * IsSelected()  获取是否被选择
      * Select() 设置被选中
      * IsExpanded()  永远返回false
      * Expand() 永远返回false
      * Invalidate()  直接CControl::Invalidate会导致滚动条刷新,重写减少刷新区域
      * Activate() 激活列表元素状态
      * DoEvent()事件处理
      * SetAttribute()设置列表元素属性
      * DrawItemBk()绘制列表元素背景色
      * int m_iIndex 列表元素序列号
      * bool m_bSelected 是否被选中
      * UINT m_uButtonState 列表元素状态
      * IListOwnerUI* m_pOwner 列表元素拥有者
    * [+]class CListLabelElementUI 
      * CListLabelElementUI() 构造
      * GetClass() 类名
      * GetInterface() 接口
      * DoEvent()事件处理
      * EstimateSize()计算位置
      * DoPaint()绘制
      * DrawItemText()绘制列表项文本
    * [+]class CListTextElementUI 
      * CListTextElementUI() 构造
      * ~CListTextElementUI() 析构
      * GetClass() 类名
      * GetInterface() 接口
      * GetControlFlags() 控件标志
      * GetText() const得到文本
      * SetText() 设置文本
      * SetOwner() 设置拥有者
      * GetLinkContent() 得到超连接内容
      * DoEvent() 处理事件
      * EstimateSize() 计算位置
      * DrawItemText() 绘制文本
      * enum { MAX_LINK = 8 } 最大超连接数
      * int m_nLinks 当前超连接数目
      * RECT m_rcLinks[MAX_LINK] 链接文本区域
      * CStdString m_sLinks[MAX_LINK] 链接文本文字
      * int m_nHoverLink 
      * IListUI* m_pOwner 拥有者
      * CStdPtrArray m_aTexts 列表中列项得文本
    * [+]class CListContainerElementUI 
      * CListHeaderItemUI()构造
      * GetClass() 类名
      * GetInterface() 接口
      * GetControlFlags() 控件标志
      * SetEnabled() 设置是否可用
      * IsDragable() 获取是否可拖拽
      * SetDragable() 设置是否可拖拽
      * GetSepWidth() 获取分割条宽度
      * SetSepWidth() 设置分隔条宽度
      * GetTextStyle() 获取文本类型
      * SetTextStyle() 设置文本类型
      * GetTextColor() 获取文本颜色
      * SetTextColor() 设置文本颜色
      * SetTextPadding() 设置文本间距
      * GetTextPadding() 获取文本间距
      * SetFont() 设置文本
      * IsShowHtml() 显示内嵌html
      * SetShowHtml() 设置内嵌html
      * GetNormalImage() 获取正常状态图
      * SetNormalImage() 设置正常状态图
      * GetHotImage() 获取激活状态图
      * SetHotImage() 设置激活状态图
      * GetPushedImage() 获取按下状态图
      * SetPushedImage() 设置按下状态图
      * GetFocusedImage()  获取焦点状态图
      * SetFocusedImage() 设置焦点状态图
      * GetSepImage() 获取分各条背景图
      * SetSepImage() 设置分隔条背景图
      * DoEvent() 时间处理
      * EstimateSize() 计算大小
      * SetAttribute() 设置属性
      * GetThumbRect() 获取区域
      * PaintText() 绘制文本
      * PaintStatusImage() 绘制状态图

      * POINT ptLastMouse 鼠标位置
      * bool m_bDragable 拖拽支持属性
      * UINT m_uButtonState 控件状态
      * int m_iSepWidth 分隔条宽度
      * DWORD m_dwTextColor 文本颜色
      * int m_iFont 文本字体
      * UINT m_uTextStyle文本类型
      * bool m_bShowHtml是否支持内嵌html
  * RECT m_rcTextPadding 文本间距
      * CStdString m_sNormalImage 正常状态图
      * CStdString m_sHotImage 激活状态图
      * CStdString m_sPushedImage 按下状态图
      * CStdString m_sFocusedImage 焦点状态图
      * CStdString m_sSepImage 分隔条背景图
      * CStdString m_sSepImageModify 分分隔背景图2
  * 富文本框控件
    * [+]class CRichEditUI 富文本框控件
      * 继承 
        * [+]CContainerUI 
        * [+]IMessageFilterUI
      * 描述
        与CTxtWinHost配合实现富文本框控件
        通过向CTxtWinHost发送消息或调用CTxtWinHost的方法实现
      * CRichEditUI() 构造
      * ~CRichEditUI() 析构
      * GetClass() 获取类名
      * LPVOID GetInterface() 获取类接口
      * GetControlFlags() 获取控件属性
      * IsWantTab() 获取是否相应tab事件
      * SetWantTab()设置是否相应tab事件
      * IsWantReturn()获取是否相应回车事件 
      * SetWantReturn()设置是否相应回车事件
      * IsWantCtrlReturn()获取是否相应ctrl+回车事件 
      * SetWantCtrlReturn()设置是否相应ctrl+回车事件
      * IsRich()是否为富文本模式
      * SetRich()设置富文本模式
      * IsReadOnly()是否为只读
      * SetReadOnly()设置为只读
      * GetWordWrap()是否平铺排列
      * SetWordWrap()设置平铺排列
      * GetFont()获取文本大小
      * SetFont()设置文本大小
      * SetFont()设置字体
      * LONG GetWinStyle()获取对象属性
      * SetWinStyle()设置对象属性
      * GetTextColor()获取文本颜色
      * SetTextColor()设置文本颜色
      * GetLimitText()获取文本字数限制
      * SetLimitText()设置文本字数限制
      * GetTextLength()得到文本长度
      * CStdString GetText()得到文本
      * SetText()设置文本
      * GetModify() 获取控件标志是否被改变
      * SetModify()设置控件改变标志
      * GetSel()获取选中内容
      * GetSel()获取选中内容
      * SetSel()设置选中内容
      * SetSel()设置选中内容
      * ReplaceSel()替换被选中文本
      * ReplaceSelW()替换被选中文本(宽字符)
      * CStdString GetSelText()得到选中文本
      * SetSelAll()全选
      * SetSelNone()全取消
      * GetSelectionType() 得到选中内容的类型
      * GetZoom()获取缩放
      * SetZoom()设置缩放
      * SetZoomOff()取消缩放
      * GetAutoURLDetect()获取URL地址是否自动探测
      * SetAutoURLDetect()设置URL地址是否自动探测
      * GetEventMask()获取是否屏蔽事件
      * SetEventMask()设置是否屏蔽事件
      * CStdString GetTextRange()获取文本范围
      * HideSelection()隐藏选中区域
      * ScrollCaret()显示插入符
      * InsertText()插入文本
      * AppendText()增加文本
      * GetDefaultCharFormat()获取默认文本格式
      * SetDefaultCharFormat()设置默认文本格式
      * GetSelectionCharFormat()获取默认段落格式
      * SetSelectionCharFormat()设置默认段落格式
      * SetWordCharFormat()设置文本格式
      * GetParaFormat()获取段落格式
      * SetParaFormat()设置段落格式
      * Redo() 重做
      * Undo() 撤销
      * Clear() 清除
      * Copy() 复制
      * Cut() 剪切
      * Paste() 粘帖
      * GetLineCount() 得到行数
      * CStdString GetLine() 得到某行
      * LineIndex() 获取某行起始序号
      * LineLength() 获取某行长度
      * LineScroll() 滚动行
      * CPoGetCharPos()获取文本位置
      * LineFromChar() 获取某文本所在行
      * CPoPosFromChar() 获取某文本所在位置
      * CharFromPos() 获取某位置的文本
      * EmptyUndoBuffer() 清空撤销缓存
      * SetUndoLimit() 设置撤销次数限制
      * StreamIn() 按自定义格式流替换内容
      * StreamOut() 按自定义格式流传递内容
      * DoInit() 初始化
        * 注意
          TxSendMessage和SendMessage是有区别的,TxSendMessage没有multibyte和unicode自动转换的功能,
          而richedit2.0内部是以unicode实现的,在multibyte程序中,必须自己处理unicode到multibyte的转换
      * TxSendMessage() 发送消息
      * IDropTarget* GetTxDropTarget() 获取拖拽目标
      * OnTxViewChanged() 显示被改变
      * OnTxNotify()事件通知
      * SetScrollPos()设置滚动条位置
      * LineUp()滚动条向上
      * LineDown()滚动条向下
      * PageUp()滚动条向上翻页
      * PageDown()滚动条向下翻页
      * HomeUp()滚动条到顶部
      * EndDown()滚动条到底部
      * LineLeft()滚动条向左
      * LineRight()滚动条向右
      * PageLeft()向左翻页
      * PageRight()向右翻页
      * HomeLeft()滚动条到左端
      * EndRight()滚动条到右端
      * SIZE EstimateSize() 计算大小
      * SetPos()设置位置
      * DoEvent()
      * DoPaint() 绘制
        * 实现
          * 控件本身绘制CControlUI::DoPaint()
          * 富文本框绘制m_pTwh->GetTextServices()
      * SetAttribute() 设置属性
      * MessageHandler() 消息吹
      * CTxtWinHost* m_pTwh host指针
      * bool m_bVScrollBarFixing 纵向滚动条
      * bool m_bWantTab
      * bool m_bWantReturn
      * bool m_bWantCtrlReturn
      * bool m_bRich
      * bool m_bReadOnly
      * bool m_bWordWrap
      * DWORD m_dwTextColor
      * int m_iFont
      * int m_iLimitText
      * LONG m_lTwhStyle
    [-]class CTxtWinHost 获得富文本服务
      * 继承 
        * [+]ITextHost
      * 描述 
        获取富文本服务接口指针,操纵其接口。
        ITextServices::OnTxPropertyBitsChange()
      * CTxtWinHost()  构造
      * Init() 初始化
      * 初始化文本格式
      * 初始化段落格式
      * 设置属性
      * CreateTextServices()创建文本服务组件获取IUnknow接口
      * QueryInterface()获取富文本服务接口指针 
      * 设置控件的文本
      * ~CTxtWinHost() 析构
      * ITextServices* GetTextServices() 获取富文本服务接口指针
      * SetClientRect() 设置客户端大小
      * RECT* GetClientRect() 获取客户端大小
      * GetWordWrap() { return fWordWrap } 设置多行模式时是否平铺显示
      * SetWordWrap() 获取多行模式时是否平铺显示
      * GetReadOnly() 获取只读属性
      * SetReadOnly() 设置只读属性
      * SetFont()设置文本
      * SetColor() 设置颜色
      * SIZEL* GetExtent() 获取范围
      * SetExtent() 设置范围
      * LimitText() 设置字数限制
      * IsCaptured() 获取是否捕获鼠标
      * GetAllowBeep()获取是否允许蜂鸣
      * SetAllowBeep()设置是否允许蜂鸣
      * GetDefaultAlign() 获取段落对齐状态
      * SetDefaultAlign()设置段落对齐状态
      * GetRichTextFlag() 获取是否为富文本模式
      * SetRichTextFlag() 设置是否为富文本模式
      * GetDefaultLeftIndent() 获取缩进
      * SetDefaultLeftIndent()设置缩进
      * SetSaveSelection() 设置是否保存选中段落
      * OnTxInPlaceDeactivate() 通知对象处于非活跃状态
      * OnTxInPlaceActivate() 通知对象处于活跃状态
      * GetActiveState() 获取控件活跃状态
      * DoSetCursor()通知对象设置鼠标
      * SetTransparent()设置对象透明
      * GetControlRect()获得控件区域
      * SetAccelPos()?设置加速字体位置
      * SetPasswordChar()设置密码模式
      * SetDisabled()设置非可用模式
      * SetSelBarWidth() 设置鼠标跨行移动时是否整行选中
      * GetTimerState() 获取定时器状态
      * SetCharFormat() 设置文本属性
      * SetParaFormat() 设置段落属性
      * IUnknown interface
        * QueryInterface()
        * AddRef()
        * Release()
      * ITextHost interface
        * TxGetDC() 获取设备句柄
        * TxReleaseDC() 释放设备句柄 无操作
        * TxShowScrollBar() 显示滚动条
        * TxEnableScrollBar ()设置滚动条是否可见
        * TxSetScrollRange() 设置滚动条范围
        * TxSetScrollPos () 设置滚动条位置
        * TxInvalidateRect() 设置无效区域
        * TxViewChange()文本视图改变
        * TxCreateCaret()创建插入标记
        * TxShowCaret()显示插入标记
        * TxSetCaretPos() 设置插入标记位置
        * TxSetTimer() 设置定时器
        * TxKillTimer() 销毁定时器
        * TxScrollWindowEx ()
        * TxSetCapture()设置鼠标捕获
        * TxSetFocus()设置焦点
        * TxSetCursor()设置鼠标
        * TxScreenToClient () 绝对坐标转化成窗口相对坐标
        * TxClientToScreen () 窗口相对坐标转化为绝对坐标
        * TxActivate()激活
        * TxDeactivate()解除
        * TxGetClientRect()获取控件区域
        * TxGetViewInset()获取文本间距
        * TxGetCharFormat()获取文本格式
        * TxGetParaFormat()获取段落格式
        * TxGetSysColor()获取系统颜色
        * TxGetBackStyle()获取控件背景类型
        * TxGetMaxLength()获取文本限制长度
        * TxGetScrollBars()获取滚动条信息
        * TxGetPasswordChar()获取密码模式下显示字符
        * TxGetAcceleratorPos()获取加速文本位置
        * TxGetExtent()获取对象大小
        * OnTxCharFormatChange ()更改文本格式
        * OnTxParaFormatChange ()更改段落格式
        * TxGetPropertyBits()获取属性设置
        * TxNotify()相应事件通知
        * HIMC TxImmGetContext() 获得输入法输入的内容
        * TxImmReleaseContext()释放获取输入法输入的内容
        * TxGetSelectionBarWidth ()获取选中块宽度
      * CRichEditUI *m_re    富文本框控件
      * ULONG  cRefs           引用计数器
      * ITextServices  *pserv         富文本服务指针
      * DWORD    dwStyle         类型
      * unsigned  fEnableAutoWordSel  :1   自动选择整词
      * unsigned  fWordWrap      :1   多行是否平铺
      * unsigned  fAllowBeep      :1   是否允许嗡鸣
      * unsigned  fRich        :1   是否为富文本框
      * unsigned  fSaveSelection    :1   非活跃是否保存选中段落
      * unsigned  fInplaceActive    :1  活跃
      * unsigned  fTransparent    :1  透明
      * unsigned  fTimer        :1   定时器
      * unsigned    fCaptured           :1
      * LONG    lSelBarWidth       选择栏宽度
      * LONG      cchTextMost       文本数量限制
      * DWORD    dwEventMask       设置消息屏蔽,让其父窗口处理消息
      * LONG    icf 未使用
      * LONG    ipf 未使用
      * RECT    rcClient         控件客户区大小
      * SIZEL    sizelExtent       区域大小
      * CHARFORMAT2W cf           文本格式
      * PARAFORMAT2  pf               段落格式
      * LONG    laccelpos         加速位置
      * WCHAR    chPasswordChar         密码模式显示字符


  TODO:
  [ ]确定类型
  对ComboUI::SetItemTextPadding()测试
  对ComboUI横向滚动条测试
  gamedemo中ComboUI控件的使用

组织格式
1 架构
1.1 架构图
1 2 模块调用关系
2 模块调用关系图
3 模块
 模块中的类
 类文档
4 快速入门

CHANGELOG:
    









================
vim:sts=2 expandtab fdm=marker
标签: windows
日期: 2016-12-02 17:30:06, 8 years and 44 days ago