1 stdAfx.h
* lengthof(x) 计算数组长度宏
* MAX 两值最大
* MIN 两值最小
* CLAMP(x,a,b) x在a,b之间则取x否则取最小
2 UIBase
* UI_WNDSTYLE_ 窗口风格属性
* UI_CLASSSTYLE_ 窗口类属性
* DUITRACE(LPCTSTR pstrFormat, ...)
功能 - 调试信息
参考 - 参考printf
* DUITRACEMSG(UINT uMsg)
功能 - 将windows消息转化成其对应的宏名
uMsg - Windows消息ID
返回值 - 宏名(字符串)
* class STRINGorID
功能 - 统一资源ID, 字符串类型和整型统一输出为字符串类型
* class CPoint
描述 - 点
函数 -
CPoint(LPARAM lParam) //将消息中lParam转化成点
* class CSize
描述 - 矩形的宽和高
* class CRect
描述 - 矩形区域
函数 -
void Empty() //设置left,right,top,bottom为零
void Join(const RECT& rc) //合并两个矩形产生一个包含两个矩形的新的矩形
void ResetOffset() //将矩形移动到left=0,top=0的位置
void Normalize() //调整left,right,top,bottom使之left < right top < bottom
void Offset(int cx, int cy) //移动矩形, cx 横向移动距离, cy 纵向移动距离
void Inflate(int cx, int cy) //放大矩形, cx左右各放大的大小, cy 上下各放大的大小
void Deflate(int cx, int cy) //缩小矩形, cx左右各缩小的大小, cy上下各缩小的大小
void Union(CRect& rc) //合并矩形, 与Join()函数功能几乎一致, 但对空矩形处理不同
* class CStdPtrArray
变量 -
m_nAllocated //已申请空间大小(可储存Ptr的数量), 如果空间不足则去realloc m_nAllocated*2的空间
* class CStdString
实现 - 如果长度小于MAX_LOCAL_STRING_LEN(63)则在栈上分配, 否则在堆上分配
函数 -
void Assign(LPCTSTR pstr, int nLength = -1) //分配
* class CStdStringMap
描述 - 字符串map
实现 - 使用times33哈希算法
* class CWindowWnd
函数 -
RegisterWindowClass() //RegisterClass的封装
RegisterSuperclass() //超类化窗口
Subclass() //子类化窗口
ShowModal() //窗口模态化
?MessageBox() //?UIBase.cpp 为utf8
__WndProc() //消息处理函数
__ControlProc() //超类化消息处理函数
实现 -
duilib消息处理机制
1 创建 - 通过CreateEx最后一个参数传递类指针this, 在消息处理函数中对WM_NCCREATE消息进行处理, 通过SetWindowLongPtr(GWLP_USERDATA)进行保存
2 消息处理 - 在消息处理函数通过GetWindowLongPtr(GWLP_USERDATA)得到其类指针, 调用虚函数HandleMessage()相应其他消息。
3 销毁 - 消息处理函数中对WM_NCDESTROY消息进行处理, 调用原消息处理函数, 重置(GWLP_USERDATA), 调用虚函数OnFinalMessage()做最后处理。
============update 2011 06 07 =====================
3 the 3rd part stb_image
* 描述 - 载入各种图片格式文件
* 函数 -
stbi_load_from_memory()
功能 - 加载图片
buffer - 内存数据
len - 数据大小,
x - [out]图像宽度(像素)
y - [out]图像高度(像素)
comp - [out]图像数据组成结果
req_comp - 图像数据组成
STBI_default = 0, // only used for req_comp
STBI_grey = 1,
STBI_grey_alpha = 2,
STBI_rgb = 3,
STBI_rgb_alpha = 4
[more than] stb_image.c line 100 - 130
stbi_image_free()
功能 - 释放已加载的图片数据
4 the 3rd part XUnzip
* 描述 - 解压zip包
* 函数 -
OpenZip
功能 - 打开一个zip包
z - 内存地址, 文件名, 文件句柄
len - 长度
flag - 标识(ZIP_HANDLE=1, ZIP_FILENAME=2, ZIP_MEMORY=3)
return - HZIP
CloseZip
功能 - 关闭一个zip包
hz - HZIP
GetZipItem
功能 - 从zip包中获取一项
hz - HZIP
index - 序号
ze - zip入口点结构
FindZipItem
功能 - 在zip包中查找项
hz - HZIP
name - 项名
ic - 大小写敏感 CASE_INSENSITIVE=1, CASE_SENSITIVE=2
index - [out]序号
ze - zip入口点结构
UnzipItem
功能 - 解压项
hz - HZIP
dst - [out]解压后存储位置
len - 储存长度
flags - 标识(ZIP_HANDLE=1, ZIP_FILENAME=2, ZIP_MEMORY=3)
5 class CRenderClip
* 描述 - 区域引擎,设置在dc上绘制的区域,防止子控件绘制到父控件外侧(float属性控件除外)
* 实现 -
* 函数 -
GenerateClip() //产生一个剪切区域, hDC窗口句柄, rc区域, clip[out]剪切区
GenerateRoundClip() //产生一个圆角剪切区域, hDC窗口句柄, rc区域, width 横向圆角弧度, height纵向圆角弧度, clip[out]剪切区
UseOldClipBegin(() //使用整个活跃区域作为剪切区, hDC窗口句柄, clip剪切区
UseOldClipEnd() //使用当前控件有效区域作为剪切区, hDC窗口句柄, clip剪切区
============update 2011 06 15 =====================
6 class CRenderEngine
* 渲染引擎
* 函数 -
LoadImage()
功能 - 加载图像
bitmap - 图像
type - 类型
mask - 隐蔽色
实现 -
1 读取文件,资源和zip包中图像文件数据到内存[通过HIWORD(bitmap.m_lpstr)区别从资源中或文件中加载MAKEINTRESOURCE The return value is the specified value in the low-order word and zero in the high-order word. (from msdn)]
2 创建DIB
3 通过stbi_load_from_memory加载数据文件并转化后复制到DIB中
4 返回TImageInfo结构
DrawImage()
功能 - 绘制图像
hDC - 设备句柄
hBitmap - 位图句柄
rc - 对象区域
rcPaint - 绘制区域
rcBmpPart - 位图区域
rcConrners - 拉伸区域
alphaChannel - alpha通道
uFade - 透明度
hole - 居中
xtiled - 横向平铺
ytiled - 纵向平铺
实现 -
1 CreateCompatibleDC (创建内存设备句柄)
2 SelectObject() (将位图选入内存设备句柄)
3 AlphaBlend (alpha混合)
4 BitBlt() or StretchBlt() (绘制到内存设备句柄)
5 SelectObject() (将老的位图选入内存设备句柄)
6 DeleteDC (释放内存设备句柄)
DrawImageString()
功能 - 按标识字符串绘制图像
hDC - 设备句柄
pManager - 绘制管理者
rc - 对象区域
rcPaint - 绘制区域
pStrImage - 标识字符串
pStrModify - 标识字符串
实现 -
1 分析标识字符串获取属性
2 获取图像数据
3 绘制图像
DrawColor()
功能 - 绘制矩形
hDC - 设备句柄
rc - 对象区域
color - 颜色(alpha, r, g, b)
实现 -
如果不需要alpha混合则SetBkColor() ExtTextOut()
否则 创建一个像素大小的32位DIB
DrawGradient()
功能 - 绘制渐变
hDC - 设备句柄
rc - 对象区域
dwFirst - 颜色1
dwSecond - 颜色2
bVertical - 渐变方向 true垂直 false水平
nSteps - 步长 [使用GradientFill() API时无效]
实现 -
1 渐变填充
2 alpha混合
DrawLine() - 绘制直线
DrawRect() - 绘制矩形
DrawRoundRect() - 绘制圆角矩形
DrawText() - 绘制文字
DrawHtmlText()
功能 - 绘制 "mini-html" 标识字符串
hDC - 设备句柄
pManager - 绘制管理者
rc - 对象区域
pstrText - "mini-html" 标识字符串
dwTextColor - 字符串类型
pLinks - 产生链接效果的区域组
sLinks - 产生链接效果的区域组数量
nLinkRects - 产生链接效果的区域组数量
uStyle - 类型,同DrawText() Format Flags
GenerateBitmap()
功能 - 产生一个BMP位图
pManager - 绘制管理者
pControl - 控件句柄
rc - 对象区域
返回 - BMP句柄
===============update 2011-06-16
7 class INotifyUI - Listener interface
8 class IMessageFilterUI - MessageFilter interface
9 class CPaintManagerUI
* 绘制管理者
* 函数
Init() - 初始化
NeedUpdate() -
Invalidate() - InvalidateRect API的封装
GetPaintDC() - 设备句柄相关函数
GetPaintWindow() - 得到窗口句柄
GetTooltipWindow() - 得到提示窗口句柄
GetMousePos() - 得到鼠标位置
GetClientSize() - 得到客户端区域大小
获取/设置 窗口初始化时大小
GetInitSize()
SetInitSize()
获取/设置 可拖动改变窗口大小的边距的大小
GetSizeBox()
SetSizeBox()
获取/设置 标题区域大小
GetCaptionRect()
SetCaptionRect()
获取/设置 圆角大小
GetRoundCorner()
SetRoundCorner()
获取/设置 大小的最小限制
GetMinInfo()
SetMinInfo()
获取/设置 大小的最大限制
GetMaxInfo()
SetMaxInfo()
设置透明度
SetTransparent()
设置背景是否使用透明属性
SetBackgroundTransparent()
获取/设置 刷新区域属性
IsShowUpdateRect()
SetShowUpdateRect()
获取/设置 应用程序对象实例句柄
GetInstance()
SetInstance()
获取 可执行程序所在路径
GetInstancePath()
获取/设置 当前工作目录
GetCurrentPath()
SetCurrentPath()
获取/设置 资源动态库句柄
GetResourceDll()
SetResourceDll()
获取/设置 资源路径
GetResourcePath()
SetResourcePath()
获取/设置 资源压缩包文件名
GetResourceZip()
SetResourceZip()
使用绘制管理者的根绘制管理者的资源设置 - 循环得到父绘制管理者直到找到最顶层的绘制管理者
UseParentResource()
得到绘制管理者
GetParentResource()
获取/设置 非可用状态文字颜色
GetDefaultDisabledColor()
SetDefaultDisabledColor()
获取/设置 默认字体颜色
GetDefaultFontColor()
SetDefaultFontColor()
获取/设置超链接默认字体颜色
GetDefaultLinkFontColor()
SetDefaultLinkFontColor()
获取/设置 鼠标漂浮在链接上时默认字体颜色
GetDefaultLinkHoverFontColor()
SetDefaultLinkHoverFontColor()
获取/设置 选中后背景颜色
GetDefaultSelectedBkColor()
SetDefaultSelectedBkColor()
获取/设置 默认字体
GetDefaultFontInfo()
SetDefaultFont()
字体列表操作
DWORD GetCustomFontCount() - 得到字体列表中项数量
HFONT AddFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 加入一种字体到字体列表中
HFONT AddFontAt(int index, LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 加入一种字体到字体列表的指定位置
HFONT GetFont(int index) - 按序号得到字体列表中的字体
HFONT GetFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 按字体属性得到字体列表中的字体
bool FindFont(HFONT hFont) - 按句柄查找字体列表中的一项
bool FindFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 按属性查找字体列表中的一项
bool RemoveFont(HFONT hFont) - 按句柄移除字体列表中的指定项
bool RemoveFontAt(int index) - 按序号移除字体列表中的指定项
void RemoveAllFonts() - 移除字体列表中的所有项
TFontInfo* GetFontInfo(int index) - 按序号得到字体列表中项的属性
TFontInfo* GetFontInfo(HFONT hFont) - 按句柄得到字体列表中项的属性
图片列表操作
const TImageInfo* GetImage(LPCTSTR bitmap);
const TImageInfo* GetImageEx(LPCTSTR bitmap, LPCTSTR type = NULL, DWORD mask = 0);
const TImageInfo* AddImage(LPCTSTR bitmap, LPCTSTR type = NULL, DWORD mask = 0);
bool RemoveImage(LPCTSTR bitmap);
void RemoveAllImages();
默认属性列表操作
void AddDefaultAttributeList(LPCTSTR pStrControlName, LPCTSTR pStrControlAttrList);
LPCTSTR GetDefaultAttributeList(LPCTSTR pStrControlName) const;
bool RemoveDefaultAttributeList(LPCTSTR pStrControlName);
const CStdStringPtrMap& GetDefaultAttribultes() const;
void RemoveAllDefaultAttributeList();
将控件树附加到当前绘制管理者
bool AttachDialog(CControlUI* pControl);
初始化控件 把控件名称加入到绘制管理者的控件名map中
bool InitControls(CControlUI* pControl, CControlUI* pParent = NULL);
重置控件
void ReapObjects(CControlUI* pControl);
选项组操作
bool AddOptionGroup(LPCTSTR pStrGroupName, CControlUI* pControl); - 添加选项组
CStdPtrArray* GetOptionGroup(LPCTSTR pStrGroupName); - 通过名称得到选项组
void RemoveOptionGroup(LPCTSTR pStrGroupName, CControlUI* pControl); - 移除选项组
void RemoveAllOptionGroups(); - 移除所有选项组
得到控件焦点
CControlUI* GetFocus() const;
控件获得焦点
void SetFocus(CControlUI* pControl);
得到标签页控件
bool SetNextTabControl(bool bForward = true);
定时器操作
bool SetTimer(CControlUI* pControl, UINT nTimerID, UINT uElapse); - 设置一个定时器
bool KillTimer(CControlUI* pControl, UINT nTimerID); - 清除一个定时器
void RemoveAllTimers(); - 清楚所有定时器
捕获鼠标
void SetCapture();
释放捕获鼠标
void ReleaseCapture();
鼠标是否被捕获
bool IsCaptured();
bool AddNotifier(INotifyUI* pControl); - 加入一个Listener
bool RemoveNotifier(INotifyUI* pControl); - 移除一个Listener
void SendNotify(TNotifyUI& Msg); - 发送一个Notify消息
void SendNotify(CControlUI* pControl, LPCTSTR pstrMessage, WPARAM wParam = 0, LPARAM lParam = 0); - 发送一个Notify消息
bool AddPreMessageFilter(IMessageFilterUI* pFilter); - 加入一个预处理Message Filter
bool RemovePreMessageFilter(IMessageFilterUI* pFilter); - 移除一个预处理Message Filter
bool AddMessageFilter(IMessageFilterUI* pFilter); - 加入一个Message Filter
bool RemoveMessageFilter(IMessageFilterUI* pFilter); - 移除一个Message Filter
PostPaint控件操作
int GetPostPaintCount() const; - 得到PostPaint控件数量
bool AddPostPaint(CControlUI* pControl); - 加入PostPaint控件
bool RemovePostPaint(CControlUI* pControl); - 移除一个PostPaint控件
bool SetPostPaintIndex(CControlUI* pControl, int iIndex); - 设置控件到指定的序列位置
加入控件到延迟处理列表当中
void AddDelayedCleanup(CControlUI* pControl);
得到根控件
CControlUI* GetRoot() const;
按照位置找到控件
CControlUI* FindControl(POINT pt) const;
按父窗口和位置查找控件
CControlUI* FindControl(CControlUI* pParent, POINT pt) const;
按名字查找控件
CControlUI* FindControl(LPCTSTR pstrName);
按父窗口和名字查找控件
CControlUI* FindControl(CControlUI* pParent, LPCTSTR pstrName);
消息循环
static void MessageLoop();
消息处理
static bool TranslateMessage(const LPMSG pMsg);
消息处理
bool MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes);
消息预处理
bool PreMessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes);
回调函数 - 比较属性(pData)与控件(pThis)的属性是否相同
static CControlUI* CALLBACK __FindControlFromNameHash(CControlUI* pThis, LPVOID pData); - 按名称查找控件的回调函数
static CControlUI* CALLBACK __FindControlFromCount(CControlUI* pThis, LPVOID pData); - 计算控件数目的回调函数
static CControlUI* CALLBACK __FindControlFromPoint(CControlUI* pThis, LPVOID pData); - 按位置查找控件的回调函数
static CControlUI* CALLBACK __FindControlFromTab(CControlUI* pThis, LPVOID pData); - 查找下一个相应tab的控件
static CControlUI* CALLBACK __FindControlFromShortcut(CControlUI* pThis, LPVOID pData); - 快捷方式对应的控件
static CControlUI* CALLBACK __FindControlFromUpdate(CControlUI* pThis, LPVOID pData); - 查找需要刷新的控件
static CControlUI* CALLBACK __FindControlFromNameByParent(CControlUI* pThis, LPVOID pData); - 查找子控件
HWND m_hWndPaint; //绘制窗口句柄
HDC m_hDcPaint; //绘制DC
HDC m_hDcOffscreen; //屏幕兼容DC
HDC m_hDcBackground; //背景DC
HBITMAP m_hbmpOffscreen; //屏幕DIB
HBITMAP m_hbmpBackground; //背景DIB
HWND m_hwndTooltip; //提示窗口句柄
TOOLINFO m_ToolTip; //提示结构
bool m_bShowUpdateRect; //是否更新
//
CControlUI* m_pRoot; //根控件指针
CControlUI* m_pFocus; //获得焦点控件指针
CControlUI* m_pEventHover; //鼠标停留控件指针
CControlUI* m_pEventClick; //点击事件控件指针
CControlUI* m_pEventKey; //相应键盘事件控件指针
//
POINT m_ptLastMousePos; //鼠标位置
SIZE m_szMinWindow; //窗口最小限制
SIZE m_szMaxWindow; //窗口最大限制
SIZE m_szInitWindowSize; //初始化窗口大小
RECT m_rcSizeBox; //托腮大小
SIZE m_szRoundCorner; //圆角大小
RECT m_rcCaption; //标题大小
UINT m_uTimerID; //计时器ID
bool m_bFirstLayout; //是否为第一层
bool m_bUpdateNeeded; //是否需要更新
bool m_bFocusNeeded; //是否需要焦点
bool m_bOffscreenPaint; //是否绘制m_hDcOffscreen
bool m_bAlphaBackground; //背景是否透明
bool m_bMouseTracking; //是否追踪鼠标
bool m_bMouseCapture; //是否捕获鼠标
CStdPtrArray m_aNotifiers; //Listener 列表
CStdPtrArray m_aTimers; //计时器列表
CStdPtrArray m_aPreMessageFilters; //预处理消息列表
CStdPtrArray m_aMessageFilters; //消息处理列表
CStdPtrArray m_aPostPaintControls; //PostPaint控件列表
CStdPtrArray m_aDelayedCleanup; //延迟释放控件列表
CStdStringPtrMap m_mNameHash; //控件名哈希列表
CStdStringPtrMap m_mOptionGroup; //选项组列表
CPaintManagerUI* m_pParentResourcePM; //当前绘制管理者的上一层绘制管理者(父绘制管理者)
DWORD m_dwDefalutDisabledColor; //默认非可用状态字体颜色
DWORD m_dwDefalutFontColor; //默认字体颜色
DWORD m_dwDefalutLinkFontColor; //默认链接颜色
DWORD m_dwDefalutLinkHoverFontColor; //默认鼠标漂浮时字体颜色
DWORD m_dwDefalutSelectedBkColor; //默认被选择后背景颜色
TFontInfo m_DefaultFontInfo; //默认字体信息
CStdPtrArray m_aCustomFonts; //字体列表
CStdStringPtrMap m_mImageHash; //图片资源名哈希表
CStdStringPtrMap m_DefaultAttrHash; //默认属性哈希表
static HINSTANCE m_hInstance; //应用程序对象实例句柄
static HINSTANCE m_hResourceInstance; //资源对象实例句柄
static CStdString m_pStrResourcePath; //资源路径
static CStdString m_pStrResourceZip; //zip包资源名称
static CStdPtrArray m_aPreMessages; //预处理消息队列
======update 2011-07-09========================================
10 class CMarkup - 解析XML
CMarkup()
功能 - 构造函数
pstrXML - xml数据
实现 -
初始化成员变量
调用Load()
~CMarkup()
功能 - 析构函数
Load()
功能 - 加载xml数据
pstrXML - xml数据
LoadFromMem()
功能 - 从内存中加载xml数据
pByte - 内存数据指针
dwSize - 大小
encoding - 编码方式 XMLFILE_ENCODING_UTF8(默认) XMLFILE_ENCODING_UNICODE XMLFILE_ENCODING_ASNI
实现 -
进行编码转换
申请控件
复制数据
LoadFromFile()
功能 - 从文件中加载xml数据
pstrFilename - 文件名
encoding - 编码方式
实现 -
判断资源类型是否为zip包,如果为zip包则进行解压
调用LoadFromMem()
Release() - 释放xml数据和元素信息数据
IsValid() - Markup是否有效
SetPreserveWhitespace() - 设置是否保存空白行
GetLastErrorMessage()
功能 - 得到错误信息
pstrMessage - [out]错误信息内容
cchMax - 信息长度
GetLastErrorLocation
功能 - 得到出错位置
pstrSource - 错误所在位置内容
cchMax - 内容长度
GetRoot() - 得到根节点
private:
tagXMLELEMENT //元素结构
{
ULONG iStart; //在m_pstrXML中起始位置
ULONG iChild; //子标签在m_pstrXML中的位置
ULONG iNext; //同级下一个标签在m_pstrXML中的位置
ULONG iParent; //上一级标签在m_pstrXML中的位置
ULONG iData; //元素数据在m_pstrXML中的位置
} XMLELEMENT;
LPTSTR m_pstrXML; //xml数据
XMLELEMENT* m_pElements; //元素列表
ULONG m_nElements; //元素数量
ULONG m_nReservedElements; //存储元素空间
TCHAR m_szErrorMsg[100]; //错误消息
TCHAR m_szErrorXML[50]; //错误内容
bool m_bPreserveWhitespace; //是否过滤空白
解析xml数据
bool _Parse();
bool _Parse(LPTSTR& pstrText, ULONG iParent);
实现 -
for(;;)
{
如果为顶层则返回
填充element
解析名字
解析属性
标签闭合方式
如果为/>则continue
如果为>则递归调用_Parse()
如果为该标签的对应闭合标签 continue
}
XMLELEMENT* _ReserveElement(); - 申请保存元素空间
跳过空白
inline void _SkipWhitespace(LPTSTR& pstr) const;
inline void _SkipWhitespace(LPCTSTR& pstr) const;
跳过标识符
inline void _SkipIdentifier(LPTSTR& pstr) const;
inline void _SkipIdentifier(LPCTSTR& pstr) const;
bool _ParseData(LPTSTR& pstrText, LPTSTR& pstrData, char cEnd);
功能 - 解析数据
pstrText - 被解析的数据字符串
pstrData - 解析后的数据字符串
cEnd - 终止字符
解析转义字符
void _ParseMetaChar(LPTSTR& pstrText, LPTSTR& pstrDest);
解析属性
bool _ParseAttributes(LPTSTR& pstrText);
记录错误信息返回错误
bool _Failed(LPCTSTR pstrError, LPCTSTR pstrLocation = NULL);
=======update 2011-07-10========
11 class CMarkupNode
CMarkupNode() - 构造函数 构造一个空节点
CMarkupNode(CMarkup* pOwner, int iPos)
功能 - 构造函数
pOwner - CMarkup指针
iPos - 在xml数据中的位置
IsValid() - 节点对象是否有效
GetParent() - 得到父节点
GetSibling() - 得到兄弟节点
GetChild() - 得到子节点
GetChild(LPCTSTR pstrName)
功能 - 按名字得到子节点
实现 - 循环查找所有子节点,直到名字匹配
HasSiblings() - 是否有兄弟节点
HasChildren() - 是否有子节点
GetName() - 得到节点对应的标签名
GetValue() - 得到节点对应的标签数据值
HasAttributes() - 是否有属性
HasAttribute(LPCTSTR pstrName) - 是否有名为pstrName的属性
GetAttributeCount() - 得到节点属性的数量
GetAttributeName(int iIndex) - 按序号得到属性名称
bool GetAttributeValue(int iIndex, LPTSTR pstrValue, SIZE_T cchMax)
功能 - 得到属性
iIndex - 属性序号
pstrValue - [out] 属性值字符串
cchMax - 属性值字符串长度
bool GetAttributeValue(LPCTSTR pstrName, LPTSTR pstrValue, SIZE_T cchMax)
功能 - 得到属性
pstrName - 属性名
pstrValue - [out] 属性值字符串
cchMax - 属性值字符串长度
_MapAttributes() - 解析xml属性建立 属性名和值的表映射到xml数据的位置
enum { MAX_XML_ATTRIBUTES = 64 }; //属性最大数量限制
typedef struct
{
ULONG iName;
ULONG iValue;
} XMLATTRIBUTE; //属性结构
int m_iPos; //节点在xml数据中的位置
int m_nAttributes; //属性数量
XMLATTRIBUTE m_aAttributes[MAX_XML_ATTRIBUTES]; //属性-值 映射xml位置 列表
CMarkup* m_pOwner; - CMarkup指针
12 class IDialogBuilderCallback - 构建UI时回调类 用于创造用户自定义的控件
virtual CControlUI* CreateControl(LPCTSTR pstrClass) = 0 - 创建用户自定义控件, pstrClass控件名
13 class CDialogBuilder - 构建UI
CControlUI* Create();
功能 - 构建UI
STRINGorID xml - 可以是一个内存xml数据或一个文件名
STRINGorID type = (UINT) 0 - 如果xml数据位于EXE资源中则type指定资源类型
IDialogBuilderCallback* pCallback = NULL - 回调函数
CPaintManagerUI* pManager = NULL - 绘制管理者指针
实现 -
判断xml类型
加载xml数据
调用Create(pCallback, pManager)构建
CControlUI* Create(IDialogBuilderCallback* pCallback = NULL, CPaintManagerUI* pManager = NULL);
功能 - 构建UI
实现 -
得到顶层Window标签,并解析属性
调用_Parse() 解析xml
void GetLastErrorMessage(LPTSTR pstrMessage, SIZE_T cchMax) const; - 错误信息
void GetLastErrorLocation(LPTSTR pstrSource, SIZE_T cchMax) const; - 出错位置
CControlUI* _Parse(CMarkupNode* parent, CControlUI* pParent = NULL, CPaintManagerUI* pManager = NULL);
实现 -
for(循环顶级标签)
{
按xml标签创建控件对象
如果不是标准控件则调用m_pCallback->CreateControl()创建用户自定义控件对象
如果有子节点则递归调用_Parse()
因为某些属性和父窗口相关,比如selected,必须先Add到父窗口
初始化控件默认属性
根据xml数据解析处理控件属性
}
CMarkup m_xml; //CMarkup对象
IDialogBuilderCallback* m_pCallback;//构建控件回调
14 class CControlUI 控件
GetName() - 得到控件名称 名称为控件的唯一ID
SetName() - 设置控件名称
GetInterface() - 得到控件指针
GetClass() - 得到控件类名
GetControlFlags() - 得到控件类型标志
Activate() - 控件是否活跃 (非不可用状态,非不可见状态)
GetManager() - 得到绘制管理者
SetMananer()
功能 - 设置控件的绘制管理者
实现 -
设置控件管理者
初始化
GetParent() - 得到父控件
GetText() - 得到控件显示内容
SetText() - 设置控件显示内容
GetBkColor() - 得到背景色
GetBkColor2() - 得到背景色2
SetBkColor2() - 设置背景色2
GetBkColor3() - 得到背景色3
SetBkColor3() - 设置背景色3
* 背景色1,2,3用于渐变色 颜色渐变过程为1->2->3
GetBkImage() - 得到背景图片
SetBkImage() - 设置背景图片
GetBorderColor() - 得到边的颜色
SetBorderColor() - 设置边的颜色
GetFocusBorderColor() - 设置获得焦点时边的颜色
GetBorderSize() - 得到边的宽度
SetBorderSize() - 设置边的宽度
GetBorderRound() - 得到圆角
SetBorderRound() - 设置圆角
DrawImage() - 绘制图片
GetPos() - 得到控件位置
SetPos() - 设置控件位置并重绘
GetWidth() - 得到控件宽度
GetHeight() - 得到控件高度
GetX() - 得到控件横坐标位置(左上点横坐标)
GetY() - 得到控件纵坐标位置(左上点纵坐标)
GetPadding() - 设置外边距,由上层窗口绘制(求周围控件离它远点或近点(负值,不过受绘制顺序影响,比较少用)
SetPadding() - 设置外边距,由上层窗口绘制
GetFixedXY() - 实际大小位置使用GetPos获取,这里得到的是预设的参考值
SetFixedXY() - 仅float为true时有效
GetFixedWidth() - 实际大小位置使用GetPos获取,这里得到的是预设的参考值
SetFixedWidth() - 预设的参考值
GetFixedHeight() - 实际大小位置使用GetPos获取,这里得到的是预设的参考值
SetFixedHeight() - 预设的参考值
设置大小的限制值
GetMinWidth()
SetMinWidth()
GetMaxWidth()
SetMaxWidth()
GetMinHeight()
SetMinHeight()
GetMaxHeight()
SetMaxHeight()
SetRelativePos() - 设置相对位置比例
SetRelativeParentSize() - 设置父控件大小
GetRelativePos() - 得到相对位置比例
IsRelativePos() -是使用相对位置
获取/设置 提示信息
GetToolTip()
SetToolTip()
获取/设置 快捷键
GetShortcut()
SetShortcut()
获取/设置 上下文菜单是否被使用
IsContextMenuUsed()
获取/设置 用户数据(字符串)
GetUserData()
SetUserData()
获取/设置 用户指针
GetTag()
SetTag()
获取/设置 控件是否可见
IsVisible()
SetVisible()
SetInternVisible() // 仅供内部调用,有些UI拥有窗口句柄,需要重写此函数
* 有窗口句柄的UI在设置不可见时,需要先失去焦点
=============update 2011-07-11
获取/设置 控件可用
IsEnabled()
SetEnabled()
获取/设置 是否处理鼠标事件
IsMouseEnabled()
SetMouseEnabled()
控件是否获得焦点
IsFocused()
设置控件获得焦点
SetFocuse()
控件是否悬浮
IsFloat()
设置控件为悬浮
SetFloat()
FindControl() - 查找控件
Invalidate()
功能 - 设置无效,引起刷新
实现 - 循环至顶层控件为止, 计算当前无效区域与父控件交叉区域作为新无效区域。
获取/设置 需更新状态
IsUpdateNeeded()
NeedUpdate()
Init() - 初始化控件事件响应, 在SetManager()中被调用
DoInit() - 做初始化处理函数, 被Init()调用
DoEvent() - 事件响应函数
SetAttribute() - 设置属性, 根据解析后的名称对所关心的属性设置状态成员变量的值
ApplyAttributeList() - 解析标签的属性字符串, 调用SetAttribute()
EstimateSize() - 预估控件大小
DoPaint()
功能 - 控件绘制
实现 - 绘制循序:背景颜色->背景图->状态图->文本->边框
PaintBkColor()
功能 - 绘制背景色
PaintBkImage()
功能 - 绘制背景图片
PaintStatusImage()
功能 - 根据状态绘制背景图片
PaintText() - 绘制文字
PaintBorder() - 绘制边框
DoPostPaint() - ?
事件源 - 可以通过委托的设计模式为初始化,销毁,事件处理过程中加入更多的处理过程
CEventSource OnInit; - 初始化事件源
CEventSource OnDestroy; - 销毁事件源
CEventSource OnEvent; - 事件响应事件源
======update 2011 07 16
15 UIlib.h/UIlib.cpp
* UIlib.h
导出导入宏
包含系统的头文件
包含duilib库的头文件
* UIlib.cpp
Bjarke Viksoe UI library
dllmain() 函数
16 class CDelegateBase 委托模式中的虚基类
CDelegateBase(void* pObject, void* pFn); - 构造函数,pObject为委托者的对象, pFn为执行方法
CDelegateBase(const CDelegateBase& rhs); - 拷贝构造函数
virtual ~CDelegateBase(); - 析构函数
bool Equals(const CDelegateBase& rhs) const; - 比较两个委托者, true 一致 false不同
bool operator() (TEventUI& event); - 响应委托进行处理 event为响应的事件
virtual CDelegateBase* Copy() = 0; - 拷贝一个委托者
void* GetFn(); - 得到执行方法
void* GetObject(); - 得到委托者对象
virtual bool Invoke(TEventUI& event) = 0; - 调用执行方法
void* m_pObject; - 委托者
void* m_pFn; - 执行方法
17 class CDelegateStatic 静态委托,委托者为空,但有执行过程
18 class CDelegate 委托,委托者不为空
19 产生委托
CDelegate MakeDelegate(O* pObject, bool (T::* pFn)(TEventUI&))
inline CDelegateStatic MakeDelegate(bool (*pFn)(TEventUI&))
20 class CEventSource - 事件源
加入一个委托者
void operator+= (CDelegateBase& d);
void operator+= (FnType pFn);
删除一个委托者
void operator-= (CDelegateBase& d);
void operator-= (FnType pFn);
响应事件进行处理
bool operator() (TEventUI& event);
CStdPtrArray m_aDelegates; - 委托者列表
21 class CLabelUI - 标签控件
CLabelUI() - 构造函数
m_uTextStyle - 样式, 默认居中
m_dwTextColor - 可用时文字颜色
m_dwDisabledTextColor - 不可用时文字颜色
m_iFont - 字体序号
m_bShowHtml - 是否使用内嵌hmtl标记格式
GetClass() - 返回控件名
GetInterface() - 得到对象指针
获取/设置 文本样式
GetTextStyle()
SetTextStyle()
获取/设置 可用状态文字颜色
SetTextColor()
GetTextColor()
获取/设置 为可用状态文字颜色
SetDisableTextColor()
GetDisabledTextColor()
获取/设置 控件使用的字体, 对应在字体列表中的序号
SetFont()
GetFont()
获取/设置 文字与边框之间填充距离
GetTextPadding()
SetTextPadding()
获取/设置 是否使用内嵌html标记格式
IsShowHtml()
SetShowHtml()
EstimateSize() - 预估控件大小
DoEvent() - 事件处理
SetAttribute() - 设置属性
PaintText() - 绘制文本
22 class CButtonUI
CButtonUI() - 构造函数, 文本样式为单行居中
GetClass() - 返回控件名
GetInterface() - 得到对象指针
GetControlFlags() - 得到控件的类型标志
DoEvent() - 事件处理
非鼠标事件交给基类CLabelUI处理, 鼠标事件由此函数处理
Activate()
功能 - 激活按钮控件
实现 - 判断是否活跃,如活跃发送通知
SetEnabled() - 设置按钮控件是否可用
实现 - 调用基类设置, 如不可用则清空按钮状态
设置/获取 鼠标悬时文本的颜色
SetHotTextColor()
GetHotTextColor()
设置/获取 按钮按下时文本颜色
SetPushedTextColor()
GetPushedTextColor()
设置/获取 按钮获得焦点时文本颜色
SetFocusedTextColor()
GetFocusedTextColor()
获取/设置 正常状态下按钮背景图片
GetNormalImage()
SetNormalImage()
获取/设置 鼠标悬浮时按钮背景图片
SetHotImage()
GetHotImage()
获取/设置 按钮被按下时背景图片
GetPushedImage()
SetPushedImage()
获取/设置 按钮获得焦点时背景图片
GetFocusedImage()
SetFocusedImage()
获取/设置 非可用状态下按钮背景图片
GetDisabledImage()
SetDisabledImage()
EstimateSize() - 预估大小
SetAttribute() - 设置属性, 根据解析后的名称对所关心的属性设置状态成员变量的值
PaintText() - 绘制文本
PaintStatusImage() - 绘制状态背景图片
23 class COptionUI - 选项控件(如CheckBox RadioBox等)
COptionUI() - 构造函数
~COptionUI() - 析构函数
CPaintManaerUI::RemoveOptionGroup()
GetClass() - 返回控件名
GetInterface() - 得到对象指针
SetManager() - 设置绘制管理者, 父控件
获取/设置 选项所属组
GetGroup()
SetGroup()
获取/设置 选项是否处于选中状态
IsSelected()
Selected()
Activate() - 激活选项控件
获取/设置 选中状态背景图片
GetSelectedImage()
SetSelectedImage()
获取/设置 前景图片
GetForeImage()
SetForeImage()
EstimateSize() - 预估选项控件大小
SetAttribute() - 设置属性, 根据解析后的名称对所关心的属性设置状态成员变量的值
PaintStatusImage() - 绘制状态背景图片
24 class CTextUI
* CTextUI() - 构造
~CTextUI() - 析构
GetClass() - 返回控件名
GetControlFlags() - 得到控件的类型标志
GetInterface() - 得到对象指针
GetLinkContent() - 得到当前控件中指定序号的超文本的内容
DoEvent() - 事件处理
EstimateSize() - 预估选项控件大小
PaintText() - 绘制文字
MAX_LINK - 超文本数量限制
m_nLinks - 超文本数量
m_rcLinks - 超文本区域数组
m_sLinks - 超文本内容数组
int m_bHoverLink - 鼠标浮动的超文本链接序号
25 class CProgressUI
GetClass() - 返回控件名
GetInterface() - 得到对象指针
- 获取/设置 进度条方向
bool IsHorizontal();
void SetHorizontal(bool bHorizontal = true);
-获取/设置 最小值
int GetMinValue() const;
void SetMinValue(int nMin);
获取/设置 最大值
int GetMaxValue() const;
void SetMaxValue(int nMax);
获取 设置 最小值
int GetValue() const;
void SetValue(int nValue);
获取 设置 前景图
LPCTSTR GetFgImage() const;
void SetFgImage(LPCTSTR pStrImage);
void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); - 设置属性
void PaintStatusImage(HDC hDC); - 绘制状态图
bool m_bHorizontal - 进度条控件方向
int m_nMax; 最大值
int m_nMin; 最小值
int m_nValue; 当前值
CStdString m_sFgImage; - 前景图
CStdString m_sFgImageModify; - 前景图2
26 class CSliderUI
CSliderUI() - 构造
GetClass() - 返回控件名
GetInterface() - 得到对象指针
UINT GetControlFlags() const; - 得到控件的类型标志
void SetEnabled(bool bEnable = true); - 设置滑块控件是否可用
获取 设置滑块步长
int GetChangeStep();
void SetChangeStep(int step);
获取设置滑块大小
void SetThumbSize(SIZE szXY);
RECT GetThumbRect() const;
获取设置滑块图
LPCTSTR GetThumbImage() const;
void SetThumbImage(LPCTSTR pStrImage);
获取设置鼠标悬浮状态滑块图
LPCTSTR GetThumbHotImage() const;
void SetThumbHotImage(LPCTSTR pStrImage);
获取设置滑块按下状态滑块图
LPCTSTR GetThumbPushedImage() const;
void SetThumbPushedImage(LPCTSTR pStrImage);
void DoEvent(TEventUI& event); - 事件处理
void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); - 设置属性
void PaintStatusImage(HDC hDC); - 绘制状态图
SIZE m_szThumb; - 滑块大小
UINT m_uButtonState; - 控件状态
int m_nStep; - 步长
CStdString m_sThumbImage; - 正常状态滑块块图
CStdString m_sThumbHotImage; - 鼠标悬浮状态滑块图
CStdString m_sThumbPushedImage; - 按下状态滑块图
CStdString m_sImageModify; - 滑块图2
27 class CEditUI
CEditUI();
GetClass() - 返回控件名
GetInterface() - 得到对象指针块
UINT GetControlFlags() const; - 得到控件的类型标志
void SetEnabled(bool bEnable = true); - 设置编辑框控件是否可用
void SetText(LPCTSTR pstrText); - 设置文本
void SetMaxChar(UINT uMax); - 设置输入文本长度限制
UINT GetMaxChar(); - 获取最大输入文本长度
void SetReadOnly(bool bReadOnly); - 设置只读模式
bool IsReadOnly() const; - 获取只读模式
void SetPasswordMode(bool bPasswordMode); - 获取密码编辑框模式
bool IsPasswordMode() const; - 设置密码编辑模式
void SetPasswordChar(TCHAR cPasswordChar); 设置密码模式显示字符
TCHAR GetPasswordChar() const; 获取密码模式显示字符Edit_SetPasswordChar
获取设置正常状态图
LPCTSTR GetNormalImage();
void SetNormalImage(LPCTSTR pStrImage);
获取设置悬浮状态图
LPCTSTR GetHotImage();
void SetHotImage(LPCTSTR pStrImage);
获取设置获得焦点状态图
LPCTSTR GetFocusedImage();
void SetFocusedImage(LPCTSTR pStrImage);
获取设置非可用状态图
LPCTSTR GetDisabledImage();
void SetDisabledImage(LPCTSTR pStrImage);
获取设置原生编辑框背景色
void SetNativeEditBkColor(DWORD dwBkColor);
DWORD GetNativeEditBkColor() const;
void SetPos(RECT rc); - 得到编辑框位置
void SetVisible(bool bVisible = true); - 设置可见状态
void SetInternVisible(bool bVisible = true); - // 仅供内部调用,有些UI拥有窗口句柄,需要重写此函数
SIZE EstimateSize(SIZE szAvailable); - 预估控件大小
void DoEvent(TEventUI& event); - 处理事件
void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); - 设置属性
void PaintStatusImage(HDC hDC); - 绘制状态图
void PaintText(HDC hDC); - 绘制文本
CEditWnd* m_pWindow; - 原生编辑框窗口
UINT m_uMaxChar; - 文本长度限制
bool m_bReadOnly; - 只读方式
bool m_bPasswordMode; - 显示密码模式
TCHAR m_cPasswordChar; - 密码模式显示的字符
UINT m_uButtonState; - 编辑框状态
CStdString m_sNormalImage; - 正常状态图
CStdString m_sHotImage; - 悬浮状态图
CStdString m_sFocusedImage; - 获取焦点状态图
CStdString m_sDisabledImage; - 不可用状态图
DWORD m_dwEditbkColor; - 获取设置编辑框背景色
28 class CEditWnd
CEditWnd(); - 构造函数
void Init(CEditUI* pOwner); 初始化
RECT CalPos(); 计算位置
LPCTSTR GetWindowClassName() const; 得到窗口类名
LPCTSTR GetSuperClassName() const; 得到超类化名
void OnFinalMessage(HWND hWnd); 窗口被摧毁后,最后消息处理
LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); 处理消息
LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 失去焦点消息
LRESULT OnEditChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 文本内容改变
CEditUI* m_pOwner; 编辑框窗口拥有者
HBRUSH m_hBkBrush; 背景画刷
29 class CScrollBarUI
public:
CScrollBarUI();
LPCTSTR GetClass() const; - 返回控件名
LPVOID GetInterface(LPCTSTR pstrName); - 得到对象指针
CContainerUI* GetOwner() const; - 得到滚动条拥有者
void SetOwner(CContainerUI* pOwner); 设置滚动条拥有者
void SetEnabled(bool bEnable = true); 设置滚动条是否可用
void SetFocus(); 设置焦点如if (NULL!=m_pOwner)m_pOwner->SetFocus();else CControlUI::SetFocus()
bool IsHorizontal(); 获取滚动条方向
void SetHorizontal(bool bHorizontal = true);设置滚动条横竖方向
int GetScrollRange() const; 得到滚动条范围
void SetScrollRange(int nRange); 设置滚动条范围
int GetScrollPos() const; 得到滚动块位置
void SetScrollPos(int nPos); 设置滚动块位置
int GetLineSize() const; 得到步长大小
void SetLineSize(int nSize); 设置步长大小
获取 设置 上或左位置的按钮 显示状态 正常状态图 悬浮状态图 按下状态图 非可用状态图
bool GetShowButton1(); 获取设置显示上左按钮
void SetShowButton1(bool bShow);
LPCTSTR GetButton1NormalImage();
void SetButton1NormalImage(LPCTSTR pStrImage);
LPCTSTR GetButton1HotImage();
void SetButton1HotImage(LPCTSTR pStrImage);
LPCTSTR GetButton1PushedImage();
void SetButton1PushedImage(LPCTSTR pStrImage);
LPCTSTR GetButton1DisabledImage();
void SetButton1DisabledImage(LPCTSTR pStrImage);
获取 设置 下或右位置的按钮 显示状态 正常状态图 悬浮状态图 按下状态图 非可用状态图
bool GetShowButton1(); 获取设置显示上左按钮
bool GetShowButton2();
void SetShowButton2(bool bShow);
LPCTSTR GetButton2NormalImage();
void SetButton2NormalImage(LPCTSTR pStrImage);
LPCTSTR GetButton2HotImage();
void SetButton2HotImage(LPCTSTR pStrImage);
LPCTSTR GetButton2PushedImage();
void SetButton2PushedImage(LPCTSTR pStrImage);
LPCTSTR GetButton2DisabledImage();
void SetButton2DisabledImage(LPCTSTR pStrImage);
获取 设置 滚动块 正常状态图 悬浮状态图 按下状态图 非可用状态图
LPCTSTR GetThumbNormalImage();
void SetThumbNormalImage(LPCTSTR pStrImage);
LPCTSTR GetThumbHotImage();
void SetThumbHotImage(LPCTSTR pStrImage);
LPCTSTR GetThumbPushedImage();
void SetThumbPushedImage(LPCTSTR pStrImage);
LPCTSTR GetThumbDisabledImage();
void SetThumbDisabledImage(LPCTSTR pStrImage);
获取设置 滚动轨迹 正常状态图 悬浮状态图 按下状态图 非可用状态图
LPCTSTR GetRailNormalImage();
void SetRailNormalImage(LPCTSTR pStrImage);
LPCTSTR GetRailHotImage();
void SetRailHotImage(LPCTSTR pStrImage);
LPCTSTR GetRailPushedImage();
void SetRailPushedImage(LPCTSTR pStrImage);
LPCTSTR GetRailDisabledImage();
void SetRailDisabledImage(LPCTSTR pStrImage);
获取设置 滚动条 背景图 悬浮状态图 按下状态图 非可用状态图
LPCTSTR GetBkNormalImage();
void SetBkNormalImage(LPCTSTR pStrImage);
LPCTSTR GetBkHotImage();
void SetBkHotImage(LPCTSTR pStrImage);
LPCTSTR GetBkPushedImage();
void SetBkPushedImage(LPCTSTR pStrImage);
LPCTSTR GetBkDisabledImage();
void SetBkDisabledImage(LPCTSTR pStrImage);
void SetPos(RECT rc); 设置滚动条
void DoEvent(TEventUI& event); 事件处理
void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); 设置属性
void DoPaint(HDC hDC, const RECT& rcPaint); 绘制
void PaintBk(HDC hDC); 绘制背景
void PaintButton1(HDC hDC); 绘制上或左向的按钮
void PaintButton2(HDC hDC);绘制下或右位置的按钮
void PaintThumb(HDC hDC); 绘制滚动块
void PaintRail(HDC hDC);绘制滚动轨迹
protected:
enum {
DEFAULT_SCROLLBAR_SIZE = 16, 滚动条默认大小
DEFAULT_TIMERID = 10, 默认计时器id
};
bool m_bHorizontal; 滚动条横纵方向
int m_nRange; 范围
int m_nScrollPos; 滚动块位置
int m_nLineSize; 步长
CContainerUI* m_pOwner; 滚动条拥有者
POINT ptLastMouse; 鼠标位置
int m_nLastScrollPos; 滚动块位置
int m_nLastScrollOffset; 滚动块偏移量 未使用
int m_nScrollRepeatDelay; 未使用
CStdString m_sBkNormalImage;
CStdString m_sBkHotImage;
CStdString m_sBkPushedImage;
CStdString m_sBkDisabledImage;
bool m_bShowButton1;
RECT m_rcButton1;
UINT m_uButton1State;
CStdString m_sButton1NormalImage;
CStdString m_sButton1HotImage;
CStdString m_sButton1PushedImage;
CStdString m_sButton1DisabledImage;
bool m_bShowButton2;
RECT m_rcButton2;
UINT m_uButton2State;
CStdString m_sButton2NormalImage;
CStdString m_sButton2HotImage;
CStdString m_sButton2PushedImage;
CStdString m_sButton2DisabledImage;
RECT m_rcThumb;
UINT m_uThumbState;
CStdString m_sThumbNormalImage;
CStdString m_sThumbHotImage;
CStdString m_sThumbPushedImage;
CStdString m_sThumbDisabledImage;
CStdString m_sRailNormalImage;
CStdString m_sRailHotImage;
CStdString m_sRailPushedImage;
CStdString m_sRailDisabledImage;
CStdString m_sImageModify;
30 class IContainer 容器虚基类
+ GetItemAt() - [v]得到容器中控件项
+ GetItemIndex() - [v]按序号获取容器中控件项
+ SetItemIndex() - [v]设置控件项为容器中存在的指定序号的控件项
+ GetCount() - [v]获取容器控件项数
+ Add() - [v]增加一个控件到容器中
+ AddAt() - [v]插入一个控件到容器中
+ Remove() - [v]删除容器中控件项
+ RemoveAt() - [v]删除指定序号的容器控件项
+ RemoveAll() - [v]删除所有容器中的控件
31 class CContainerUI 容器控件
* CContainerUI() - 构造函数
* ~CContainerUI() - 析构函数
* GetInterface() - 得到控件指针
* GetClass() - 得到控件类名
*
+ GetItemAt() - 得到容器中控件项
+ GetItemIndex() - 按序号获取容器中控件项
+ SetItemIndex() - 设置控件项为容器中存在的指定序号的控件项
+ GetCount() - 获取容器控件项数
+ Add() - 增加一个控件到容器中
+ AddAt() - 插入一个控件到容器中
+ Remove() - 删除容器中控件项
+ RemoveAt() - 删除指定序号的容器控件项
* DoEvent() - 事件处理
* SetVisible() - 设置容器是否可见
* SetInternVisible() // 仅供内部调用,有些UI拥有窗口句柄,需要重写此函数
* SetMouseEnabled() - 设置是否处理鼠标事件
- 获取/设置内边距,相当于设置客户区
* GetInset() -
* SetInset() -
- 获取/设置容器内控件项是否自动摧毁
* IsAutoDestroy()
* SetAutoDestroy()
- 获取/设置容器本身是否延迟摧毁
* IsDelayedDestroy()
* SetDelayedDestroy()
- ?获取/设置容器中控件是否响应鼠标事件
* IsMouseChildEnabled()
* SetMouseChildEnabled()
* FindSelectable() - 查找容器中下一个可选项
* SetPos() - 设置位置
* DoPaint() - 绘制
* SetAttribute() - 设置属性
* SetManager() - 设置界面管理者
* GetScrollPos() - 获取滚动块位置
* GetScrollRange() - 获取滚动条范围
* LineUp() - 向上一行(一行为默认字体高度)
* LineDown() - 向下一行
* PageUp() - 向上一页(?)
* PageDown() - 向下一页(?)
* HomeUp() - 最上
* EndDown() - 最下
* LineLeft() - 向左一行(8个像素)
* LineRight() - 向右一行(8个像素)
* PageLeft() - 向左一页
* PageRight() - 向右一页
* HomeLeft() - 最左
* EndRight() - 最右
* EnableScrollBar() - 滚动条可用
* GetVerticalScrollBar() - 得到纵向滚动条
* GetHorizontalScrollBar() - 得到横向滚动条
* SetFloatPos() - 设置悬浮位置
* ProcessScrollBar() 处理滚动条
* m_items 容器中的空间项
* m_rcInset 设置内边距 客户区
* m_iChildPadding 控件项间距
* m_bAtuoDestroy - 自动摧毁子控件
* m_bMouseChildEnabled - 鼠标可用
* m_bScrollProcess - 是否处理滚动
* m_pVerticalScrollBar - 是否使用横滚动条
* m_pHorizontalScrollBar - 是否使用纵滚动条
32 class CVerticalLayoutUI 纵向布局的容器控件
+ CVerticalLayoutUI()
* GetInterface() - 得到控件指针
* GetClass() - 得到控件类名
* GetControlFlags() - 得到控件的类型标志
- 分割栏高度
+ SetSepHeight()
+ GetSepHeight()
+ SetSepImmMode() 设置刷新模式 立即刷新或延时刷新
+ IsSepImmMode() 获取刷新模式
+ SetAttribute() - 设置属性
+ DoEvent() 处理事件
+ SetPos() 设置位置
+ DoPostPaint() 绘制
+ GetThumbRect() 获取欲刷新的区域
x m_iSepHeight 分隔栏高度
x m_uButtonState 容器控件状态
x ptLastMouse 鼠标位置
x m_rcNewPos 刷新区域
x m_bImmMode 立即刷新模式
33 class CHorizontalLayoutUI 横向布局的容器控件
+ CHorizontalLayoutUI() - 构造
* GetInterface() - 得到控件指针
* GetClass() - 得到控件类名
* GetControlFlags() - 得到控件的类型标志
-获取 设置分隔栏宽度
+ SetSepWidth()
+ GetSepWidth()
- 获取 设置刷新模式
+ SetSepImmMode()
+ IsSepImmMode()
+ SetAttribute() - 设置属性
+ DoEvent() - 处理事件
+ SetPos() - 设置容器位置及容器中控件项位置
+ DoPostPaint() - 延迟绘制
+ GetThumbRect() - 获取刷新区域
x m_iSepWidth - 分隔栏宽度
x m_uButtonState - 控件状态
x ptLastMouse - 鼠标位置
x m_rcNewPos - 设置位置
x m_bImmMode - 立即刷新模式
34 class CTileLayoutUI - 平铺布局
+ CTileLayoutUI() - 构造
* GetClass() - 得到控件类名
* GetControlFlags() - 得到控件的类型标志
+ SetPos() - 设置容器及其容器内控件项位置
-
+ 获取 设置 布局列数
+ GetColumns()
+ SetColumns()
+ SetAttribute() - 设置属性
x m_nColumns - 布局列数
35 class CDialogLayoutUI 对话框容器控件
+ CDialogLayoutUI() 构造
* GetInterface() - 得到控件指针
* GetClass() - 得到控件类名
+ SetStretchMode() 拉伸模式
+ SetPos() 设置容器及其容器内控件项位置
+ EstimateSize() 预估大小
+ RecalcArea() 重新计算区域
x STRETCHMODE 拉伸模式结构
x m_aModes 拉伸模式列表
36 class CTabLayoutUI 标签页容器
+ CTabLayoutUI() 构造
* GetInterface() - 得到控件指针
* GetClass() - 得到控件类名
bool Add(CControlUI* pControl); 向容器中添加控件,如果不是选中项则设置为非可见
bool AddAt(CControlUI* pControl, int iIndex); 将控件添加到容器控件列表的指定位置,不为选中项为非可见
bool Remove(CControlUI* pControl); 移除控件
void RemoveAll(); 移除所有控件
int GetCurSel() const; 得到当前选中的控件项(可见控件)
bool SelectItem(int iIndex); 设置控件项为选中项(设置为可见控件)
void SetPos(RECT rc); 设置容器及其控件位置
void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); 设置属性
m_iCurSel - 当前选中控件(可见)
=======================update 20110731am=============
37 CSafeRelease 安全释放对象t
CSafeRelease(T* p) : m_p(p) { }; 构造
~CSafeRelease() { if( m_p != NULL ) m_p->Release(); }; 析构
T* Detach() { T* t = m_p; m_p = NULL; return t; }; 分离
T* m_p; 对象指针
38 CActiveXUI
CActiveXUI(); 构造
virtual ~CActiveXUI(); 析构
LPCTSTR GetClass() const; 得到控件类名
LPVOID GetInterface(LPCTSTR pstrName); 得到控件指针
HWND GetHostWindow() const; 得到宿主窗口句柄
//设置获取延时创建activeX控件
bool IsDelayCreate() const;
void SetDelayCreate(bool bDelayCreate = true);
bool CreateControl(const CLSID clsid); 按clsid创建控件
bool CreateControl(LPCTSTR pstrCLSID); 按activeX名创建控件
HRESULT GetControl(const IID iid, LPVOID* ppRet); 获取控件接口
CLSID GetClisd() const;得到ActiveX控件id
CStdString GetModuleName() const; 得到控件名称
void SetModuleName(LPCTSTR pstrText); 设置控件名称
void SetVisible(bool bVisible = true); 设置是否可见
void SetInternVisible(bool bVisible = true);
void SetPos(RECT rc); 设置控件位置
void DoPaint(HDC hDC, const RECT& rcPaint); 绘制CActiveXCtrl::IViewObject::Draw()
void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);设置控件属性
LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled);消息处理
protected:
void ReleaseControl(); //释放控件
设置宿主窗口句柄为空
得到IObjectWithSite接口对象
IObjectWithSite::SetSite(NULL)
IObjectWithSite::Release()
IOleObject::Close(OLECLOSE_NOSAVE)
IOleObject::SetClientSite(NULL)
IOleObject::Release()
CActiveCtrl::Release()
bool DoCreateControl(); //创建控件
//释放控件
//获取IOleControl
通过模块名调用DllGetClassObject()获取IClassFactory创建IOleControl
//通过IOleControl枚举出IOleObject[m_pUnk]
新建CActiveXCtrl
IOleObject获取ActiveX控件状态
CActiveXCtrl枚举出IOleClientSite[]
IOleObject::SetClientSite(IOleClientSite)
IOleObject枚举出IPersistStreamInit
IPersistStreamInit::InitNew()
IPersistStreamInit::Release()
获取IViewObject 获取显示对象
IOleObject::DoVerb() //完成激活控件
protected:
CLSID m_clsid; ActiveX的ID
CStdString m_sModuleName;ActiveX的模块名
bool m_bCreated; 是否被创建
bool m_bDelayCreate; 是否延时创建
IOleObject* m_pUnk; 提供嵌入对象与其容器之间的联系
CActiveXCtrl* m_pControl; ActiveX容器控件
HWND m_hwndHost;宿主窗口句柄
39 CActiveXWnd
public:
HWND Init(CActiveXCtrl* pOwner, HWND hWndParent);
LPCTSTR GetWindowClassName() const;
void OnFinalMessage(HWND hWnd);
LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
protected:
void DoVerb(LONG iVerb);
LRESULT OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
protected:
CActiveXCtrl* m_pOwner;
40 CActiveXEnum
CActiveXEnum(IUnknown* pUnk) : m_pUnk(pUnk), m_dwRef(1), m_iPos(0)
{
m_pUnk->AddRef();
}
~CActiveXEnum()
{
m_pUnk->Release();
}
LONG m_iPos;
ULONG m_dwRef;
IUnknown* m_pUnk;
STDMETHOD_(ULONG,AddRef)()
{
return ++m_dwRef;
}
STDMETHOD_(ULONG,Release)()
{
LONG lRef = --m_dwRef;
if( lRef == 0 ) delete this;
return lRef;
}
STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject)
{
*ppvObject = NULL;
if( riid == IID_IUnknown ) *ppvObject = static_cast(this);
else if( riid == IID_IEnumUnknown ) *ppvObject = static_cast(this);
if( *ppvObject != NULL ) AddRef();
return *ppvObject == NULL ? E_NOINTERFACE : S_OK;
}
STDMETHOD(Next)(ULONG celt, IUnknown **rgelt, ULONG *pceltFetched)
{
if( pceltFetched != NULL ) *pceltFetched = 0;
if( ++m_iPos > 1 ) return S_FALSE;
*rgelt = m_pUnk;
(*rgelt)->AddRef();
if( pceltFetched != NULL ) *pceltFetched = 1;
return S_OK;
}
STDMETHOD(Skip)(ULONG celt)
{
m_iPos += celt;
return S_OK;
}
STDMETHOD(Reset)(void)
{
m_iPos = 0;
return S_OK;
}
STDMETHOD(Clone)(IEnumUnknown **ppenum)
{
return E_NOTIMPL;
}
41 CActiveXFrameWnd
public:
CActiveXFrameWnd(CActiveXUI* pOwner) : m_dwRef(1), m_pOwner(pOwner), m_pActiveObject(NULL)
{
}
~CActiveXFrameWnd()
{
if( m_pActiveObject != NULL ) m_pActiveObject->Release();
}
ULONG m_dwRef;
CActiveXUI* m_pOwner;
IOleInPlaceActiveObject* m_pActiveObject;
// IUnknown
STDMETHOD_(ULONG,AddRef)()
{
return ++m_dwRef;
}
STDMETHOD_(ULONG,Release)()
{
ULONG lRef = --m_dwRef;
if( lRef == 0 ) delete this;
return lRef;
}
STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject)
{
*ppvObject = NULL;
if( riid == IID_IUnknown ) *ppvObject = static_cast(this);
else if( riid == IID_IOleWindow ) *ppvObject = static_cast(this);
else if( riid == IID_IOleInPlaceFrame ) *ppvObject = static_cast(this);
else if( riid == IID_IOleInPlaceUIWindow ) *ppvObject = static_cast(this);
if( *ppvObject != NULL ) AddRef();
return *ppvObject == NULL ? E_NOINTERFACE : S_OK;
}
// IOleInPlaceFrameWindow
STDMETHOD(InsertMenus)(HMENU /*hmenuShared*/, LPOLEMENUGROUPWIDTHS /*lpMenuWidths*/)
{
return S_OK;
}
STDMETHOD(SetMenu)(HMENU /*hmenuShared*/, HOLEMENU /*holemenu*/, HWND /*hwndActiveObject*/)
{
return S_OK;
}
STDMETHOD(RemoveMenus)(HMENU /*hmenuShared*/)
{
return S_OK;
}
STDMETHOD(SetStatusText)(LPCOLESTR /*pszStatusText*/)
{
return S_OK;
}
STDMETHOD(EnableModeless)(BOOL /*fEnable*/)
{
return S_OK;
}
STDMETHOD(TranslateAccelerator)(LPMSG /*lpMsg*/, WORD /*wID*/)
{
return S_FALSE;
}
// IOleWindow
STDMETHOD(GetWindow)(HWND* phwnd)
{
if( m_pOwner == NULL ) return E_UNEXPECTED;
*phwnd = m_pOwner->GetManager()->GetPaintWindow();
return S_OK;
}
STDMETHOD(ContextSensitiveHelp)(BOOL /*fEnterMode*/)
{
return S_OK;
}
// IOleInPlaceUIWindow
STDMETHOD(GetBorder)(LPRECT /*lprectBorder*/)
{
return S_OK;
}
STDMETHOD(RequestBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/)
{
return INPLACE_E_NOTOOLSPACE;
}
STDMETHOD(SetBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/)
{
return S_OK;
}
STDMETHOD(SetActiveObject)(IOleInPlaceActiveObject* pActiveObject, LPCOLESTR /*pszObjName*/)
{
if( pActiveObject != NULL ) pActiveObject->AddRef();
if( m_pActiveObject != NULL ) m_pActiveObject->Release();
m_pActiveObject = pActiveObject;
return S_OK;
}
42 CActiveXCtrl
public:
CActiveXCtrl();
~CActiveXCtrl();
// IUnknown
STDMETHOD_(ULONG,AddRef)();
STDMETHOD_(ULONG,Release)();
STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject);
// IObjectWithSite
STDMETHOD(SetSite)(IUnknown *pUnkSite);
STDMETHOD(GetSite)(REFIID riid, LPVOID* ppvSite);
// IOleClientSite
STDMETHOD(SaveObject)(void);
STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk);
STDMETHOD(GetContainer)(IOleContainer** ppContainer);
STDMETHOD(ShowObject)(void);
STDMETHOD(OnShowWindow)(BOOL fShow);
STDMETHOD(RequestNewObjectLayout)(void);
// IOleInPlaceSiteWindowless
STDMETHOD(CanWindowlessActivate)(void);
STDMETHOD(GetCapture)(void);
STDMETHOD(SetCapture)(BOOL fCapture);
STDMETHOD(GetFocus)(void);
STDMETHOD(SetFocus)(BOOL fFocus);
STDMETHOD(GetDC)(LPCRECT pRect, DWORD grfFlags, HDC* phDC);
STDMETHOD(ReleaseDC)(HDC hDC);
STDMETHOD(InvalidateRect)(LPCRECT pRect, BOOL fErase);
STDMETHOD(InvalidateRgn)(HRGN hRGN, BOOL fErase);
STDMETHOD(ScrollRect)(INT dx, INT dy, LPCRECT pRectScroll, LPCRECT pRectClip);
STDMETHOD(AdjustRect)(LPRECT prc);
STDMETHOD(OnDefWindowMessage)(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult);
// IOleInPlaceSiteEx
STDMETHOD(OnInPlaceActivateEx)(BOOL *pfNoRedraw, DWORD dwFlags);
STDMETHOD(OnInPlaceDeactivateEx)(BOOL fNoRedraw);
STDMETHOD(RequestUIActivate)(void);
// IOleInPlaceSite
STDMETHOD(CanInPlaceActivate)(void);
STDMETHOD(OnInPlaceActivate)(void);
STDMETHOD(OnUIActivate)(void);
STDMETHOD(GetWindowContext)(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc,
LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo);
STDMETHOD(Scroll)(SIZE scrollExtant);
STDMETHOD(OnUIDeactivate)(BOOL fUndoable);
STDMETHOD(OnInPlaceDeactivate)(void);
STDMETHOD(DiscardUndoState)( void);
STDMETHOD(DeactivateAndUndo)( void);
STDMETHOD(OnPosRectChange)(LPCRECT lprcPosRect);
// IOleWindow
STDMETHOD(GetWindow)(HWND* phwnd);
STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode);
// IOleControlSite
STDMETHOD(OnControlInfoChanged)(void);
STDMETHOD(LockInPlaceActive)(BOOL fLock);
STDMETHOD(GetExtendedControl)(IDispatch** ppDisp);
STDMETHOD(TransformCoords)(POINTL* pPtlHimetric, POINTF* pPtfContainer, DWORD dwFlags);
STDMETHOD(TranslateAccelerator)(MSG* pMsg, DWORD grfModifiers);
STDMETHOD(OnFocus)(BOOL fGotFocus);
STDMETHOD(ShowPropertyFrame)(void);
// IOleContainer
STDMETHOD(EnumObjects)(DWORD grfFlags, IEnumUnknown** ppenum);
STDMETHOD(LockContainer)(BOOL fLock);
// IParseDisplayName
STDMETHOD(ParseDisplayName)(IBindCtx* pbc, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut);
protected:
HRESULT CreateActiveXWnd();
protected:
LONG m_dwRef;
CActiveXUI* m_pOwner;
CActiveXWnd* m_pWindow;
IUnknown* m_pUnkSite;
IViewObject* m_pViewObject;
IOleInPlaceObjectWindowless* m_pInPlaceObject;
bool m_bLocked;
bool m_bFocused;
bool m_bCaptured;
bool m_bUIActivated;
bool m_bInPlaceActive;
bool m_bWindowless;
43 CComboWnd -CCombo控件下拉窗体
public:
void Init(CComboUI* pOwner);初始化Combo窗口
1 计算窗口创建位置
2 创建窗口
LPCTSTR GetWindowClassName() const;
void OnFinalMessage(HWND hWnd);
窗口被销毁时,最后消息处理函数
LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);消息处理
WM_CREATE:创建一个纵向排列容器控件,把项加入容器中
WM_CLOSE:CComboUI::SetManager() CComboUI::SetPos9) CComboUI::SetFocus()
WM_LBUTTONUP:查找当鼠标位置,如果当前位置有控件并不是滚动条控件则向自身发送失去焦点消息
WM_KEYDOWN:空格键 恢复原来选项 回车键向自身发送失去焦点消息其他键交由CComboUI::DoEvent()处理
WM_MOUSEWHEEL:由CComboUI::DoEvent
WM_KILLFOCUS:向自身发送WM_CLOSE
void EnsureVisible(int iIndex);
1 计算位置
2 Scroll
void Scroll(int dx, int dy);
设置纵向滚动条位置
public:
CPaintManagerUI m_pm; 绘制管理者
CComboUI* m_pOwner; ComboUI控件
CVerticalLayoutUI* m_pLayout; 纵向容器
int m_iOldSel; 上一次选中项
44 CComboUI - Combo控件
CComboUI(); //构造
LPCTSTR GetClass() const;
LPVOID GetInterface(LPCTSTR pstrName);
void DoInit();初始化
如果选中项序号为-1设置第0项为选中项
UINT GetControlFlags() const;
返回tab切换停留属性
CStdString GetText() const; 得到文本
void SetEnabled(bool bEnable = true); 设置可用
CStdString GetDropBoxAttributeList(); 获取下拉框属性列表字符串
void SetDropBoxAttributeList(LPCTSTR pstrList); 设置下拉框属性列表字符串
SIZE GetDropBoxSize() const;得到下拉框大小
void SetDropBoxSize(SIZE szDropBox);设置下拉框大小
int GetCurSel() const; 获取当前选中项
bool SelectItem(int iIndex); 设置当前选中项
bool SetItemIndex(CControlUI* pControl, int iIndex); 按项的控件指针获取项序号
bool Add(CControlUI* pControl); 加入一项
bool AddAt(CControlUI* pControl, int iIndex); 加入一项到列表指定位置
bool Remove(CControlUI* pControl); 按项控件的指针移除一项
bool RemoveAt(int iIndex); 移除指定序号的一项
void RemoveAll(); 移除所有项
bool Activate(); 设置控件活跃
如果处于非活跃状态,且下拉窗口未创建,则创建下拉窗口
RECT GetTextPadding() const; 获取文本与控件边缘的间距
void SetTextPadding(RECT rc); 设置文本与控件边缘的间距
LPCTSTR GetNormalImage() const; 获取正常状态图
void SetNormalImage(LPCTSTR pStrImage); 设置正常状态图
LPCTSTR GetHotImage() const; 获取活跃状态图
void SetHotImage(LPCTSTR pStrImage);设置活跃状态图
LPCTSTR GetPushedImage() const; 获取按下状态图
void SetPushedImage(LPCTSTR pStrImage); 设置按下状态图
LPCTSTR GetFocusedImage() const; 获取焦点状态图
void SetFocusedImage(LPCTSTR pStrImage);设置焦点状态图
LPCTSTR GetDisabledImage() const; 非可用状态图
void SetDisabledImage(LPCTSTR pStrImage); 设置非可用状态图
TListInfoUI* GetListInfo(); 获取列表信息
void SetItemFont(int index); 设置项字体
void SetItemTextStyle(UINT uStyle); 设置项字体大小
RECT GetItemTextPadding() const 得到项文本间距
void SetItemTextPadding(RECT rc);设置项文本间距
DWORD GetItemTextColor() const; 设置项文本色
void SetItemTextColor(DWORD dwTextColor);得到项目文本色
DWORD GetItemBkColor() const; 获取项背景色
void SetItemBkColor(DWORD dwBkColor);设置项背景色
LPCTSTR GetItemImage() const; 获取项图
void SetItemImage(LPCTSTR pStrImage); 设置项图
DWORD GetSelectedItemTextColor() const;选中状态项文本色
void SetSelectedItemTextColor(DWORD dwTextColor);设置选中状态文本色
DWORD GetSelectedItemBkColor() const;得到选中项背景色
void SetSelectedItemBkColor(DWORD dwBkColor);设置项选中状态背景图
LPCTSTR GetSelectedItemImage() const;获取选中项背景图
void SetSelectedItemImage(LPCTSTR pStrImage);设置项选中状态背景图
DWORD GetHotItemTextColor() const;获取项活跃状态文本色
void SetHotItemTextColor(DWORD dwTextColor);设置项活跃状态文本色
DWORD GetHotItemBkColor() const;获取项活跃状态背景色
void SetHotItemBkColor(DWORD dwBkColor);设置项活跃状态背景色
LPCTSTR GetHotItemImage() const;后去项活跃状态图
void SetHotItemImage(LPCTSTR pStrImage);设置项活跃状态图
DWORD GetDisabledItemTextColor() const;得到项非可用状态文本色
void SetDisabledItemTextColor(DWORD dwTextColor);设置非可用项文本色
DWORD GetDisabledItemBkColor() const;获取项非可用状态背景色
void SetDisabledItemBkColor(DWORD dwBkColor);设置项非可用状态背景色
LPCTSTR GetDisabledItemImage() const; 设置项非可用状态图
void SetDisabledItemImage(LPCTSTR pStrImage);获取项非可用状态图
DWORD GetItemLineColor() const;获取项边框色
void SetItemLineColor(DWORD dwLineColor);设置项边框色
bool IsItemShowHtml(); 项是否使用内嵌html标识语言
void SetItemShowHtml(bool bShowHtml = true);设置项是否使用内嵌html标识语言
SIZE EstimateSize(SIZE szAvailable);计算控件大小
void SetPos(RECT rc);设置控件位置
void DoEvent(TEventUI& event);事件处理
void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);设置属性
void DoPaint(HDC hDC, const RECT& rcPaint);绘制
void PaintText(HDC hDC);绘制文本
void PaintStatusImage(HDC hDC);绘制状态图
protected:
CComboWnd* m_pWindow; 下拉框窗口
int m_iCurSel; 当前选中项
RECT m_rcTextPadding; 文本与控件边缘间距
CStdString m_sDropBoxAttributes; 下拉框属性
SIZE m_szDropBox; 下拉框窗体大小
UINT m_uButtonState; 控件状态
CStdString m_sNormalImage; 正常状态图
CStdString m_sHotImage; 活跃状态图
CStdString m_sPushedImage; 按下状态图
CStdString m_sFocusedImage; 获得焦点状态图
CStdString m_sDisabledImage; 非可用状态图
TListInfoUI m_ListInfo; 下拉框项的列表