DuiLib各種API


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; 下拉框項的列表

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM