天天看點

DuiLib——第二篇UIBase

分析約定:

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 Add(LPCVOID pData)             追加資料

    +---int GetSize() const                 擷取目前儲存元素的個數

    +---LPVOID GetData()                    擷取資料

    +---LPVOID GetAt(int iIndex) 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()                      還原為之前的光标