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的更多相关文章

  1. duilib库分析2.第一篇UIManager

    DUiLib 源码分析 ——以UiLib 1.01版为分析目标--------------------------------------------------------------------- ...

  2. duilib库分析3.DUILibxml配置

    我这里是借用网友colin3dmax整理的关于duilib的分析哈,感谢他的分享,我觉得很有必要贴出来让大家都学习观摩下 DUILibxml配置项根节点        子类      属性       ...

  3. DuiLib——第二篇UIBase

    ---------------------------------------------------------------------------------- 分析约定: private o-- ...

  4. duilib库分析: 消息流程分析

      转 看下CWindowWnd类与CPaintManagerUI类是咋进行消息分发的吧. 1. 先看下CPaintManagerUI类的MessageLoop函数: void CPaintManag ...

  5. duilib库分析1.消息流程分析

    看下CWindowWnd类与CPaintManagerUI类是咋进行消息分发的吧. 1. 先看下CPaintManagerUI类的MessageLoop函数: void CPaintManagerUI ...

  6. [转]Android开源项目第二篇——工具库篇

    本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多 ...

  7. Android开源项目第二篇——工具库篇

    本文为那些不错的Android开源项目第二篇——开发工具库篇,**主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容 ...

  8. PHP 性能分析第二篇: Xhgui In-Depth

    [前言]这是国外知名博主 Davey Shafik 撰写的 PHP 应用性能分析系列的第二篇,第一篇介绍 Xhprof/Xhgui,第三篇则关注于性能调优实践. 在第一篇中,我们初步介绍了 xhpro ...

  9. [置顶] android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so

    0:前言 1:本文主要作为丙方android公司的身份来写 2:作者有不对的地方,请指出,谢谢 [第一篇:android利用jni调用第三方库——编写库libhello.so] [第二篇:androi ...

随机推荐

  1. Pregel Aggregator

  2. html标签注意事项

    1,关于媒体的video标签 在同一个页面上如果有多个video标签,并且初始化都赋值,则video不会播放, 解决办法,用计时器每隔50ms给后面的video标签设置src,设置完为止 2,关于ch ...

  3. join加入线程

    join线程会抢先拿到cup来执行线程,然后其他的线程再来执行. 案例: public static void main(String args[]){ //创建线程对象 Thread myThrea ...

  4. cmake -help

    { Usage cmake [options] <path-to-source>  cmake [options] <path-to-existing-build> Speci ...

  5. thinkphp 静态缓存

    要使用静态缓存功能,需要开启HTML_CACHE_ON参数,并且使用HTML_CACHE_RULES配置参数设置静态缓存规则文件 . 大理石构件厂家 虽然也可以在应用配置文件中定义静态缓存规则,但是建 ...

  6. pytorch处理模型过拟合

    演示代码如下 import torch from torch.autograd import Variable import torch.nn.functional as F import matpl ...

  7. 水一帖:快速计算ceil(a/b)的方式

    今天拍脑袋想出来的,不用ceil函数,不用浮点运算,不用取模,兼顾运行常数和代码量的向上取整除方法 在保证a,b>0时 ceil(a/b)=(a-1)/b+1; (完)

  8. Python-爬虫-requests库用语post登录

    requests库很强大,支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的URL和POST数据自动编码. 可以发送无参数的get请求, ...

  9. 基于Netty的RPC架构学习笔记(一):NIO

    文章目录 传统的socket分析 举个

  10. 【JS】 +function(){} 作用

    原文地址:https://www.jianshu.com/p/a2666014a280 瞎扯 在JS中,经常会遇到下面这种 代码, 到底 在 function 前面加一个 一元操作符, 有什么作用呢? ...