1 stdAfx.h * lengthof(x) 計算數組長度宏 * MAX 兩值最大 * MIN 兩值最小 * CLAMP(x,a,b) x在a,b之間則取x否則取最小 2 UIBase * UI_WNDSTYLE_ 窗口風格屬性 * UI_CLASSSTYLE_ 窗口類屬性 * DUITRACE(LPCTSTR pstrFormat, ...) 功能 - 調試信息 參考 - 參考printf * DUITRACEMSG(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 CMarkup - 解析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); =======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在設置不可見時,需要先失去焦點 =============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 27 class CEditUI CEditUI(); GetClass() - 返回控件名 GetInterface() - 得到對象指針塊 UINT GetControlFlags() const; - 得到控件的類型標志 void SetEnabled(bool bEnable = true); - 設置編輯框控件是否可用 void SetText(LPCTSTR pstrText); - 設置文本 void SetMaxChar(UINT uMax); - 設置輸入文本長度限制 UINT GetMaxChar(); - 獲取最大輸入文本長度 void SetReadOnly(bool bReadOnly); - 設置只讀模式 bool IsReadOnly() const; - 獲取只讀模式 void SetPasswordMode(bool bPasswordMode); - 獲取密碼編輯框模式 bool IsPasswordMode() const; - 設置密碼編輯模式 void SetPasswordChar(TCHAR cPasswordChar); 設置密碼模式顯示字符 TCHAR GetPasswordChar() const; 獲取密碼模式顯示字符Edit_SetPasswordChar 獲取設置正常狀態圖 LPCTSTR GetNormalImage(); void SetNormalImage(LPCTSTR pStrImage); 獲取設置懸浮狀態圖 LPCTSTR GetHotImage(); void SetHotImage(LPCTSTR pStrImage); 獲取設置獲得焦點狀態圖 LPCTSTR GetFocusedImage(); void SetFocusedImage(LPCTSTR pStrImage); 獲取設置非可用狀態圖 LPCTSTR GetDisabledImage(); void SetDisabledImage(LPCTSTR pStrImage); 獲取設置原生編輯框背景色 void SetNativeEditBkColor(DWORD dwBkColor); DWORD GetNativeEditBkColor() const; void SetPos(RECT rc); - 得到編輯框位置 void SetVisible(bool bVisible = true); - 設置可見狀態 void SetInternVisible(bool bVisible = true); - // 僅供內部調用,有些UI擁有窗口句柄,需要重寫此函數 SIZE EstimateSize(SIZE szAvailable); - 預估控件大小 void DoEvent(TEventUI& event); - 處理事件 void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); - 設置屬性 void PaintStatusImage(HDC hDC); - 繪制狀態圖 void PaintText(HDC hDC); - 繪制文本 CEditWnd* m_pWindow; - 原生編輯框窗口 UINT m_uMaxChar; - 文本長度限制 bool m_bReadOnly; - 只讀方式 bool m_bPasswordMode; - 顯示密碼模式 TCHAR m_cPasswordChar; - 密碼模式顯示的字符 UINT m_uButtonState; - 編輯框狀態 CStdString m_sNormalImage; - 正常狀態圖 CStdString m_sHotImage; - 懸浮狀態圖 CStdString m_sFocusedImage; - 獲取焦點狀態圖 CStdString m_sDisabledImage; - 不可用狀態圖 DWORD m_dwEditbkColor; - 獲取設置編輯框背景色 28 class CEditWnd CEditWnd(); - 構造函數 void Init(CEditUI* pOwner); 初始化 RECT CalPos(); 計算位置 LPCTSTR GetWindowClassName() const; 得到窗口類名 LPCTSTR GetSuperClassName() const; 得到超類化名 void OnFinalMessage(HWND hWnd); 窗口被摧毀后,最后消息處理 LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); 處理消息 LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 失去焦點消息 LRESULT OnEditChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); 文本內容改變 CEditUI* m_pOwner; 編輯框窗口擁有者 HBRUSH m_hBkBrush; 背景畫刷 29 class CScrollBarUI public: CScrollBarUI(); LPCTSTR GetClass() const; - 返回控件名 LPVOID GetInterface(LPCTSTR pstrName); - 得到對象指針 CContainerUI* GetOwner() const; - 得到滾動條擁有者 void SetOwner(CContainerUI* pOwner); 設置滾動條擁有者 void SetEnabled(bool bEnable = true); 設置滾動條是否可用 void SetFocus(); 設置焦點如if (NULL!=m_pOwner)m_pOwner->SetFocus();else CControlUI::SetFocus() bool IsHorizontal(); 獲取滾動條方向 void SetHorizontal(bool bHorizontal = true);設置滾動條橫豎方向 int GetScrollRange() const; 得到滾動條范圍 void SetScrollRange(int nRange); 設置滾動條范圍 int GetScrollPos() const; 得到滾動塊位置 void SetScrollPos(int nPos); 設置滾動塊位置 int GetLineSize() const; 得到步長大小 void SetLineSize(int nSize); 設置步長大小 獲取 設置 上或左位置的按鈕 顯示狀態 正常狀態圖 懸浮狀態圖 按下狀態圖 非可用狀態圖 bool GetShowButton1(); 獲取設置顯示上左按鈕 void SetShowButton1(bool bShow); LPCTSTR GetButton1NormalImage(); void SetButton1NormalImage(LPCTSTR pStrImage); LPCTSTR GetButton1HotImage(); void SetButton1HotImage(LPCTSTR pStrImage); LPCTSTR GetButton1PushedImage(); void SetButton1PushedImage(LPCTSTR pStrImage); LPCTSTR GetButton1DisabledImage(); void SetButton1DisabledImage(LPCTSTR pStrImage); 獲取 設置 下或右位置的按鈕 顯示狀態 正常狀態圖 懸浮狀態圖 按下狀態圖 非可用狀態圖 bool GetShowButton1(); 獲取設置顯示上左按鈕 bool GetShowButton2(); void SetShowButton2(bool bShow); LPCTSTR GetButton2NormalImage(); void SetButton2NormalImage(LPCTSTR pStrImage); LPCTSTR GetButton2HotImage(); void SetButton2HotImage(LPCTSTR pStrImage); LPCTSTR GetButton2PushedImage(); void SetButton2PushedImage(LPCTSTR pStrImage); LPCTSTR GetButton2DisabledImage(); void SetButton2DisabledImage(LPCTSTR pStrImage); 獲取 設置 滾動塊 正常狀態圖 懸浮狀態圖 按下狀態圖 非可用狀態圖 LPCTSTR GetThumbNormalImage(); void SetThumbNormalImage(LPCTSTR pStrImage); LPCTSTR GetThumbHotImage(); void SetThumbHotImage(LPCTSTR pStrImage); LPCTSTR GetThumbPushedImage(); void SetThumbPushedImage(LPCTSTR pStrImage); LPCTSTR GetThumbDisabledImage(); void SetThumbDisabledImage(LPCTSTR pStrImage); 獲取設置 滾動軌跡 正常狀態圖 懸浮狀態圖 按下狀態圖 非可用狀態圖 LPCTSTR GetRailNormalImage(); void SetRailNormalImage(LPCTSTR pStrImage); LPCTSTR GetRailHotImage(); void SetRailHotImage(LPCTSTR pStrImage); LPCTSTR GetRailPushedImage(); void SetRailPushedImage(LPCTSTR pStrImage); LPCTSTR GetRailDisabledImage(); void SetRailDisabledImage(LPCTSTR pStrImage); 獲取設置 滾動條 背景圖 懸浮狀態圖 按下狀態圖 非可用狀態圖 LPCTSTR GetBkNormalImage(); void SetBkNormalImage(LPCTSTR pStrImage); LPCTSTR GetBkHotImage(); void SetBkHotImage(LPCTSTR pStrImage); LPCTSTR GetBkPushedImage(); void SetBkPushedImage(LPCTSTR pStrImage); LPCTSTR GetBkDisabledImage(); void SetBkDisabledImage(LPCTSTR pStrImage); void SetPos(RECT rc); 設置滾動條 void DoEvent(TEventUI& event); 事件處理 void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); 設置屬性 void DoPaint(HDC hDC, const RECT& rcPaint); 繪制 void PaintBk(HDC hDC); 繪制背景 void PaintButton1(HDC hDC); 繪制上或左向的按鈕 void PaintButton2(HDC hDC);繪制下或右位置的按鈕 void PaintThumb(HDC hDC); 繪制滾動塊 void PaintRail(HDC hDC);繪制滾動軌跡 protected: enum { DEFAULT_SCROLLBAR_SIZE = 16, 滾動條默認大小 DEFAULT_TIMERID = 10, 默認計時器id }; bool m_bHorizontal; 滾動條橫縱方向 int m_nRange; 范圍 int m_nScrollPos; 滾動塊位置 int m_nLineSize; 步長 CContainerUI* m_pOwner; 滾動條擁有者 POINT ptLastMouse; 鼠標位置 int m_nLastScrollPos; 滾動塊位置 int m_nLastScrollOffset; 滾動塊偏移量 未使用 int m_nScrollRepeatDelay; 未使用 CStdString m_sBkNormalImage; CStdString m_sBkHotImage; CStdString m_sBkPushedImage; CStdString m_sBkDisabledImage; bool m_bShowButton1; RECT m_rcButton1; UINT m_uButton1State; CStdString m_sButton1NormalImage; CStdString m_sButton1HotImage; CStdString m_sButton1PushedImage; CStdString m_sButton1DisabledImage; bool m_bShowButton2; RECT m_rcButton2; UINT m_uButton2State; CStdString m_sButton2NormalImage; CStdString m_sButton2HotImage; CStdString m_sButton2PushedImage; CStdString m_sButton2DisabledImage; RECT m_rcThumb; UINT m_uThumbState; CStdString m_sThumbNormalImage; CStdString m_sThumbHotImage; CStdString m_sThumbPushedImage; CStdString m_sThumbDisabledImage; CStdString m_sRailNormalImage; CStdString m_sRailHotImage; CStdString m_sRailPushedImage; CStdString m_sRailDisabledImage; CStdString m_sImageModify; 30 class IContainer 容器虛基類 + GetItemAt() - [v]得到容器中控件項 + GetItemIndex() - [v]按序號獲取容器中控件項 + SetItemIndex() - [v]設置控件項為容器中存在的指定序號的控件項 + GetCount() - [v]獲取容器控件項數 + Add() - [v]增加一個控件到容器中 + AddAt() - [v]插入一個控件到容器中 + Remove() - [v]刪除容器中控件項 + RemoveAt() - [v]刪除指定序號的容器控件項 + RemoveAll() - [v]刪除所有容器中的控件 31 class CContainerUI 容器控件 * CContainerUI() - 構造函數 * ~CContainerUI() - 析構函數 * GetInterface() - 得到控件指針 * GetClass() - 得到控件類名 * + GetItemAt() - 得到容器中控件項 + GetItemIndex() - 按序號獲取容器中控件項 + SetItemIndex() - 設置控件項為容器中存在的指定序號的控件項 + GetCount() - 獲取容器控件項數 + Add() - 增加一個控件到容器中 + AddAt() - 插入一個控件到容器中 + Remove() - 刪除容器中控件項 + RemoveAt() - 刪除指定序號的容器控件項 * DoEvent() - 事件處理 * SetVisible() - 設置容器是否可見 * SetInternVisible() // 僅供內部調用,有些UI擁有窗口句柄,需要重寫此函數 * SetMouseEnabled() - 設置是否處理鼠標事件 - 獲取/設置內邊距,相當於設置客戶區 * GetInset() - * SetInset() - - 獲取/設置容器內控件項是否自動摧毀 * IsAutoDestroy() * SetAutoDestroy() - 獲取/設置容器本身是否延遲摧毀 * IsDelayedDestroy() * SetDelayedDestroy() - ?獲取/設置容器中控件是否響應鼠標事件 * IsMouseChildEnabled() * SetMouseChildEnabled() * FindSelectable() - 查找容器中下一個可選項 * SetPos() - 設置位置 * DoPaint() - 繪制 * SetAttribute() - 設置屬性 * SetManager() - 設置界面管理者 * GetScrollPos() - 獲取滾動塊位置 * GetScrollRange() - 獲取滾動條范圍 * LineUp() - 向上一行(一行為默認字體高度) * LineDown() - 向下一行 * PageUp() - 向上一頁(?) * PageDown() - 向下一頁(?) * HomeUp() - 最上 * EndDown() - 最下 * LineLeft() - 向左一行(8個像素) * LineRight() - 向右一行(8個像素) * PageLeft() - 向左一頁 * PageRight() - 向右一頁 * HomeLeft() - 最左 * EndRight() - 最右 * EnableScrollBar() - 滾動條可用 * GetVerticalScrollBar() - 得到縱向滾動條 * GetHorizontalScrollBar() - 得到橫向滾動條 * SetFloatPos() - 設置懸浮位置 * ProcessScrollBar() 處理滾動條 * m_items 容器中的空間項 * m_rcInset 設置內邊距 客戶區 * m_iChildPadding 控件項間距 * m_bAtuoDestroy - 自動摧毀子控件 * m_bMouseChildEnabled - 鼠標可用 * m_bScrollProcess - 是否處理滾動 * m_pVerticalScrollBar - 是否使用橫滾動條 * m_pHorizontalScrollBar - 是否使用縱滾動條 32 class CVerticalLayoutUI 縱向布局的容器控件 + CVerticalLayoutUI() * GetInterface() - 得到控件指針 * GetClass() - 得到控件類名 * GetControlFlags() - 得到控件的類型標志 - 分割欄高度 + SetSepHeight() + GetSepHeight() + SetSepImmMode() 設置刷新模式 立即刷新或延時刷新 + IsSepImmMode() 獲取刷新模式 + SetAttribute() - 設置屬性 + DoEvent() 處理事件 + SetPos() 設置位置 + DoPostPaint() 繪制 + GetThumbRect() 獲取欲刷新的區域 x m_iSepHeight 分隔欄高度 x m_uButtonState 容器控件狀態 x ptLastMouse 鼠標位置 x m_rcNewPos 刷新區域 x m_bImmMode 立即刷新模式 33 class CHorizontalLayoutUI 橫向布局的容器控件 + CHorizontalLayoutUI() - 構造 * GetInterface() - 得到控件指針 * GetClass() - 得到控件類名 * GetControlFlags() - 得到控件的類型標志 -獲取 設置分隔欄寬度 + SetSepWidth() + GetSepWidth() - 獲取 設置刷新模式 + SetSepImmMode() + IsSepImmMode() + SetAttribute() - 設置屬性 + DoEvent() - 處理事件 + SetPos() - 設置容器位置及容器中控件項位置 + DoPostPaint() - 延遲繪制 + GetThumbRect() - 獲取刷新區域 x m_iSepWidth - 分隔欄寬度 x m_uButtonState - 控件狀態 x ptLastMouse - 鼠標位置 x m_rcNewPos - 設置位置 x m_bImmMode - 立即刷新模式 34 class CTileLayoutUI - 平鋪布局 + CTileLayoutUI() - 構造 * GetClass() - 得到控件類名 * GetControlFlags() - 得到控件的類型標志 + SetPos() - 設置容器及其容器內控件項位置 - + 獲取 設置 布局列數 + GetColumns() + SetColumns() + SetAttribute() - 設置屬性 x m_nColumns - 布局列數 35 class CDialogLayoutUI 對話框容器控件 + CDialogLayoutUI() 構造 * GetInterface() - 得到控件指針 * GetClass() - 得到控件類名 + SetStretchMode() 拉伸模式 + SetPos() 設置容器及其容器內控件項位置 + EstimateSize() 預估大小 + RecalcArea() 重新計算區域 x STRETCHMODE 拉伸模式結構 x m_aModes 拉伸模式列表 36 class CTabLayoutUI 標簽頁容器 + CTabLayoutUI() 構造 * GetInterface() - 得到控件指針 * GetClass() - 得到控件類名 bool Add(CControlUI* pControl); 向容器中添加控件,如果不是選中項則設置為非可見 bool AddAt(CControlUI* pControl, int iIndex); 將控件添加到容器控件列表的指定位置,不為選中項為非可見 bool Remove(CControlUI* pControl); 移除控件 void RemoveAll(); 移除所有控件 int GetCurSel() const; 得到當前選中的控件項(可見控件) bool SelectItem(int iIndex); 設置控件項為選中項(設置為可見控件) void SetPos(RECT rc); 設置容器及其控件位置 void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); 設置屬性 m_iCurSel - 當前選中控件(可見) =======================update 20110731am============= 37 CSafeRelease 安全釋放對象t CSafeRelease(T* p) : m_p(p) { }; 構造 ~CSafeRelease() { if( m_p != NULL ) m_p->Release(); }; 析構 T* Detach() { T* t = m_p; m_p = NULL; return t; }; 分離 T* m_p; 對象指針 38 CActiveXUI CActiveXUI(); 構造 virtual ~CActiveXUI(); 析構 LPCTSTR GetClass() const; 得到控件類名 LPVOID GetInterface(LPCTSTR pstrName); 得到控件指針 HWND GetHostWindow() const; 得到宿主窗口句柄 //設置獲取延時創建activeX控件 bool IsDelayCreate() const; void SetDelayCreate(bool bDelayCreate = true); bool CreateControl(const CLSID clsid); 按clsid創建控件 bool CreateControl(LPCTSTR pstrCLSID); 按activeX名創建控件 HRESULT GetControl(const IID iid, LPVOID* ppRet); 獲取控件接口 CLSID GetClisd() const;得到ActiveX控件id CStdString GetModuleName() const; 得到控件名稱 void SetModuleName(LPCTSTR pstrText); 設置控件名稱 void SetVisible(bool bVisible = true); 設置是否可見 void SetInternVisible(bool bVisible = true); void SetPos(RECT rc); 設置控件位置 void DoPaint(HDC hDC, const RECT& rcPaint); 繪制CActiveXCtrl::IViewObject::Draw() void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);設置控件屬性 LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, bool& bHandled);消息處理 protected: void ReleaseControl(); //釋放控件 設置宿主窗口句柄為空 得到IObjectWithSite接口對象 IObjectWithSite::SetSite(NULL) IObjectWithSite::Release() IOleObject::Close(OLECLOSE_NOSAVE) IOleObject::SetClientSite(NULL) IOleObject::Release() CActiveCtrl::Release() bool DoCreateControl(); //創建控件 //釋放控件 //獲取IOleControl 通過模塊名調用DllGetClassObject()獲取IClassFactory創建IOleControl //通過IOleControl枚舉出IOleObject[m_pUnk] 新建CActiveXCtrl IOleObject獲取ActiveX控件狀態 CActiveXCtrl枚舉出IOleClientSite[] IOleObject::SetClientSite(IOleClientSite) IOleObject枚舉出IPersistStreamInit IPersistStreamInit::InitNew() IPersistStreamInit::Release() 獲取IViewObject 獲取顯示對象 IOleObject::DoVerb() //完成激活控件 protected: CLSID m_clsid; ActiveX的ID CStdString m_sModuleName;ActiveX的模塊名 bool m_bCreated; 是否被創建 bool m_bDelayCreate; 是否延時創建 IOleObject* m_pUnk; 提供嵌入對象與其容器之間的聯系 CActiveXCtrl* m_pControl; ActiveX容器控件 HWND m_hwndHost;宿主窗口句柄 39 CActiveXWnd public: HWND Init(CActiveXCtrl* pOwner, HWND hWndParent); LPCTSTR GetWindowClassName() const; void OnFinalMessage(HWND hWnd); LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam); protected: void DoVerb(LONG iVerb); LRESULT OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnKillFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); protected: CActiveXCtrl* m_pOwner; 40 CActiveXEnum CActiveXEnum(IUnknown* pUnk) : m_pUnk(pUnk), m_dwRef(1), m_iPos(0) { m_pUnk->AddRef(); } ~CActiveXEnum() { m_pUnk->Release(); } LONG m_iPos; ULONG m_dwRef; IUnknown* m_pUnk; STDMETHOD_(ULONG,AddRef)() { return ++m_dwRef; } STDMETHOD_(ULONG,Release)() { LONG lRef = --m_dwRef; if( lRef == 0 ) delete this; return lRef; } STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject) { *ppvObject = NULL; if( riid == IID_IUnknown ) *ppvObject = static_cast<IEnumUnknown*>(this); else if( riid == IID_IEnumUnknown ) *ppvObject = static_cast<IEnumUnknown*>(this); if( *ppvObject != NULL ) AddRef(); return *ppvObject == NULL ? E_NOINTERFACE : S_OK; } STDMETHOD(Next)(ULONG celt, IUnknown **rgelt, ULONG *pceltFetched) { if( pceltFetched != NULL ) *pceltFetched = 0; if( ++m_iPos > 1 ) return S_FALSE; *rgelt = m_pUnk; (*rgelt)->AddRef(); if( pceltFetched != NULL ) *pceltFetched = 1; return S_OK; } STDMETHOD(Skip)(ULONG celt) { m_iPos += celt; return S_OK; } STDMETHOD(Reset)(void) { m_iPos = 0; return S_OK; } STDMETHOD(Clone)(IEnumUnknown **ppenum) { return E_NOTIMPL; } 41 CActiveXFrameWnd public: CActiveXFrameWnd(CActiveXUI* pOwner) : m_dwRef(1), m_pOwner(pOwner), m_pActiveObject(NULL) { } ~CActiveXFrameWnd() { if( m_pActiveObject != NULL ) m_pActiveObject->Release(); } ULONG m_dwRef; CActiveXUI* m_pOwner; IOleInPlaceActiveObject* m_pActiveObject; // IUnknown STDMETHOD_(ULONG,AddRef)() { return ++m_dwRef; } STDMETHOD_(ULONG,Release)() { ULONG lRef = --m_dwRef; if( lRef == 0 ) delete this; return lRef; } STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject) { *ppvObject = NULL; if( riid == IID_IUnknown ) *ppvObject = static_cast<IOleInPlaceFrame*>(this); else if( riid == IID_IOleWindow ) *ppvObject = static_cast<IOleWindow*>(this); else if( riid == IID_IOleInPlaceFrame ) *ppvObject = static_cast<IOleInPlaceFrame*>(this); else if( riid == IID_IOleInPlaceUIWindow ) *ppvObject = static_cast<IOleInPlaceUIWindow*>(this); if( *ppvObject != NULL ) AddRef(); return *ppvObject == NULL ? E_NOINTERFACE : S_OK; } // IOleInPlaceFrameWindow STDMETHOD(InsertMenus)(HMENU /*hmenuShared*/, LPOLEMENUGROUPWIDTHS /*lpMenuWidths*/) { return S_OK; } STDMETHOD(SetMenu)(HMENU /*hmenuShared*/, HOLEMENU /*holemenu*/, HWND /*hwndActiveObject*/) { return S_OK; } STDMETHOD(RemoveMenus)(HMENU /*hmenuShared*/) { return S_OK; } STDMETHOD(SetStatusText)(LPCOLESTR /*pszStatusText*/) { return S_OK; } STDMETHOD(EnableModeless)(BOOL /*fEnable*/) { return S_OK; } STDMETHOD(TranslateAccelerator)(LPMSG /*lpMsg*/, WORD /*wID*/) { return S_FALSE; } // IOleWindow STDMETHOD(GetWindow)(HWND* phwnd) { if( m_pOwner == NULL ) return E_UNEXPECTED; *phwnd = m_pOwner->GetManager()->GetPaintWindow(); return S_OK; } STDMETHOD(ContextSensitiveHelp)(BOOL /*fEnterMode*/) { return S_OK; } // IOleInPlaceUIWindow STDMETHOD(GetBorder)(LPRECT /*lprectBorder*/) { return S_OK; } STDMETHOD(RequestBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/) { return INPLACE_E_NOTOOLSPACE; } STDMETHOD(SetBorderSpace)(LPCBORDERWIDTHS /*pborderwidths*/) { return S_OK; } STDMETHOD(SetActiveObject)(IOleInPlaceActiveObject* pActiveObject, LPCOLESTR /*pszObjName*/) { if( pActiveObject != NULL ) pActiveObject->AddRef(); if( m_pActiveObject != NULL ) m_pActiveObject->Release(); m_pActiveObject = pActiveObject; return S_OK; } 42 CActiveXCtrl public: CActiveXCtrl(); ~CActiveXCtrl(); // IUnknown STDMETHOD_(ULONG,AddRef)(); STDMETHOD_(ULONG,Release)(); STDMETHOD(QueryInterface)(REFIID riid, LPVOID *ppvObject); // IObjectWithSite STDMETHOD(SetSite)(IUnknown *pUnkSite); STDMETHOD(GetSite)(REFIID riid, LPVOID* ppvSite); // IOleClientSite STDMETHOD(SaveObject)(void); STDMETHOD(GetMoniker)(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker** ppmk); STDMETHOD(GetContainer)(IOleContainer** ppContainer); STDMETHOD(ShowObject)(void); STDMETHOD(OnShowWindow)(BOOL fShow); STDMETHOD(RequestNewObjectLayout)(void); // IOleInPlaceSiteWindowless STDMETHOD(CanWindowlessActivate)(void); STDMETHOD(GetCapture)(void); STDMETHOD(SetCapture)(BOOL fCapture); STDMETHOD(GetFocus)(void); STDMETHOD(SetFocus)(BOOL fFocus); STDMETHOD(GetDC)(LPCRECT pRect, DWORD grfFlags, HDC* phDC); STDMETHOD(ReleaseDC)(HDC hDC); STDMETHOD(InvalidateRect)(LPCRECT pRect, BOOL fErase); STDMETHOD(InvalidateRgn)(HRGN hRGN, BOOL fErase); STDMETHOD(ScrollRect)(INT dx, INT dy, LPCRECT pRectScroll, LPCRECT pRectClip); STDMETHOD(AdjustRect)(LPRECT prc); STDMETHOD(OnDefWindowMessage)(UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult); // IOleInPlaceSiteEx STDMETHOD(OnInPlaceActivateEx)(BOOL *pfNoRedraw, DWORD dwFlags); STDMETHOD(OnInPlaceDeactivateEx)(BOOL fNoRedraw); STDMETHOD(RequestUIActivate)(void); // IOleInPlaceSite STDMETHOD(CanInPlaceActivate)(void); STDMETHOD(OnInPlaceActivate)(void); STDMETHOD(OnUIActivate)(void); STDMETHOD(GetWindowContext)(IOleInPlaceFrame** ppFrame, IOleInPlaceUIWindow** ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo); STDMETHOD(Scroll)(SIZE scrollExtant); STDMETHOD(OnUIDeactivate)(BOOL fUndoable); STDMETHOD(OnInPlaceDeactivate)(void); STDMETHOD(DiscardUndoState)( void); STDMETHOD(DeactivateAndUndo)( void); STDMETHOD(OnPosRectChange)(LPCRECT lprcPosRect); // IOleWindow STDMETHOD(GetWindow)(HWND* phwnd); STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode); // IOleControlSite STDMETHOD(OnControlInfoChanged)(void); STDMETHOD(LockInPlaceActive)(BOOL fLock); STDMETHOD(GetExtendedControl)(IDispatch** ppDisp); STDMETHOD(TransformCoords)(POINTL* pPtlHimetric, POINTF* pPtfContainer, DWORD dwFlags); STDMETHOD(TranslateAccelerator)(MSG* pMsg, DWORD grfModifiers); STDMETHOD(OnFocus)(BOOL fGotFocus); STDMETHOD(ShowPropertyFrame)(void); // IOleContainer STDMETHOD(EnumObjects)(DWORD grfFlags, IEnumUnknown** ppenum); STDMETHOD(LockContainer)(BOOL fLock); // IParseDisplayName STDMETHOD(ParseDisplayName)(IBindCtx* pbc, LPOLESTR pszDisplayName, ULONG* pchEaten, IMoniker** ppmkOut); protected: HRESULT CreateActiveXWnd(); protected: LONG m_dwRef; CActiveXUI* m_pOwner; CActiveXWnd* m_pWindow; IUnknown* m_pUnkSite; IViewObject* m_pViewObject; IOleInPlaceObjectWindowless* m_pInPlaceObject; bool m_bLocked; bool m_bFocused; bool m_bCaptured; bool m_bUIActivated; bool m_bInPlaceActive; bool m_bWindowless; 43 CComboWnd -CCombo控件下拉窗體 public: void Init(CComboUI* pOwner);初始化Combo窗口 1 計算窗口創建位置 2 創建窗口 LPCTSTR GetWindowClassName() const; void OnFinalMessage(HWND hWnd); 窗口被銷毀時,最后消息處理函數 LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);消息處理 WM_CREATE:創建一個縱向排列容器控件,把項加入容器中 WM_CLOSE:CComboUI::SetManager() CComboUI::SetPos9) CComboUI::SetFocus() WM_LBUTTONUP:查找當鼠標位置,如果當前位置有控件並不是滾動條控件則向自身發送失去焦點消息 WM_KEYDOWN:空格鍵 恢復原來選項 回車鍵向自身發送失去焦點消息其他鍵交由CComboUI::DoEvent()處理 WM_MOUSEWHEEL:由CComboUI::DoEvent WM_KILLFOCUS:向自身發送WM_CLOSE void EnsureVisible(int iIndex); 1 計算位置 2 Scroll void Scroll(int dx, int dy); 設置縱向滾動條位置 public: CPaintManagerUI m_pm; 繪制管理者 CComboUI* m_pOwner; ComboUI控件 CVerticalLayoutUI* m_pLayout; 縱向容器 int m_iOldSel; 上一次選中項 44 CComboUI - Combo控件 CComboUI(); //構造 LPCTSTR GetClass() const; LPVOID GetInterface(LPCTSTR pstrName); void DoInit();初始化 如果選中項序號為-1設置第0項為選中項 UINT GetControlFlags() const; 返回tab切換停留屬性 CStdString GetText() const; 得到文本 void SetEnabled(bool bEnable = true); 設置可用 CStdString GetDropBoxAttributeList(); 獲取下拉框屬性列表字符串 void SetDropBoxAttributeList(LPCTSTR pstrList); 設置下拉框屬性列表字符串 SIZE GetDropBoxSize() const;得到下拉框大小 void SetDropBoxSize(SIZE szDropBox);設置下拉框大小 int GetCurSel() const; 獲取當前選中項 bool SelectItem(int iIndex); 設置當前選中項 bool SetItemIndex(CControlUI* pControl, int iIndex); 按項的控件指針獲取項序號 bool Add(CControlUI* pControl); 加入一項 bool AddAt(CControlUI* pControl, int iIndex); 加入一項到列表指定位置 bool Remove(CControlUI* pControl); 按項控件的指針移除一項 bool RemoveAt(int iIndex); 移除指定序號的一項 void RemoveAll(); 移除所有項 bool Activate(); 設置控件活躍 如果處於非活躍狀態,且下拉窗口未創建,則創建下拉窗口 RECT GetTextPadding() const; 獲取文本與控件邊緣的間距 void SetTextPadding(RECT rc); 設置文本與控件邊緣的間距 LPCTSTR GetNormalImage() const; 獲取正常狀態圖 void SetNormalImage(LPCTSTR pStrImage); 設置正常狀態圖 LPCTSTR GetHotImage() const; 獲取活躍狀態圖 void SetHotImage(LPCTSTR pStrImage);設置活躍狀態圖 LPCTSTR GetPushedImage() const; 獲取按下狀態圖 void SetPushedImage(LPCTSTR pStrImage); 設置按下狀態圖 LPCTSTR GetFocusedImage() const; 獲取焦點狀態圖 void SetFocusedImage(LPCTSTR pStrImage);設置焦點狀態圖 LPCTSTR GetDisabledImage() const; 非可用狀態圖 void SetDisabledImage(LPCTSTR pStrImage); 設置非可用狀態圖 TListInfoUI* GetListInfo(); 獲取列表信息 void SetItemFont(int index); 設置項字體 void SetItemTextStyle(UINT uStyle); 設置項字體大小 RECT GetItemTextPadding() const 得到項文本間距 void SetItemTextPadding(RECT rc);設置項文本間距 DWORD GetItemTextColor() const; 設置項文本色 void SetItemTextColor(DWORD dwTextColor);得到項目文本色 DWORD GetItemBkColor() const; 獲取項背景色 void SetItemBkColor(DWORD dwBkColor);設置項背景色 LPCTSTR GetItemImage() const; 獲取項圖 void SetItemImage(LPCTSTR pStrImage); 設置項圖 DWORD GetSelectedItemTextColor() const;選中狀態項文本色 void SetSelectedItemTextColor(DWORD dwTextColor);設置選中狀態文本色 DWORD GetSelectedItemBkColor() const;得到選中項背景色 void SetSelectedItemBkColor(DWORD dwBkColor);設置項選中狀態背景圖 LPCTSTR GetSelectedItemImage() const;獲取選中項背景圖 void SetSelectedItemImage(LPCTSTR pStrImage);設置項選中狀態背景圖 DWORD GetHotItemTextColor() const;獲取項活躍狀態文本色 void SetHotItemTextColor(DWORD dwTextColor);設置項活躍狀態文本色 DWORD GetHotItemBkColor() const;獲取項活躍狀態背景色 void SetHotItemBkColor(DWORD dwBkColor);設置項活躍狀態背景色 LPCTSTR GetHotItemImage() const;后去項活躍狀態圖 void SetHotItemImage(LPCTSTR pStrImage);設置項活躍狀態圖 DWORD GetDisabledItemTextColor() const;得到項非可用狀態文本色 void SetDisabledItemTextColor(DWORD dwTextColor);設置非可用項文本色 DWORD GetDisabledItemBkColor() const;獲取項非可用狀態背景色 void SetDisabledItemBkColor(DWORD dwBkColor);設置項非可用狀態背景色 LPCTSTR GetDisabledItemImage() const; 設置項非可用狀態圖 void SetDisabledItemImage(LPCTSTR pStrImage);獲取項非可用狀態圖 DWORD GetItemLineColor() const;獲取項邊框色 void SetItemLineColor(DWORD dwLineColor);設置項邊框色 bool IsItemShowHtml(); 項是否使用內嵌html標識語言 void SetItemShowHtml(bool bShowHtml = true);設置項是否使用內嵌html標識語言 SIZE EstimateSize(SIZE szAvailable);計算控件大小 void SetPos(RECT rc);設置控件位置 void DoEvent(TEventUI& event);事件處理 void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);設置屬性 void DoPaint(HDC hDC, const RECT& rcPaint);繪制 void PaintText(HDC hDC);繪制文本 void PaintStatusImage(HDC hDC);繪制狀態圖 protected: CComboWnd* m_pWindow; 下拉框窗口 int m_iCurSel; 當前選中項 RECT m_rcTextPadding; 文本與控件邊緣間距 CStdString m_sDropBoxAttributes; 下拉框屬性 SIZE m_szDropBox; 下拉框窗體大小 UINT m_uButtonState; 控件狀態 CStdString m_sNormalImage; 正常狀態圖 CStdString m_sHotImage; 活躍狀態圖 CStdString m_sPushedImage; 按下狀態圖 CStdString m_sFocusedImage; 獲得焦點狀態圖 CStdString m_sDisabledImage; 非可用狀態圖 TListInfoUI m_ListInfo; 下拉框項的列表