1 stdAfx 预编译
* int lengthof(x) 计算数组长度宏; MAX 两值最大; MIN 两值最小;CLAMP(x,a,b) x在a,b之间则取x否则取最小
winmm.lib Windows 多媒体相关应用程序接口库 comctl32.lib Windows 通用控件库
2 UIBase
UI_WNDSTYLE_ 窗口风格属性
UI_CLASSSTYLE_ 窗口类属性
<TODO:增加具体每项的解释>
ASSERT(expr) - 断言 同_ASSERTE(expr) 显示断言所在文件,行以及expr的内容
TRACE(LPCTSTR pstrFormat, ...) 调试信息
TRACEMSG(UINT uMsg) //将windows消息转化成其对应的宏名
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 分析标识字符串获取属性
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句柄
===============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); - 添加控件到组中, 如果组选贤存在则加入pControl到此组中,如果不存在则创建新组并加入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); - 发送一个通知
void SendNotify(CControlUI* pControl, LPCTSTR pstrMessage, WPARAM wParam = 0, LPARAM lParam = 0); - 发送一个通知
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;
在控件名map中按名字匹配控件
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; //预处理消息队列