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() 還原為之前的光標