duilib库分析4.第二篇UIBase
DUiLib 源码分析 ——以UiLib 1.01版为分析目标
——colin3dmax 分析于2011-6-16 19:44
----------------------------------------------------------------------------------
分析约定:
private o------- 私有的成员变量或方法
protect x------- 受保护的成员变量或方法
public +------- 公开的成员变量或方法
----------------------------------------------------------------------------------
本篇分析一下源文件
UIBase.h/UIBase.cpp
UILib的基础类的定义源文件
包括UI中常用宏的封装、代码调试宏、
绘图常用的各种数据结构,以及UILib中的窗体类等
UI里的宏
窗体样式宏
+---UI_WNDSTYLE_CONTAINER 容器样式,无任何样式
+---UI_WNDSTYLE_FRAME UI标准框架窗体样式(标题栏、边框、图标、标题、最大、最小按钮、关闭按钮)
+---UI_WNDSTYLE_CHILD UI窗体子控件样式
+---UI_WNDSTYLE_DIALOG UI对话框窗体样式
扩展窗体样式宏
+---UI_WNDSTYLE_EX_FRAME 窗体客户区凹陷样式
+---UI_WNDSTYLE_EX_DIALOG 工具栏窗口样式+模式对话框样式
类样式宏
+---UI_CLASSSTYLE_CONTAINER 类容器样式
+---UI_CLASSSTYLE_FRAME 水平、垂直大小改变时绘制
+---UI_CLASSSTYLE_CHILD 水平、垂直大小改变时绘制、支持双击事件、保存窗体位图
+---UI_CLASSSTYLE_DIALOG 水平、垂直大小改变时绘制、支持双击事件、保存窗体位图
ASSERT(expr) 判断表达式是否为NULL或FALSE
TRACE(LPSTSTR pstrFormat,...)
在Debug输出窗口打印格式化字符串
TRACEMSG(UINT uMsg) 返回指定消息的16进制表示
基础类
STRINGorID 用于构建资源名称或资源ID号
x---LPCTSTR m_lpstr;
+---STRINGorID(LPCTSTR lpString)
+---STRINGorID(UINT nID)
CPoint 点的封装类,支持LPARAM构建点
+---CPoint();
+---CPoint(const POINT& src);
+---CPoint(int x, int y);
+---CPoint(LPARAM lParam);
CSize 大小封装
+---CSize();
+---CSize(const SIZE& src);
+---CSize(const RECT rc);
+---CSize(int cx, int cy);
CRect 区域封装
+---CRect();
+---CRect(const RECT& src);
+---CRect(int iLeft, int iTop, int iRight, int iBottom);
+---int GetWidth() const 获取宽度
+---int GetHeight() const 获取高度
+---void Empty() 清空
+---bool IsNull() const 是否为Empty,IsEmpty
+---Join(const RECT& rc) 支持区域合并
+---Normalize() 正规化(使得left<right,top<bottom)
+---Offset(int cx, int cy) 区域偏移(移动)操作
+---Inflate(int cx, int cy) 区域膨胀
+---Deflate(int cx, int cy) 区域收缩
+---Union(CRect& rc) 区域并操作
CStdPtrArray 指针数组类
x---LPVOID* m_ppVoid 数据指针
x---int m_nCount 指针数量
x---int m_nAllocated 内存已分配大小
-----------------------------------------------------------------------
+---void Empty() 清空记录
+---void Resize(int iSize) 重新分配内存大小(注意:之前的记录丢失)
+---bool IsEmpty() const 是否为空数组
+---int Find(LPVOID iIndex) const 查询指定元素的索引号
+---bool Add(LPVOID pData) 在指针集合中添加新数据
+---bool SetAt(int iIndex, LPVOID pData)设置指定索引号处的新数据
+---bool InsertAt(int iIndex, LPVOID pData)在指定的索引号处插入数据
+---bool Remove(int iIndex) 移除指定索引号得数据
+---int GetSize() const 获取指针数量
+---LPVOID* GetData() 获取全部的数据
+---LPVOID GetAt(int iIndex) const 查询索引号所对应的元素
+---LPVOID operator[] (int nIndex) const支持[]查找元素
CStdValArray 自定义数据长度数组类
x---LPBYTE m_pVoid 指针数据
x---int m_iElementSize 元素大小
x---int m_nCount 元素数量
x---int m_nAllocated 当前分配的可用容量
-----------------------------------------------------------------------
+---CStdValArray(int iElementSize, int iPreallocSize = 0)
指定元素大小,预分配数量
+---void Empty() 清空数据
+---bool IsEmpty() const 是否为空数组
+---bool Add(LPCVOID pData) 追加数据
+---bool Remove(int iIndex) 移除指定索引号得数据
+---int GetSize() const 获取当前保存元素的个数
+---LPVOID GetData() 获取数据
+---LPVOID GetAt(int iIndex) const 获取指定索引号处的数据
+---LPVOID operator[] (int nIndex) const支持[]查找元素
CStdString 字符串类
x---LPTSTR m_pstr; 字符指针
x---TCHAR m_szBuffer[MAX_LOCAL_STRING_LEN + 1];字符缓冲区
-----------------------------------------------------------------------
+---CStdString(); 初始化字符串类
+---CStdString(const TCHAR ch);
+---CStdString(const CStdString& src);
+---CStdString(LPCTSTR lpsz, int nLen = -1);长度为-1由程序自己判断长度
+---void Empty(); 清空字符串
+---int GetLength() const; 获取字符串长度
+---bool IsEmpty() const; 字符串是否为空串
+---TCHAR GetAt(int nIndex) const; 获取指定位置处的字符
+---void Append(LPCTSTR pstr); 字符串追加操作
+---void Assign(LPCTSTR pstr, int nLength = -1);分配内存赋值
+---LPCTSTR GetData(); 获取字符串指针
+---void SetAt(int nIndex, TCHAR ch); 在指定索引处设置字符
+---int Compare(LPCTSTR pstr) const; 字符串比较
+---int CompareNoCase(LPCTSTR pstr) const;字符串忽略大小写比较
+---void MakeUpper(); 字符串转换为大小
+---void MakeLower(); 字符串转换为小写
+---CStdString Left(int nLength) const; 从左边截取指定长度的子串
+---CStdString Mid(int iPos, int nLength = -1) const;
截取中间字符串
+---CStdString Right(int nLength) const;从右开始截取指定长度的字符串
+---int Find(TCHAR ch, int iPos = 0) const;
从指定位置开始寻找匹配字符的位置
+---int Find(LPCTSTR pstr, int iPos = 0) const;
重指定位置开始寻找匹配字符串的位置
+---int ReverseFind(TCHAR ch) const; 反向查询字符位置
+---int Replace(LPCTSTR pstrFrom, LPCTSTR pstrTo);
将匹配的字符子串用指定字符串替换
+---int __cdecl Format(LPCTSTR pstrFormat, ...);
最长63位的字符串格式化
+---int __cdecl SmallFormat(LPCTSTR pstrFormat, ...);
一次格式化1024长度的字符串格式化
TITEM结构
o---CStdString Key 键
o---LPVOID Data 值
o---struct TITEM* pNext 下一个TITEM结构体指针
CStdStringPtrMap
x---TITEM** m_aT; TITEM双指针
x---int m_nBuckets; 容器容量
+---CStdStringPtrMap(int nSize = 83); 构建字符串Map集合
+---void Resize(int nSize = 83); 重新分配集合大小
+---LPVOID Find(LPCTSTR key) const; 更具键查询字符串指针
+---bool Insert(LPCTSTR key, LPVOID pData);插入数据
+---LPVOID Set(LPCTSTR key, LPVOID pData);设置指定键的数据
+---bool Remove(LPCTSTR key); 通过键移除数据
+---int GetSize() const; 获取大小
+---LPCTSTR GetAt(int iIndex) const; 获取指定索引处得字符串
+---LPCTSTR operator[] (int nIndex) const;通过下标获取字符串
CWindowWnd
x---HWND m_hWnd 窗体句柄,初始化为NULL
x---WNDPROC m_OldWndProc Win32窗口过程,默认为DefWindowProc
x---bool m_bSubclassed 是否子类化,默认为false
--------------------------------------------------------------------
获取窗口类名称,子类必须实现该纯虚函数
o---virtual LPCTSTR GetWindowClassName() const = 0;
获取父类名称,用以子类化
o---virtual LPCTSTR GetSuperClassName() const;
获得类样式
o---virtual UINT GetClassStyle() const;
消息处理函数
o---virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);
窗体销毁前最后的处理工作
o---virtual void OnFinalMessage(HWND hWnd);
窗口过程回调函数
o---static LRESULT CALLBACK __WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
控件过程回调函数
o---static LRESULT CALLBACK __ControlProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
---------------------------------------------------------------------
+---CWindowWnd();
获取窗口句柄
+---HWND GetHWND() const;
获取窗口句柄
+---operator HWND() const;
注册窗口过程
1.调用GetClassStyle获取样式信息
2.调用绘图管理器的静态函数获取实例CPaintManagerUI::GetInstance()
3.调用GetWindowClassName()获取要注册的类名称
+---bool RegisterWindowClass();
通过已存在的窗体作为父类注册窗口类
+---bool RegisterSuperclass();
窗口创建
+---HWND Create(HWND hwndParent, LPCTSTR pstrName, DWORD dwStyle, DWORD dwExStyle, const RECT rc, HMENU hMenu = NULL);
创建窗口
1.如果存在父类名,就用注册父类来创建
2.不存在父类名,进行正常的窗口注册
3.以上注册成功后,创建窗口
+---HWND Create(HWND hwndParent, LPCTSTR pstrName, DWORD dwStyle, DWORD dwExStyle, int x = CW_USEDEFAULT, int y = CW_USEDEFAULT, int cx = CW_USEDEFAULT, int cy = CW_USEDEFAULT, HMENU hMenu = NULL);
窗口子类化
+---HWND Subclass(HWND hWnd);
卸载窗口子类化
+---void Unsubclass();
显示窗口
+---void ShowWindow(bool bShow = true, bool bTakeFocus = true);
显示模式窗口
+---bool ShowModal();
关闭窗口
+---void Close();
窗口居中,如果为子窗口,则居于父窗口的中央
+---void CenterWindow();
通过资源ID号设置图标
+---void SetIcon(UINT nRes);
发送UI同步消息
+---LRESULT SendMessage(UINT uMsg, WPARAM wParam = 0, LPARAM lParam = 0L);
投递UI异步消息
+---LRESULT PostMessage(UINT uMsg, WPARAM wParam = 0, LPARAM lParam = 0L);
调整客户区大小
+---void ResizeClient(int cx = -1, int cy = -1);
CWaitCursor 等待光标
x---HCURSOR m_hOrigCursor 替换前光标
+---CWaitCursor() 设置成等待光标
+---~CWaitCursor() 还原为之前的光标
duilib库分析4.第二篇UIBase的更多相关文章
- duilib库分析2.第一篇UIManager
DUiLib 源码分析 ——以UiLib 1.01版为分析目标--------------------------------------------------------------------- ...
- duilib库分析3.DUILibxml配置
我这里是借用网友colin3dmax整理的关于duilib的分析哈,感谢他的分享,我觉得很有必要贴出来让大家都学习观摩下 DUILibxml配置项根节点 子类 属性 ...
- DuiLib——第二篇UIBase
---------------------------------------------------------------------------------- 分析约定: private o-- ...
- duilib库分析: 消息流程分析
转 看下CWindowWnd类与CPaintManagerUI类是咋进行消息分发的吧. 1. 先看下CPaintManagerUI类的MessageLoop函数: void CPaintManag ...
- duilib库分析1.消息流程分析
看下CWindowWnd类与CPaintManagerUI类是咋进行消息分发的吧. 1. 先看下CPaintManagerUI类的MessageLoop函数: void CPaintManagerUI ...
- [转]Android开源项目第二篇——工具库篇
本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多 ...
- Android开源项目第二篇——工具库篇
本文为那些不错的Android开源项目第二篇——开发工具库篇,**主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容 ...
- PHP 性能分析第二篇: Xhgui In-Depth
[前言]这是国外知名博主 Davey Shafik 撰写的 PHP 应用性能分析系列的第二篇,第一篇介绍 Xhprof/Xhgui,第三篇则关注于性能调优实践. 在第一篇中,我们初步介绍了 xhpro ...
- [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so
0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...
随机推荐
- svn 一、 安装及汉化
svn 是日常开发过程中常用的版本控制工具 第一步 安装 进入官网 https://tortoisesvn.net/ 点击downloads 进入之后选中 需要的版本,及位数 这里推荐安装最新版的 因 ...
- vue 中使用 lazyload 插件 数据更图片不更新 的原因 及解决方案
在使用lazyload插件的img标签上,加上:key标识即可
- git删除远程服务的文件夹
首先查看当前分支:git branch -a 删除缓存的idea:git rm --cached -r .idea 提交gitiginore文件,将.idea从源代码仓库中删除(-m 表示注解): ...
- java script 基本函数
Math.random() 是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值. 日期时间函数(需要用变量调用):var b = new Date(); // ...
- 视频质量评测标准——VMAF
阿里云视频云直播转码每天都会处理大量的不同场景.不同编码格式的直播流.为了保证高画质,团队借助VMAF标准来对每路转码的效果做质量评估,然后进行反馈.调优.迭代.这么做的原因在于,像动作片.纪录片.动 ...
- 前端 -- javas-基本语法/引用等
javas-基本语法/引用等 JavaScript介绍 JavaScript是运行在浏览器端的脚步语言,JavaScript主要解决的是前端与用户交互的问题,包括使用交互与数据交互. JavaScri ...
- bzoj1024题解
[解题思路] 爆搜,状态f(r,x,y)表示剩下r刀,边长为x和y,对于每个状态枚举切成两块后的长度比或宽度比.复杂度o((n/2)n). [参考代码] #include <algorithm& ...
- 暑假集训test-8-30
这套题有毒,T1标程挂了,T2题面完全莫名其妙,T3没有告诉取模害我打了好久高精... A题. 统计每个数后面比它小的数的个数记作f把,操作一个数就是把它后面所有比它小的数和它的f清0,然后若是它到它 ...
- GoF著作中未提到的设计模式(2):Interceptor
转:http://www.cnblogs.com/west-link/archive/2011/06/22/2086591.html 拦截器模式为我们提供了一种拦截方法调用或消息的途径,整个过程是自动 ...
- Python爬虫-《神雕侠侣》
Python3.5 爬取<神雕侠侣>http://www.kanunu8.com/wuxia/201102/1610.html 武侠迷,所以喜欢爬取武侠小说 #!/usr/bin/pyth ...