DUiLib 源碼分析——第二篇UIBase

DUiLib 源碼分析 ——以UiLib 1.01版爲分析目標
----------------------------------------------------------------------------------
分析約定:
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()                      還原爲之前的光標
        
                                                

                                    ——colin3dmax 分析於2011-6-16 19:44

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章