0 duilib文件(5/17) [x] stb_image.c [x] stdafx.h stdafx.cpp [ ] UIActiveX.h UIActiveX.cpp [x] UIBase.h UIBase.cpp [ ] UICombo.h UICombo.cpp [x] UICommonControls.h UICommonControls.cpp [ ] UIContainer.h UIContainer.cpp [x] UIControl.h UIControl.cpp [x] UIDelegate.h UIDelegate.cpp [x] UIDlgBuilder.h UIDlgBuilder.cpp [x] UIlib.h UIlib.cpp [ ] UIList.h UIList.cpp [x] UIManager.h UIManager.cpp [x] UIMarkup.h UIMarkup.cpp [x] UIRender.h UIRender.cpp [ ] UIRichEdit.h UIRichEdit.cpp [x] XUnzip.cpp 1 stdAfx 預編譯 * int lengthof(x) 計算數組長度宏 * MAX 兩值最大 * MIN 兩值最小 * CLAMP(x,a,b) x在a,b之間則取x否則取最小 * winmm.lib Windows 多媒體相關應用程序接口庫 * comctl32.lib Windows 通用控件庫 2 UIBase * UI_WNDSTYLE_ 窗口風格屬性 * UI_CLASSSTYLE_ 窗口類屬性 /////<TODO:增加具體每項的解釋> * ASSERT(expr) - 斷言 同_ASSERTE(expr) 顯示斷言所在文件,行以及expr的內容 * 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 分析標識字符串獲取屬性 1.1 先分析pStrImage信息后再分析pStrModify的信息 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); - 添加控件到組中, 如果組選賢存在則加入pControl到此組中,如果不存在則創建新組並加入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); - 發送一個通知 void SendNotify(CControlUI* pControl, LPCTSTR pstrMessage, WPARAM wParam = 0, LPARAM lParam = 0); - 發送一個通知 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; 在控件名map中按名字匹配控件 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; //預處理消息隊列 |
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() - 得到根節點 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); =======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構建者, 用於構建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擁有窗口句柄,需要重寫此函數 =============update 2011-07-11 獲取/設置 控件可用 IsEnabled() SetEnabled() 獲取/設置 是否處理鼠標事件 IsMouseEnabled() SetMouseEnabled() 控件是否獲得焦點 IsFocused() 設置控件獲得焦點 SetFocuse() 控件是否懸浮 IsFloat() 設置控件為懸浮 SetFloat() FindControl() - 查找控件 Invalidate() 功能 - 設置無效,引起刷新 實現 - 循環至頂層控件為止, 計算當前無效區域與父控件交叉區域作為新無效區域。 獲取/設置 需更新狀態 IsUpdateNeeded() NeedUpdate() Init() - 初始化控件事件響應, 在SetManager()中被調用 DoInit() - 做初始化處理函數, 被Init()調用 DoEvent() - 事件響應函數 SetAttribute() - 設置屬性, 根據解析后的名稱對所關心的屬性設置狀態成員變量的值 ApplyAttributeList() - 解析標簽的屬性字符串, 調用SetAttribute() EstimateSize() - 預估控件大小 DoPaint() 功能 - 控件繪制 實現 - 繪制循序:背景顏色->背景圖->狀態圖->文本->邊框 PaintBkColor() 功能 - 繪制背景色 PaintBkImage() 功能 - 繪制背景圖片 PaintStatusImage() 功能 - 根據狀態繪制背景圖片 PaintText() - 繪制文字 PaintBorder() - 繪制邊框 DoPostPaint() - ? 事件源 - 可以通過委托的設計模式為初始化,銷毀,事件處理過程中加入更多的處理過程 CEventSource OnInit; - 初始化事件源 CEventSource OnDestroy; - 銷毀事件源 CEventSource OnEvent; - 事件響應事件源 ======update 2011 07 16 15 UIlib.h/UIlib.cpp * UIlib.h 導出導入宏 包含系統的頭文件 包含duilib庫的頭文件 * UIlib.cpp Bjarke Viksoe UI library dllmain() 函數 16 class CDelegateBase 委托模式中的虛基類 CDelegateBase(void* pObject, void* pFn); - 構造函數,pObject為委托者的對象, pFn為執行方法 CDelegateBase(const CDelegateBase& rhs); - 拷貝構造函數 virtual ~CDelegateBase(); - 析構函數 bool Equals(const CDelegateBase& rhs) const; - 比較兩個委托者, true 一致 false不同 bool operator() (TEventUI& event); - 響應委托進行處理 event為響應的事件 virtual CDelegateBase* Copy() = 0; - 拷貝一個委托者 void* GetFn(); - 得到執行方法 void* GetObject(); - 得到委托者對象 virtual bool Invoke(TEventUI& event) = 0; - 調用執行方法 void* m_pObject; - 委托者 void* m_pFn; - 執行方法 17 class CDelegateStatic 靜態委托,委托者為空,但有執行過程 18 class CDelegate 委托,委托者不為空 19 產生委托 CDelegate<O, T> MakeDelegate(O* pObject, bool (T::* pFn)(TEventUI&)) inline CDelegateStatic MakeDelegate(bool (*pFn)(TEventUI&)) 20 class CEventSource - 事件源 加入一個委托者 void operator+= (CDelegateBase& d); void operator+= (FnType pFn); 刪除一個委托者 void operator-= (CDelegateBase& d); void operator-= (FnType pFn); 響應事件進行處理 bool operator() (TEventUI& event); CStdPtrArray m_aDelegates; - 委托者列表 21 class CLabelUI - 標簽控件 CLabelUI() - 構造函數 m_uTextStyle - 樣式, 默認居中 m_dwTextColor - 可用時文字顏色 m_dwDisabledTextColor - 不可用時文字顏色 m_iFont - 字體序號 m_bShowHtml - 是否使用內嵌hmtl標記格式 GetClass() - 返回控件名 GetInterface() - 得到對象指針 獲取/設置 文本樣式 GetTextStyle() SetTextStyle() 獲取/設置 可用狀態文字顏色 SetTextColor() GetTextColor() 獲取/設置 為可用狀態文字顏色 SetDisableTextColor() GetDisabledTextColor() 獲取/設置 控件使用的字體, 對應在字體列表中的序號 SetFont() GetFont() 獲取/設置 文字與邊框之間填充距離 GetTextPadding() SetTextPadding() 獲取/設置 是否使用內嵌html標記格式 IsShowHtml() SetShowHtml() EstimateSize() - 預估控件大小 DoEvent() - 事件處理 SetAttribute() - 設置屬性 PaintText() - 繪制文本 22 class CButtonUI CButtonUI() - 構造函數, 文本樣式為單行居中 GetClass() - 返回控件名 GetInterface() - 得到對象指針 GetControlFlags() - 得到控件的類型標志 DoEvent() - 事件處理 非鼠標事件交給基類CLabelUI處理, 鼠標事件由此函數處理 Activate() 功能 - 激活按鈕控件 實現 - 判斷是否活躍,如活躍發送通知 SetEnabled() - 設置按鈕控件是否可用 實現 - 調用基類設置, 如不可用則清空按鈕狀態 設置/獲取 鼠標懸時文本的顏色 SetHotTextColor() GetHotTextColor() 設置/獲取 按鈕按下時文本顏色 SetPushedTextColor() GetPushedTextColor() 設置/獲取 按鈕獲得焦點時文本顏色 SetFocusedTextColor() GetFocusedTextColor() 獲取/設置 正常狀態下按鈕背景圖片 GetNormalImage() SetNormalImage() 獲取/設置 鼠標懸浮時按鈕背景圖片 SetHotImage() GetHotImage() 獲取/設置 按鈕被按下時背景圖片 GetPushedImage() SetPushedImage() 獲取/設置 按鈕獲得焦點時背景圖片 GetFocusedImage() SetFocusedImage() 獲取/設置 非可用狀態下按鈕背景圖片 GetDisabledImage() SetDisabledImage() EstimateSize() - 預估大小 SetAttribute() - 設置屬性, 根據解析后的名稱對所關心的屬性設置狀態成員變量的值 PaintText() - 繪制文本 PaintStatusImage() - 繪制狀態背景圖片 23 class COptionUI - 選項控件(如CheckBox RadioBox等) COptionUI() - 構造函數 ~COptionUI() - 析構函數 CPaintManaerUI::RemoveOptionGroup() GetClass() - 返回控件名 GetInterface() - 得到對象指針 SetManager() - 設置繪制管理者, 父控件 獲取/設置 選項所屬組 GetGroup() SetGroup() 獲取/設置 選項是否處於選中狀態 IsSelected() Selected() Activate() - 激活選項控件 獲取/設置 選中狀態背景圖片 GetSelectedImage() SetSelectedImage() 獲取/設置 前景圖片 GetForeImage() SetForeImage() EstimateSize() - 預估選項控件大小 SetAttribute() - 設置屬性, 根據解析后的名稱對所關心的屬性設置狀態成員變量的值 PaintStatusImage() - 繪制狀態背景圖片 24 class CTextUI * CTextUI() - 構造 ~CTextUI() - 析構 GetClass() - 返回控件名 GetControlFlags() - 得到控件的類型標志 GetInterface() - 得到對象指針 GetLinkContent() - 得到當前控件中指定序號的超文本的內容 DoEvent() - 事件處理 EstimateSize() - 預估選項控件大小 PaintText() - 繪制文字 MAX_LINK - 超文本數量限制 m_nLinks - 超文本數量 m_rcLinks - 超文本區域數組 m_sLinks - 超文本內容數組 int m_bHoverLink - 鼠標浮動的超文本鏈接序號 25 class CProgressUI GetClass() - 返回控件名 GetInterface() - 得到對象指針 - 獲取/設置 進度條方向 bool IsHorizontal(); void SetHorizontal(bool bHorizontal = true); -獲取/設置 最小值 int GetMinValue() const; void SetMinValue(int nMin); 獲取/設置 最大值 int GetMaxValue() const; void SetMaxValue(int nMax); 獲取 設置 最小值 int GetValue() const; void SetValue(int nValue); 獲取 設置 前景圖 LPCTSTR GetFgImage() const; void SetFgImage(LPCTSTR pStrImage); void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); - 設置屬性 void PaintStatusImage(HDC hDC); - 繪制狀態圖 bool m_bHorizontal - 進度條控件方向 int m_nMax; 最大值 int m_nMin; 最小值 int m_nValue; 當前值 CStdString m_sFgImage; - 前景圖 CStdString m_sFgImageModify; - 前景圖2 26 class CSliderUI CSliderUI() - 構造 GetClass() - 返回控件名 GetInterface() - 得到對象指針 UINT GetControlFlags() const; - 得到控件的類型標志 void SetEnabled(bool bEnable = true); - 設置滑塊控件是否可用 獲取 設置滑塊步長 int GetChangeStep(); void SetChangeStep(int step); 獲取設置滑塊大小 void SetThumbSize(SIZE szXY); RECT GetThumbRect() const; 獲取設置滑塊圖 LPCTSTR GetThumbImage() const; void SetThumbImage(LPCTSTR pStrImage); 獲取設置鼠標懸浮狀態滑塊圖 LPCTSTR GetThumbHotImage() const; void SetThumbHotImage(LPCTSTR pStrImage); 獲取設置滑塊按下狀態滑塊圖 LPCTSTR GetThumbPushedImage() const; void SetThumbPushedImage(LPCTSTR pStrImage); void DoEvent(TEventUI& event); - 事件處理 void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); - 設置屬性 void PaintStatusImage(HDC hDC); - 繪制狀態圖 SIZE m_szThumb; - 滑塊大小 UINT m_uButtonState; - 控件狀態 int m_nStep; - 步長 CStdString m_sThumbImage; - 正常狀態滑塊塊圖 CStdString m_sThumbHotImage; - 鼠標懸浮狀態滑塊圖 CStdString m_sThumbPushedImage; - 按下狀態滑塊圖 CStdString m_sImageModify; - 滑塊圖2 |