轉自 http://note.sdo.com/u/icez/n/mvO-X~jxRnAMLX028000F9
《duilib之源碼分析》
1 stdAfx.h
* lengthof(x) 計算數組長度宏
* MAX 兩值最大
* MIN 兩值最小
* CLAMP(x,a,b) x在a,b之間則取x否則取最小
2 UIBase
* UI_WNDSTYLE_ 窗口風格屬性
* UI_CLASSSTYLE_ 窗口類屬性
* TRACE(LPCTSTR pstrFormat, ...)
功能 - 調試信息
參考 - 參考printf
* TRACEMSG(UINT uMsg)
功能 - 將windows消息轉化成其對應的宏名
uMsg - Windows消息ID
返回值 - 宏名(字符串)
* class STRINGorID
功能 - 統一資源ID, 字符串類型和整型統一輸出為字符串類型
* class CPoint
描述 - 點
函數 -
CPoint(LPARAM lParam) //將消息中lParam轉化成點
* class CSize
描述 - 矩形的寬和高
* class CRect
描述 - 矩形區域
函數 -
void Empty() //設置left,right,top,bottom為零
void Join(const RECT& rc) //合並兩個矩形產生一個包含兩個矩形的新的矩形
void ResetOffset() //將矩形移動到left=0,top=0的位置
void Normalize() //調整left,right,top,bottom使之left < right top < bottom
void Offset(int cx, int cy) //移動矩形, cx 橫向移動距離, cy 縱向移動距離
void Inflate(int cx, int cy) //放大矩形, cx左右各放大的大小, cy 上下各放大的大小
void Deflate(int cx, int cy) //縮小矩形, cx左右各縮小的大小, cy上下各縮小的大小
void Union(CRect& rc) //合並矩形, 與Join()函數功能幾乎一致, 但對空矩形處理不同
* class CStdPtrArray
變量 -
m_nAllocated //已申請空間大小(可儲存Ptr的數量), 如果空間不足則去realloc m_nAllocated*2的空間
* class CStdString
實現 - 如果長度小於MAX_LOCAL_STRING_LEN(63)則在棧上分配, 否則在堆上分配
函數 -
void Assign(LPCTSTR pstr, int nLength = -1) //分配
* class CStdStringMap
描述 - 字符串map
實現 - 使用times33哈希算法
* class CWindowWnd
函數 -
RegisterWindowClass() //RegisterClass的封裝
RegisterSuperclass() //超類化窗口
Subclass() //子類化窗口
ShowModal() //窗口模態化
?MessageBox() //?UIBase.cpp 為utf8
__WndProc() //消息處理函數
__ControlProc() //超類化消息處理函數
實現 -
duilib消息處理機制
1 創建 - 通過CreateEx最后一個參數傳遞類指針this, 在消息處理函數中對WM_NCCREATE消息進行處理, 通過SetWindowLongPtr(GWLP_USERDATA)進行保存
2 消息處理 - 在消息處理函數通過GetWindowLongPtr(GWLP_USERDATA)得到其類指針, 調用虛函數HandleMessage()相應其他消息。
3 銷毀 - 消息處理函數中對WM_NCDESTROY消息進行處理, 調用原消息處理函數, 重置(GWLP_USERDATA), 調用虛函數OnFinalMessage()做最后處理。
============update 2011 06 07 =====================
3 the 3rd part stb_image
* 描述 - 載入各種圖片格式文件
* 函數 -
stbi_load_from_memory()
功能 - 加載圖片
buffer - 內存數據
len - 數據大小,
x - [out]圖像寬度(像素)
y - [out]圖像高度(像素)
comp - [out]圖像數據組成結果
req_comp - 圖像數據組成
STBI_default = 0, // only used for req_comp
STBI_grey = 1,
STBI_grey_alpha = 2,
STBI_rgb = 3,
STBI_rgb_alpha = 4
[more than] stb_image.c line 100 - 130
stbi_image_free()
功能 - 釋放已加載的圖片數據
4 the 3rd part XUnzip
* 描述 - 解壓zip包
* 函數 -
OpenZip
功能 - 打開一個zip包
z - 內存地址, 文件名, 文件句柄
len - 長度
flag - 標識(ZIP_HANDLE=1, ZIP_FILENAME=2, ZIP_MEMORY=3)
return - HZIP
CloseZip
功能 - 關閉一個zip包
hz - HZIP
GetZipItem
功能 - 從zip包中獲取一項
hz - HZIP
index - 序號
ze - zip入口點結構
FindZipItem
功能 - 在zip包中查找項
hz - HZIP
name - 項名
ic - 大小寫敏感 CASE_INSENSITIVE=1, CASE_SENSITIVE=2
index - [out]序號
ze - zip入口點結構
UnzipItem
功能 - 解壓項
hz - HZIP
dst - [out]解壓后存儲位置
len - 儲存長度
flags - 標識(ZIP_HANDLE=1, ZIP_FILENAME=2, ZIP_MEMORY=3)
5 class CRenderClip
* 描述 - 區域引擎,設置在dc上繪制的區域,防止子控件繪制到父控件外側(float屬性控件除外)
* 實現 -
* 函數 -
GenerateClip() //產生一個剪切區域, hDC窗口句柄, rc區域, clip[out]剪切區
GenerateRoundClip() //產生一個圓角剪切區域, hDC窗口句柄, rc區域, width 橫向圓角弧度, height縱向圓角弧度, clip[out]剪切區
UseOldClipBegin(() //使用整個活躍區域作為剪切區, hDC窗口句柄, clip剪切區
UseOldClipEnd() //使用當前控件有效區域作為剪切區, hDC窗口句柄, clip剪切區
============update 2011 06 15 =====================
6 class CRenderEngine
* 渲染引擎
* 函數 -
LoadImage()
功能 - 加載圖像
bitmap - 圖像
type - 類型
mask - 隱蔽色
實現 -
1 讀取文件,資源和zip包中圖像文件數據到內存[通過HIWORD(bitmap.m_lpstr)區別從資源中或文件中加載MAKEINTRESOURCE The return value is the specified value in the low-order word and zero in the high-order word. (from msdn)]
2 創建DIB
3 通過stbi_load_from_memory加載數據文件並轉化后復制到DIB中
4 返回TImageInfo結構
DrawImage()
功能 - 繪制圖像
hDC - 設備句柄
hBitmap - 位圖句柄
rc - 對象區域
rcPaint - 繪制區域
rcBmpPart - 位圖區域
rcConrners - 拉伸區域
alphaChannel - alpha通道
uFade - 透明度
hole - 居中
xtiled - 橫向平鋪
ytiled - 縱向平鋪
實現 -
1 CreateCompatibleDC (創建內存設備句柄)
2 SelectObject() (將位圖選入內存設備句柄)
3 AlphaBlend (alpha混合)
4 BitBlt() or StretchBlt() (繪制到內存設備句柄)
5 SelectObject() (將老的位圖選入內存設備句柄)
6 DeleteDC (釋放內存設備句柄)
DrawImageString()
功能 - 按標識字符串繪制圖像
hDC - 設備句柄
pManager - 繪制管理者
rc - 對象區域
rcPaint - 繪制區域
pStrImage - 標識字符串
pStrModify - 標識字符串
實現 -
1 分析標識字符串獲取屬性
2 獲取圖像數據
3 繪制圖像
DrawColor()
功能 - 繪制矩形
hDC - 設備句柄
rc - 對象區域
color - 顏色(alpha, r, g, b)
實現 -
如果不需要alpha混合則SetBkColor() ExtTextOut()
否則 創建一個像素大小的32位DIB
DrawGradient()
功能 - 繪制漸變
hDC - 設備句柄
rc - 對象區域
dwFirst - 顏色1
dwSecond - 顏色2
bVertical - 漸變方向 true垂直 false水平
nSteps - 步長 [使用GradientFill() API時無效]
實現 -
1 漸變填充
2 alpha混合
DrawLine() - 繪制直線
DrawRect() - 繪制矩形
DrawRoundRect() - 繪制圓角矩形
DrawText() - 繪制文字
DrawHtmlText()
功能 - 繪制 "mini-html" 標識字符串
hDC - 設備句柄
pManager - 繪制管理者
rc - 對象區域
pstrText - "mini-html" 標識字符串
dwTextColor - 字符串類型
pLinks - 產生鏈接效果的區域組
sLinks - 產生鏈接效果的區域組數量
nLinkRects - 產生鏈接效果的區域組數量
uStyle - 類型,同DrawText() Format Flags
GenerateBitmap()
功能 - 產生一個BMP位圖
pManager - 繪制管理者
pControl - 控件句柄
rc - 對象區域
返回 - BMP句柄
===============update 2011-06-16
7 class INotifyUI - Listener interface
8 class IMessageFilterUI - MessageFilter interface
9 class CPaintManagerUI
* 繪制管理者
* 函數
Init() - 初始化
NeedUpdate() -
Invalidate() - InvalidateRect API的封裝
GetPaintDC() - 設備句柄相關函數
GetPaintWindow() - 得到窗口句柄
GetTooltipWindow() - 得到提示窗口句柄
GetMousePos() - 得到鼠標位置
GetClientSize() - 得到客戶端區域大小
獲取/設置 窗口初始化時大小
GetInitSize()
SetInitSize()
獲取/設置 托腮大小
GetSizeBox()
SetSizeBox()
獲取/設置 標題區域大小
GetCaptionRect()
SetCaptionRect()
獲取/設置 圓角大小
GetRoundCorner()
SetRoundCorner()
獲取/設置 大小的最小限制
GetMinInfo()
SetMinInfo()
獲取/設置 大小的最大限制
GetMaxInfo()
SetMaxInfo()
設置透明度
SetTransparent()
設置背景是否使用透明屬性
SetBackgroundTransparent()
獲取/設置 刷新區域屬性
IsShowUpdateRect()
SetShowUpdateRect()
獲取/設置 應用程序對象實例句柄
GetInstance()
SetInstance()
獲取 可執行程序所在路徑
GetInstancePath()
獲取/設置 當前工作目錄
GetCurrentPath()
SetCurrentPath()
獲取/設置 資源動態庫句柄
GetResourceDll()
SetResourceDll()
獲取/設置 資源路徑
GetResourcePath()
SetResourcePath()
獲取/設置 資源壓縮包文件名
GetResourceZip()
SetResourceZip()
使用繪制管理者的根繪制管理者的資源設置 - 循環得到父繪制管理者直到找到最頂層的繪制管理者
UseParentResource()
得到繪制管理者
GetParentResource()
獲取/設置 非可用狀態文字顏色
GetDefaultDisabledColor()
SetDefaultDisabledColor()
獲取/設置 默認字體顏色
GetDefaultFontColor()
SetDefaultFontColor()
獲取/設置超鏈接默認字體顏色
GetDefaultLinkFontColor()
SetDefaultLinkFontColor()
獲取/設置 鼠標漂浮在鏈接上時默認字體顏色
GetDefaultLinkHoverFontColor()
SetDefaultLinkHoverFontColor()
獲取/設置 選中后背景顏色
GetDefaultSelectedBkColor()
SetDefaultSelectedBkColor()
獲取/設置 默認字體
GetDefaultFontInfo()
SetDefaultFont()
字體列表操作
DWORD GetCustomFontCount() - 得到字體列表中項數量
HFONT AddFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 加入一種字體到字體列表中
HFONT AddFontAt(int index, LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 加入一種字體到字體列表的指定位置
HFONT GetFont(int index) - 按序號得到字體列表中的字體
HFONT GetFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 按字體屬性得到字體列表中的字體
bool FindFont(HFONT hFont) - 按句柄查找字體列表中的一項
bool FindFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 按屬性查找字體列表中的一項
bool RemoveFont(HFONT hFont) - 按句柄移除字體列表中的指定項
bool RemoveFontAt(int index) - 按序號移除字體列表中的指定項
void RemoveAllFonts() - 移除字體列表中的所有項
TFontInfo* GetFontInfo(int index) - 按序號得到字體列表中項的屬性
TFontInfo* GetFontInfo(HFONT hFont) - 按句柄得到字體列表中項的屬性
圖片列表操作
const TImageInfo* GetImage(LPCTSTR bitmap);
const TImageInfo* GetImageEx(LPCTSTR bitmap, LPCTSTR type = NULL, DWORD mask = 0);
const TImageInfo* AddImage(LPCTSTR bitmap, LPCTSTR type = NULL, DWORD mask = 0);
bool RemoveImage(LPCTSTR bitmap);
void RemoveAllImages();
默認屬性列表操作
void AddDefaultAttributeList(LPCTSTR pStrControlName, LPCTSTR pStrControlAttrList);
LPCTSTR GetDefaultAttributeList(LPCTSTR pStrControlName) const;
bool RemoveDefaultAttributeList(LPCTSTR pStrControlName);
const CStdStringPtrMap& GetDefaultAttribultes() const;
void RemoveAllDefaultAttributeList();
將控件樹附加到當前繪制管理者
bool AttachDialog(CControlUI* pControl);
初始化控件 把控件名稱加入到繪制管理者的控件名map中
bool InitControls(CControlUI* pControl, CControlUI* pParent = NULL);
重置控件
void ReapObjects(CControlUI* pControl);
選項組操作
bool AddOptionGroup(LPCTSTR pStrGroupName, CControlUI* pControl); - 添加選項組
CStdPtrArray* GetOptionGroup(LPCTSTR pStrGroupName); - 通過名稱得到選項組
void RemoveOptionGroup(LPCTSTR pStrGroupName, CControlUI* pControl); - 移除選項組
void RemoveAllOptionGroups(); - 移除所有選項組
得到控件焦點
CControlUI* GetFocus() const;
控件獲得焦點
void SetFocus(CControlUI* pControl);
得到標簽頁控件
bool SetNextTabControl(bool bForward = true);
定時器操作
bool SetTimer(CControlUI* pControl, UINT nTimerID, UINT uElapse); - 設置一個定時器
bool KillTimer(CControlUI* pControl, UINT nTimerID); - 清除一個定時器
void RemoveAllTimers(); - 清楚所有定時器
捕獲鼠標
void SetCapture();
釋放捕獲鼠標
void ReleaseCapture();
鼠標是否被捕獲
bool IsCaptured();
bool AddNotifier(INotifyUI* pControl); - 加入一個Listener
bool RemoveNotifier(INotifyUI* pControl); - 移除一個Listener
void SendNotify(TNotifyUI& Msg); - 發送一個Notify消息
void SendNotify(CControlUI* pControl, LPCTSTR pstrMessage, WPARAM wParam = 0, LPARAM lParam = 0); - 發送一個Notify消息
bool AddPreMessageFilter(IMessageFilterUI* pFilter); - 加入一個預處理Message Filter
bool RemovePreMessageFilter(IMessageFilterUI* pFilter); - 移除一個預處理Message Filter
bool AddMessageFilter(IMessageFilterUI* pFilter); - 加入一個Message Filter
bool RemoveMessageFilter(IMessageFilterUI* pFilter); - 移除一個Message Filter
PostPaint控件操作
int GetPostPaintCount() const; - 得到PostPaint控件數量
bool AddPostPaint(CControlUI* pControl); - 加入PostPaint控件
bool RemovePostPaint(CControlUI* pControl); - 移除一個PostPaint控件
bool SetPostPaintIndex(CControlUI* pControl, int iIndex); - 設置控件到指定的序列位置
加入控件到延遲處理列表當中
void AddDelayedCleanup(CControlUI* pControl);
得到根控件
CControlUI* GetRoot() const;
按照位置找到控件
CControlUI* FindControl(POINT pt) const;
按父窗口和位置查找控件
CControlUI* FindControl(CControlUI* pParent, POINT pt) const;
按名字查找控件
CControlUI* FindControl(LPCTSTR pstrName);
按父窗口和名字查找控件
CControlUI* FindControl(CControlUI* pParent, LPCTSTR pstrName);
消息循環
static void MessageLoop();
消息處理
static bool TranslateMessage(const LPMSG pMsg);
消息處理
bool MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes);
消息預處理
bool PreMessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes);
回調函數 - 比較屬性(pData)與控件(pThis)的屬性是否相同
static CControlUI* CALLBACK __FindControlFromNameHash(CControlUI* pThis, LPVOID pData); - 按名稱查找控件的回調函數
static CControlUI* CALLBACK __FindControlFromCount(CControlUI* pThis, LPVOID pData); - 計算控件數目的回調函數
static CControlUI* CALLBACK __FindControlFromPoint(CControlUI* pThis, LPVOID pData); - 按位置查找控件的回調函數
static CControlUI* CALLBACK __FindControlFromTab(CControlUI* pThis, LPVOID pData); - 查找下一個相應tab的控件
static CControlUI* CALLBACK __FindControlFromShortcut(CControlUI* pThis, LPVOID pData); - 快捷方式對應的控件
static CControlUI* CALLBACK __FindControlFromUpdate(CControlUI* pThis, LPVOID pData); - 查找需要刷新的控件
static CControlUI* CALLBACK __FindControlFromNameByParent(CControlUI* pThis, LPVOID pData); - 查找子控件
HWND m_hWndPaint; //繪制窗口句柄
HDC m_hDcPaint; //繪制DC
HDC m_hDcOffscreen; //屏幕兼容DC
HDC m_hDcBackground; //背景DC
HBITMAP m_hbmpOffscreen; //屏幕DIB
HBITMAP m_hbmpBackground; //背景DIB
HWND m_hwndTooltip; //提示窗口句柄
TOOLINFO m_ToolTip; //提示結構
bool m_bShowUpdateRect; //是否更新
//
CControlUI* m_pRoot; //根控件指針
CControlUI* m_pFocus; //獲得焦點控件指針
CControlUI* m_pEventHover; //鼠標停留控件指針
CControlUI* m_pEventClick; //點擊事件控件指針
CControlUI* m_pEventKey; //相應鍵盤事件控件指針
//
POINT m_ptLastMousePos; //鼠標位置
SIZE m_szMinWindow; //窗口最小限制
SIZE m_szMaxWindow; //窗口最大限制
SIZE m_szInitWindowSize; //初始化窗口大小
RECT m_rcSizeBox; //托腮大小
SIZE m_szRoundCorner; //圓角大小
RECT m_rcCaption; //標題大小
UINT m_uTimerID; //計時器ID
bool m_bFirstLayout; //是否為第一層
bool m_bUpdateNeeded; //是否需要更新
bool m_bFocusNeeded; //是否需要焦點
bool m_bOffscreenPaint; //是否繪制m_hDcOffscreen
bool m_bAlphaBackground; //背景是否透明
bool m_bMouseTracking; //是否追蹤鼠標
bool m_bMouseCapture; //是否捕獲鼠標
CStdPtrArray m_aNotifiers; //Listener 列表
CStdPtrArray m_aTimers; //計時器列表
CStdPtrArray m_aPreMessageFilters; //預處理消息列表
CStdPtrArray m_aMessageFilters; //消息處理列表
CStdPtrArray m_aPostPaintControls; //PostPaint控件列表
CStdPtrArray m_aDelayedCleanup; //延遲釋放控件列表
CStdStringPtrMap m_mNameHash; //控件名哈希列表
CStdStringPtrMap m_mOptionGroup; //選項組列表
CPaintManagerUI* m_pParentResourcePM; //當前繪制管理者的上一層繪制管理者(父繪制管理者)
DWORD m_dwDefalutDisabledColor; //默認非可用狀態字體顏色
DWORD m_dwDefalutFontColor; //默認字體顏色
DWORD m_dwDefalutLinkFontColor; //默認鏈接顏色
DWORD m_dwDefalutLinkHoverFontColor; //默認鼠標漂浮時字體顏色
DWORD m_dwDefalutSelectedBkColor; //默認被選擇后背景顏色
TFontInfo m_DefaultFontInfo; //默認字體信息
CStdPtrArray m_aCustomFonts; //字體列表
CStdStringPtrMap m_mImageHash; //圖片資源名哈希表
CStdStringPtrMap m_DefaultAttrHash; //默認屬性哈希表
static HINSTANCE m_hInstance; //應用程序對象實例句柄
static HINSTANCE m_hResourceInstance; //資源對象實例句柄
static CStdString m_pStrResourcePath; //資源路徑
static CStdString m_pStrResourceZip; //zip包資源名稱
static CStdPtrArray m_aPreMessages; //預處理消息隊列
======update 2011-07-09========================================
10 class UIMarkup - 解析XML
CMarkup()
功能 - 構造函數
pstrXML - xml數據
實現 -
初始化成員變量
調用Load()
~CMarkup()
功能 - 析構函數
Load()
功能 - 加載xml數據
pstrXML - xml數據
LoadFromMem()
功能 - 從內存中加載xml數據
pByte - 內存數據指針
dwSize - 大小
encoding - 編碼方式 XMLFILE_ENCODING_UTF8(默認) XMLFILE_ENCODING_UNICODE XMLFILE_ENCODING_ASNI
實現 -
進行編碼轉換
申請控件
復制數據
LoadFromFile()
功能 - 從文件中加載xml數據
pstrFilename - 文件名
encoding - 編碼方式
實現 -
判斷資源類型是否為zip包,如果為zip包則進行解壓
調用LoadFromMem()
Release() - 釋放xml數據和元素信息數據
IsValid() - Markup是否有效
SetPreserveWhitespace() - 設置是否保存空白行
GetLastErrorMessage()
功能 - 得到錯誤信息
pstrMessage - [out]錯誤信息內容
cchMax - 信息長度
GetLastErrorLocation
功能 - 得到出錯位置
pstrSource - 錯誤所在位置內容
cchMax - 內容長度
GetRoot() - 得到根節點
private:
tagXMLELEMENT //元素結構
{
ULONG iStart; //在m_pstrXML中起始位置
ULONG iChild; //子標簽在m_pstrXML中的位置
ULONG iNext; //同級下一個標簽在m_pstrXML中的位置
ULONG iParent; //上一級標簽在m_pstrXML中的位置
ULONG iData; //元素數據在m_pstrXML中的位置
} XMLELEMENT;
LPTSTR m_pstrXML; //xml數據
XMLELEMENT* m_pElements; //元素列表
ULONG m_nElements; //元素數量
ULONG m_nReservedElements; //存儲元素空間
TCHAR m_szErrorMsg[100]; //錯誤消息
TCHAR m_szErrorXML[50]; //錯誤內容
bool m_bPreserveWhitespace; //是否過濾空白
解析xml數據
bool _Parse();
bool _Parse(LPTSTR& pstrText, ULONG iParent);
實現 -
for(;;)
{
如果為頂層則返回
填充element
解析名字
解析屬性
標簽閉合方式
如果為/>則continue
如果為>則遞歸調用_Parse()
如果為該標簽的對應閉合標簽 continue
}
XMLELEMENT* _ReserveElement(); - 申請保存元素空間
跳過空白
inline void _SkipWhitespace(LPTSTR& pstr) const;
inline void _SkipWhitespace(LPCTSTR& pstr) const;
跳過標識符
inline void _SkipIdentifier(LPTSTR& pstr) const;
inline void _SkipIdentifier(LPCTSTR& pstr) const;
bool _ParseData(LPTSTR& pstrText, LPTSTR& pstrData, char cEnd);
功能 - 解析數據
pstrText - 被解析的數據字符串
pstrData - 解析后的數據字符串
cEnd - 終止字符
解析轉義字符
void _ParseMetaChar(LPTSTR& pstrText, LPTSTR& pstrDest);
解析屬性
bool _ParseAttributes(LPTSTR& pstrText);
記錄錯誤信息返回錯誤
bool _Failed(LPCTSTR pstrError, LPCTSTR pstrLocation = NULL);
11 class CMarkupNode
CMarkupNode
=======update 2011-07-10========
11 class CMarkupNode
CMarkupNode() - 構造函數 構造一個空節點
CMarkupNode(CMarkup* pOwner, int iPos)
功能 - 構造函數
pOwner - CMarkup指針
iPos - 在xml數據中的位置
IsValid() - 節點對象是否有效
GetParent() - 得到父節點
GetSibling() - 得到兄弟節點
GetChild() - 得到子節點
GetChild(LPCTSTR pstrName)
功能 - 按名字得到子節點
實現 - 循環查找所有子節點,直到名字匹配
HasSiblings() - 是否有兄弟節點
HasChildren() - 是否有子節點
GetName() - 得到節點對應的標簽名
GetValue() - 得到節點對應的標簽數據值
HasAttributes() - 是否有屬性
HasAttribute(LPCTSTR pstrName) - 是否有名為pstrName的屬性
GetAttributeCount() - 得到節點屬性的數量
GetAttributeName(int iIndex) - 按序號得到屬性名稱
bool GetAttributeValue(int iIndex, LPTSTR pstrValue, SIZE_T cchMax)
功能 - 得到屬性
iIndex - 屬性序號
pstrValue - [out] 屬性值字符串
cchMax - 屬性值字符串長度
bool GetAttributeValue(LPCTSTR pstrName, LPTSTR pstrValue, SIZE_T cchMax)
功能 - 得到屬性
pstrName - 屬性名
pstrValue - [out] 屬性值字符串
cchMax - 屬性值字符串長度
_MapAttributes() - 解析xml屬性建立 屬性名和值的表映射到xml數據的位置
enum { MAX_XML_ATTRIBUTES = 64 }; //屬性最大數量限制
typedef struct
{
ULONG iName;
ULONG iValue;
} XMLATTRIBUTE; //屬性結構
int m_iPos; //節點在xml數據中的位置
int m_nAttributes; //屬性數量
XMLATTRIBUTE m_aAttributes[MAX_XML_ATTRIBUTES]; //屬性-值 映射xml位置 列表
CMarkup* m_pOwner; - CMarkup指針
12 class IDialogBuilderCallback - 構建UI時回調類 用於創造用戶自定義的控件
virtual CControlUI* CreateControl(LPCTSTR pstrClass) = 0 - 創建用戶自定義控件, pstrClass控件名
13 class CDialogBuilder - 構建UI
CControlUI* Create();
功能 - 構建UI
STRINGorID xml - 可以是一個內存xml數據或一個文件名
STRINGorID type = (UINT) 0 - 如果xml數據位於EXE資源中則type指定資源類型
IDialogBuilderCallback* pCallback = NULL - 回調函數
CPaintManagerUI* pManager = NULL - 繪制管理者指針
實現 -
判斷xml類型
加載xml數據
調用Create(pCallback, pManager)構建
CControlUI* Create(IDialogBuilderCallback* pCallback = NULL, CPaintManagerUI* pManager = NULL);
功能 - 構建UI
實現 -
得到頂層Window標簽,並解析屬性
調用_Parse() 解析xml
void GetLastErrorMessage(LPTSTR pstrMessage, SIZE_T cchMax) const; - 錯誤信息
void GetLastErrorLocation(LPTSTR pstrSource, SIZE_T cchMax) const; - 出錯位置
CControlUI* _Parse(CMarkupNode* parent, CControlUI* pParent = NULL, CPaintManagerUI* pManager = NULL);
實現 -
for(循環頂級標簽)
{
按xml標簽創建控件對象
如果不是標准控件則調用m_pCallback->CreateControl()創建用戶自定義控件對象
如果有子節點則遞歸調用_Parse()
因為某些屬性和父窗口相關,比如selected,必須先Add到父窗口
初始化控件默認屬性
根據xml數據解析處理控件屬性
}
CMarkup m_xml; //CMarkup對象
IDialogBuilderCallback* m_pCallback;//構建控件回調
14 class CControlUI 控件
GetName() - 得到控件名稱 名稱為控件的唯一ID
SetName() - 設置控件名稱
GetInterface() - 得到控件指針
GetClass() - 得到控件類名
GetControlFlags() - 得到控件類型標志
Activate() - 控件是否活躍 (非不可用狀態,非不可見狀態)
GetManager() - 得到繪制管理者
SetMananer()
功能 - 設置控件的繪制管理者
實現 -
設置控件管理者
初始化
GetParent() - 得到父控件
GetText() - 得到控件顯示內容
SetText() - 設置控件顯示內容
GetBkColor() - 得到背景色
GetBkColor2() - 得到背景色2
SetBkColor2() - 設置背景色2
GetBkColor3() - 得到背景色3
SetBkColor3() - 設置背景色3
* 背景色1,2,3用於漸變色 顏色漸變過程為1->2->3
GetBkImage() - 得到背景圖片
SetBkImage() - 設置背景圖片
GetBorderColor() - 得到邊的顏色
SetBorderColor() - 設置邊的顏色
GetFocusBorderColor() - 設置獲得焦點時邊的顏色
GetBorderSize() - 得到邊的寬度
SetBorderSize() - 設置邊的寬度
GetBorderRound() - 得到圓角
SetBorderRound() - 設置圓角
DrawImage() - 繪制圖片
GetPos() - 得到控件位置
SetPos() - 設置控件位置並重繪
GetWidth() - 得到控件寬度
GetHeight() - 得到控件高度
GetX() - 得到控件橫坐標位置(左上點橫坐標)
GetY() - 得到控件縱坐標位置(左上點縱坐標)
GetPadding() - 設置外邊距,由上層窗口繪制(求周圍控件離它遠點或近點(負值,不過受繪制順序影響,比較少用)
SetPadding() - 設置外邊距,由上層窗口繪制
GetFixedXY() - 實際大小位置使用GetPos獲取,這里得到的是預設的參考值
SetFixedXY() - 僅float為true時有效
GetFixedWidth() - 實際大小位置使用GetPos獲取,這里得到的是預設的參考值
SetFixedWidth() - 預設的參考值
GetFixedHeight() - 實際大小位置使用GetPos獲取,這里得到的是預設的參考值
SetFixedHeight() - 預設的參考值
設置大小的限制值
GetMinWidth()
SetMinWidth()
GetMaxWidth()
SetMaxWidth()
GetMinHeight()
SetMinHeight()
GetMaxHeight()
SetMaxHeight()
SetRelativePos() - 設置相對位置比例
SetRelativeParentSize() - 設置父控件大小
GetRelativePos() - 得到相對位置比例
IsRelativePos() -是使用相對位置
獲取/設置 提示信息
GetToolTip()
SetToolTip()
獲取/設置 快捷鍵
GetShortcut()
SetShortcut()
獲取/設置 上下文菜單是否被使用
IsContextMenuUsed()
獲取/設置 用戶數據(字符串)
GetUserData()
SetUserData()
獲取/設置 用戶指針
GetTag()
SetTag()
獲取/設置 控件是否可見
IsVisible()
SetVisible()
SetInternVisible() // 僅供內部調用,有些UI擁有窗口句柄,需要重寫此函數
有窗口句柄的UI在設置不可見時,需要先失去焦點