duilib之源碼分析

《duilib之源碼分析》
1 stdAfx.h
* lengthof(x) 計算數組長度宏
* MAX  兩值最大
* MIN  兩值最小
* CLAMP(x,a,b) x在a,b之間則取x否則取最小
2 UIBase
* UI_WNDSTYLE_ 窗口風格屬性
* UI_CLASSSTYLE_ 窗口類屬性
* TRACE(LPCTSTR pstrFormat, ...)
   功能 - 調試信息
   參考 - 參考printf
* TRACEMSG(UINT uMsg)
   功能 - 將windows消息轉化成其對應的宏名
   uMsg - Windows消息ID
   返回值 - 宏名(字符串)
* class STRINGorID
   功能 - 統一資源ID, 字符串類型和整型統一輸出爲字符串類型
* class CPoint
   描述 - 點
   函數 -
     CPoint(LPARAM lParam) //將消息中lParam轉化成點
* class CSize
   描述 - 矩形的寬和高
* class CRect
   描述 - 矩形區域
   函數 -
     void Empty() //設置left,right,top,bottom爲零
     void Join(const RECT& rc) //合併兩個矩形產生一個包含兩個矩形的新的矩形
     void ResetOffset() //將矩形移動到left=0,top=0的位置
     void Normalize() //調整left,right,top,bottom使之left < right top < bottom
     void Offset(int cx, int cy) //移動矩形, cx 橫向移動距離, cy 縱向移動距離
     void Inflate(int cx, int cy) //放大矩形, cx左右各放大的大小, cy 上下各放大的大小
     void Deflate(int cx, int cy) //縮小矩形, cx左右各縮小的大小, cy上下各縮小的大小
     void Union(CRect& rc) //合併矩形, 與Join()函數功能幾乎一致, 但對空矩形處理不同
* class CStdPtrArray
   變量 -
     m_nAllocated //已申請空間大小(可儲存Ptr的數量), 如果空間不足則去realloc m_nAllocated*2的空間
* class CStdString 
   實現 - 如果長度小於MAX_LOCAL_STRING_LEN(63)則在棧上分配, 否則在堆上分配
   函數 -
     void Assign(LPCTSTR pstr, int nLength = -1) //分配
* class CStdStringMap 
   描述 - 字符串map
   實現 - 使用times33哈希算法
* class CWindowWnd
   函數 -
     RegisterWindowClass() //RegisterClass的封裝
     RegisterSuperclass() //超類化窗口
  Subclass() //子類化窗口
     ShowModal() //窗口模態化
     ?MessageBox() //?UIBase.cpp 爲utf8
     __WndProc() //消息處理函數
     __ControlProc() //超類化消息處理函數
  實現 - 
    duilib消息處理機制
    1 創建 - 通過CreateEx最後一個參數傳遞類指針this, 在消息處理函數中對WM_NCCREATE消息進行處理, 通過SetWindowLongPtr(GWLP_USERDATA)進行保存
    2 消息處理 - 在消息處理函數通過GetWindowLongPtr(GWLP_USERDATA)得到其類指針, 調用虛函數HandleMessage()相應其他消息。
   3 銷燬 - 消息處理函數中對WM_NCDESTROY消息進行處理, 調用原消息處理函數, 重置(GWLP_USERDATA), 調用虛函數OnFinalMessage()做最後處理。
============update 2011 06 07 =====================
3 the 3rd part stb_image
* 描述 - 載入各種圖片格式文件
* 函數 -
     stbi_load_from_memory()
   功能 - 加載圖片
   buffer - 內存數據
      len - 數據大小,
   x - [out]圖像寬度(像素)
      y - [out]圖像高度(像素)
   comp - [out]圖像數據組成結果
   req_comp - 圖像數據組成
     STBI_default = 0, // only used for req_comp
  STBI_grey       = 1,
  STBI_grey_alpha = 2,
  STBI_rgb        = 3,
  STBI_rgb_alpha  = 4

   [more than] stb_image.c line 100 - 130
     stbi_image_free()
   功能 - 釋放已加載的圖片數據
4 the 3rd part XUnzip
* 描述 - 解壓zip包
* 函數 - 
     OpenZip
   功能 - 打開一個zip包
   z - 內存地址, 文件名, 文件句柄
   len - 長度
      flag - 標識(ZIP_HANDLE=1, ZIP_FILENAME=2, ZIP_MEMORY=3)
   return - HZIP
  CloseZip
    功能 - 關閉一個zip包
      hz - HZIP
  GetZipItem
    功能 - 從zip包中獲取一項
    hz - HZIP
    index - 序號
    ze - zip入口點結構
  FindZipItem
    功能 - 在zip包中查找項
    hz - HZIP
    name - 項名
    ic - 大小寫敏感 CASE_INSENSITIVE=1, CASE_SENSITIVE=2
    index - [out]序號
    ze - zip入口點結構
  UnzipItem
    功能 - 解壓項
    hz - HZIP
    dst - [out]解壓後存儲位置
    len - 儲存長度
    flags - 標識(ZIP_HANDLE=1, ZIP_FILENAME=2, ZIP_MEMORY=3)
5 class CRenderClip
* 描述 - 區域引擎,設置在dc上繪製的區域,防止子控件繪製到父控件外側(float屬性控件除外)
* 實現 - 
* 函數 -
   GenerateClip() //產生一個剪切區域, hDC窗口句柄, rc區域, clip[out]剪切區
   GenerateRoundClip() //產生一個圓角剪切區域, hDC窗口句柄, rc區域, width 橫向圓角弧度, height縱向圓角弧度, clip[out]剪切區
   UseOldClipBegin(() //使用整個活躍區域作爲剪切區, hDC窗口句柄, clip剪切區
   UseOldClipEnd() //使用當前控件有效區域作爲剪切區, hDC窗口句柄, clip剪切區
============update 2011 06 15 =====================
6 class CRenderEngine
* 渲染引擎
* 函數 - 
   LoadImage()
     功能 - 加載圖像
     bitmap - 圖像
     type - 類型
     mask - 隱蔽色
     實現 -
       1 讀取文件,資源和zip包中圖像文件數據到內存[通過HIWORD(bitmap.m_lpstr)區別從資源中或文件中加載MAKEINTRESOURCE  The return value is the specified value in the low-order word and zero in the high-order word. (from msdn)]
       2 創建DIB
       3 通過stbi_load_from_memory加載數據文件並轉化後複製到DIB中
       4 返回TImageInfo結構
   DrawImage()
     功能 - 繪製圖像
     hDC - 設備句柄
     hBitmap - 位圖句柄
     rc - 對象區域
     rcPaint - 繪製區域
     rcBmpPart - 位圖區域
     rcConrners - 拉伸區域
     alphaChannel - alpha通道
     uFade - 透明度
     hole - 居中
     xtiled - 橫向平鋪
     ytiled - 縱向平鋪
     實現 - 
       1 CreateCompatibleDC (創建內存設備句柄)
       2 SelectObject() (將位圖選入內存設備句柄)
       3 AlphaBlend (alpha混合)
       4 BitBlt() or StretchBlt() (繪製到內存設備句柄)
       5 SelectObject() (將老的位圖選入內存設備句柄)
       6 DeleteDC (釋放內存設備句柄)
   DrawImageString()
     功能 - 按標識字符串繪製圖像
     hDC - 設備句柄
     pManager - 繪製管理者
     rc - 對象區域
     rcPaint - 繪製區域
     pStrImage - 標識字符串
     pStrModify - 標識字符串
     實現 - 
       1 分析標識字符串獲取屬性
       2 獲取圖像數據
       3 繪製圖像
  DrawColor()
    功能 - 繪製矩形
    hDC - 設備句柄
    rc - 對象區域
    color - 顏色(alpha, r, g, b)
    實現 - 
      如果不需要alpha混合則SetBkColor() ExtTextOut()
      否則 創建一個像素大小的32位DIB
  DrawGradient()
    功能 - 繪製漸變
    hDC - 設備句柄
    rc - 對象區域
    dwFirst - 顏色1
    dwSecond - 顏色2
    bVertical - 漸變方向 true垂直 false水平
    nSteps - 步長 [使用GradientFill() API時無效]
    實現 - 
      1 漸變填充
      2 alpha混合
  DrawLine() - 繪製直線 
  DrawRect() - 繪製矩形
  DrawRoundRect() - 繪製圓角矩形
  DrawText() - 繪製文字
  DrawHtmlText() 
    功能 - 繪製 "mini-html" 標識字符串
    hDC - 設備句柄
    pManager - 繪製管理者
    rc - 對象區域
    pstrText -  "mini-html" 標識字符串
    dwTextColor - 字符串類型
    pLinks - 產生鏈接效果的區域組
    sLinks - 產生鏈接效果的區域組數量
    nLinkRects - 產生鏈接效果的區域組數量
    uStyle - 類型,同DrawText() Format Flags
  GenerateBitmap()
    功能 - 產生一個BMP位圖
    pManager - 繪製管理者
    pControl - 控件句柄
    rc - 對象區域
    返回 - BMP句柄
===============update 2011-06-16
7 class INotifyUI - Listener interface
8 class IMessageFilterUI - MessageFilter interface
9 class CPaintManagerUI
* 繪製管理者
* 函數
   Init() - 初始化
   NeedUpdate() - 
   Invalidate() - InvalidateRect API的封裝
   
   GetPaintDC() - 設備句柄相關函數
   GetPaintWindow() - 得到窗口句柄
   GetTooltipWindow() - 得到提示窗口句柄
   GetMousePos() - 得到鼠標位置
   GetClientSize() - 得到客戶端區域大小
   獲取/設置 窗口初始化時大小
     GetInitSize()
     SetInitSize()
   獲取/設置 托腮大小
     GetSizeBox()
     SetSizeBox()
   獲取/設置 標題區域大小
     GetCaptionRect()
     SetCaptionRect()
   獲取/設置 圓角大小
     GetRoundCorner()
     SetRoundCorner()
   獲取/設置 大小的最小限制
     GetMinInfo()
     SetMinInfo()
   獲取/設置 大小的最大限制
     GetMaxInfo()
     SetMaxInfo()
   設置透明度
     SetTransparent()
   設置背景是否使用透明屬性 
     SetBackgroundTransparent()
   獲取/設置 刷新區域屬性
     IsShowUpdateRect()
     SetShowUpdateRect()
   獲取/設置 應用程序對象實例句柄
     GetInstance()
     SetInstance()
   獲取 可執行程序所在路徑
     GetInstancePath()
   獲取/設置 當前工作目錄
     GetCurrentPath()
     SetCurrentPath()
   獲取/設置 資源動態庫句柄
    GetResourceDll()
    SetResourceDll()
  獲取/設置 資源路徑
    GetResourcePath()
    SetResourcePath()
  獲取/設置 資源壓縮包文件名
    GetResourceZip()
    SetResourceZip()
  使用繪製管理者的根繪製管理者的資源設置 - 循環得到父繪製管理者直到找到最頂層的繪製管理者
    UseParentResource()
  得到繪製管理者
    GetParentResource()
  獲取/設置 非可用狀態文字顏色
    GetDefaultDisabledColor()
    SetDefaultDisabledColor()
  獲取/設置 默認字體顏色
    GetDefaultFontColor()
    SetDefaultFontColor()
  獲取/設置超鏈接默認字體顏色
    GetDefaultLinkFontColor()
    SetDefaultLinkFontColor()
  獲取/設置 鼠標漂浮在鏈接上時默認字體顏色
    GetDefaultLinkHoverFontColor()
    SetDefaultLinkHoverFontColor()
  獲取/設置 選中後背景顏色
    GetDefaultSelectedBkColor()
    SetDefaultSelectedBkColor()
  獲取/設置 默認字體
    GetDefaultFontInfo()
    SetDefaultFont()
  字體列表操作
    DWORD GetCustomFontCount() - 得到字體列表中項數量
    HFONT AddFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 加入一種字體到字體列表中
    HFONT AddFontAt(int index, LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 加入一種字體到字體列表的指定位置
    HFONT GetFont(int index) - 按序號得到字體列表中的字體
    HFONT GetFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 按字體屬性得到字體列表中的字體
    bool FindFont(HFONT hFont) - 按句柄查找字體列表中的一項
    bool FindFont(LPCTSTR pStrFontName, int nSize, bool bBold, bool bUnderline, bool bItalic) - 按屬性查找字體列表中的一項
    bool RemoveFont(HFONT hFont)  - 按句柄移除字體列表中的指定項
    bool RemoveFontAt(int index) - 按序號移除字體列表中的指定項 
    void RemoveAllFonts() - 移除字體列表中的所有項
    TFontInfo* GetFontInfo(int index) - 按序號得到字體列表中項的屬性
    TFontInfo* GetFontInfo(HFONT hFont) - 按句柄得到字體列表中項的屬性
  圖片列表操作
    const TImageInfo* GetImage(LPCTSTR bitmap);
    const TImageInfo* GetImageEx(LPCTSTR bitmap, LPCTSTR type = NULL, DWORD mask = 0);
    const TImageInfo* AddImage(LPCTSTR bitmap, LPCTSTR type = NULL, DWORD mask = 0);
    bool RemoveImage(LPCTSTR bitmap);
    void RemoveAllImages();
  默認屬性列表操作
    void AddDefaultAttributeList(LPCTSTR pStrControlName, LPCTSTR pStrControlAttrList);
    LPCTSTR GetDefaultAttributeList(LPCTSTR pStrControlName) const;
    bool RemoveDefaultAttributeList(LPCTSTR pStrControlName);
    const CStdStringPtrMap& GetDefaultAttribultes() const;
    void RemoveAllDefaultAttributeList();
  將控件樹附加到當前繪製管理者
    bool AttachDialog(CControlUI* pControl);
  初始化控件 把控件名稱加入到繪製管理者的控件名map中
    bool InitControls(CControlUI* pControl, CControlUI* pParent = NULL);
  重置控件
    void ReapObjects(CControlUI* pControl);
  選項組操作
    bool AddOptionGroup(LPCTSTR pStrGroupName, CControlUI* pControl); - 添加選項組
    CStdPtrArray* GetOptionGroup(LPCTSTR pStrGroupName); - 通過名稱得到選項組
    void RemoveOptionGroup(LPCTSTR pStrGroupName, CControlUI* pControl); - 移除選項組
    void RemoveAllOptionGroups(); - 移除所有選項組
  得到控件焦點
    CControlUI* GetFocus() const;
  控件獲得焦點
    void SetFocus(CControlUI* pControl);
  得到標籤頁控件
    bool SetNextTabControl(bool bForward = true);
  定時器操作
    bool SetTimer(CControlUI* pControl, UINT nTimerID, UINT uElapse); - 設置一個定時器
    bool KillTimer(CControlUI* pControl, UINT nTimerID); - 清除一個定時器
    void RemoveAllTimers(); - 清楚所有定時器
  捕獲鼠標
    void SetCapture();
  釋放捕獲鼠標
    void ReleaseCapture();
  鼠標是否被捕獲
    bool IsCaptured();

    bool AddNotifier(INotifyUI* pControl); - 加入一個Listener
    bool RemoveNotifier(INotifyUI* pControl);   - 移除一個Listener
    void SendNotify(TNotifyUI& Msg); - 發送一個Notify消息
    void SendNotify(CControlUI* pControl, LPCTSTR pstrMessage, WPARAM wParam = 0, LPARAM lParam = 0); - 發送一個Notify消息

    bool AddPreMessageFilter(IMessageFilterUI* pFilter); - 加入一個預處理Message Filter
    bool RemovePreMessageFilter(IMessageFilterUI* pFilter); - 移除一個預處理Message Filter

    bool AddMessageFilter(IMessageFilterUI* pFilter); - 加入一個Message Filter
    bool RemoveMessageFilter(IMessageFilterUI* pFilter); - 移除一個Message Filter

  PostPaint控件操作
    int GetPostPaintCount() const; - 得到PostPaint控件數量
    bool AddPostPaint(CControlUI* pControl); - 加入PostPaint控件
    bool RemovePostPaint(CControlUI* pControl); - 移除一個PostPaint控件
    bool SetPostPaintIndex(CControlUI* pControl, int iIndex); - 設置控件到指定的序列位置

  加入控件到延遲處理列表當中
    void AddDelayedCleanup(CControlUI* pControl);
  得到根控件
    CControlUI* GetRoot() const;
  按照位置找到控件
    CControlUI* FindControl(POINT pt) const;
  按父窗口和位置查找控件
    CControlUI* FindControl(CControlUI* pParent, POINT pt) const;
  按名字查找控件
    CControlUI* FindControl(LPCTSTR pstrName);
  按父窗口和名字查找控件
    CControlUI* FindControl(CControlUI* pParent, LPCTSTR pstrName);
  消息循環
    static void MessageLoop();
  消息處理
    static bool TranslateMessage(const LPMSG pMsg);
  消息處理
    bool MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes);
  消息預處理
    bool PreMessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes);

  回調函數 - 比較屬性(pData)與控件(pThis)的屬性是否相同
    static CControlUI* CALLBACK __FindControlFromNameHash(CControlUI* pThis, LPVOID pData); - 按名稱查找控件的回調函數
    static CControlUI* CALLBACK __FindControlFromCount(CControlUI* pThis, LPVOID pData); - 計算控件數目的回調函數
    static CControlUI* CALLBACK __FindControlFromPoint(CControlUI* pThis, LPVOID pData); - 按位置查找控件的回調函數
    static CControlUI* CALLBACK __FindControlFromTab(CControlUI* pThis, LPVOID pData); - 查找下一個相應tab的控件
    static CControlUI* CALLBACK __FindControlFromShortcut(CControlUI* pThis, LPVOID pData); - 快捷方式對應的控件
    static CControlUI* CALLBACK __FindControlFromUpdate(CControlUI* pThis, LPVOID pData); - 查找需要刷新的控件
    static CControlUI* CALLBACK __FindControlFromNameByParent(CControlUI* pThis, LPVOID pData); - 查找子控件

    HWND m_hWndPaint;    //繪製窗口句柄
    HDC m_hDcPaint;        //繪製DC
    HDC m_hDcOffscreen; //屏幕兼容DC
    HDC m_hDcBackground;    //背景DC
    HBITMAP m_hbmpOffscreen;    //屏幕DIB
    HBITMAP m_hbmpBackground;    //背景DIB
    HWND m_hwndTooltip;    //提示窗口句柄
    TOOLINFO m_ToolTip;    //提示結構
    bool m_bShowUpdateRect;    //是否更新
    //
    CControlUI* m_pRoot;    //根控件指針
    CControlUI* m_pFocus;    //獲得焦點控件指針
    CControlUI* m_pEventHover;    //鼠標停留控件指針
    CControlUI* m_pEventClick;    //點擊事件控件指針
    CControlUI* m_pEventKey;    //相應鍵盤事件控件指針
    //
    POINT m_ptLastMousePos;    //鼠標位置
    SIZE m_szMinWindow;        //窗口最小限制
    SIZE m_szMaxWindow;        //窗口最大限制
    SIZE m_szInitWindowSize;    //初始化窗口大小
    RECT m_rcSizeBox;        //托腮大小
    SIZE m_szRoundCorner;    //圓角大小
    RECT m_rcCaption;        //標題大小
    UINT m_uTimerID;        //計時器ID
    bool m_bFirstLayout;    //是否爲第一層
    bool m_bUpdateNeeded;    //是否需要更新
    bool m_bFocusNeeded;    //是否需要焦點
    bool m_bOffscreenPaint;    //是否繪製m_hDcOffscreen
    bool m_bAlphaBackground;    //背景是否透明
    bool m_bMouseTracking;    //是否追蹤鼠標
    bool m_bMouseCapture;    //是否捕獲鼠標
    
    CStdPtrArray m_aNotifiers;    //Listener 列表
    CStdPtrArray m_aTimers;        //計時器列表
    CStdPtrArray m_aPreMessageFilters;    //預處理消息列表
    CStdPtrArray m_aMessageFilters;        //消息處理列表
    CStdPtrArray m_aPostPaintControls;    //PostPaint控件列表
    CStdPtrArray m_aDelayedCleanup;    //延遲釋放控件列表
    CStdStringPtrMap m_mNameHash;    //控件名哈希列表
    CStdStringPtrMap m_mOptionGroup;    //選項組列表
    
    CPaintManagerUI* m_pParentResourcePM;    //當前繪製管理者的上一層繪製管理者(父繪製管理者)
    DWORD m_dwDefalutDisabledColor;    //默認非可用狀態字體顏色
    DWORD m_dwDefalutFontColor;    //默認字體顏色
    DWORD m_dwDefalutLinkFontColor;    //默認鏈接顏色
    DWORD m_dwDefalutLinkHoverFontColor;    //默認鼠標漂浮時字體顏色
    DWORD m_dwDefalutSelectedBkColor;    //默認被選擇後背景顏色
    TFontInfo m_DefaultFontInfo;    //默認字體信息
    CStdPtrArray m_aCustomFonts;    //字體列表

    CStdStringPtrMap m_mImageHash;    //圖片資源名哈希表
    CStdStringPtrMap m_DefaultAttrHash;    //默認屬性哈希表
    
    static HINSTANCE m_hInstance;    //應用程序對象實例句柄
    static HINSTANCE m_hResourceInstance;    //資源對象實例句柄
    static CStdString m_pStrResourcePath;    //資源路徑
    static CStdString m_pStrResourceZip;    //zip包資源名稱
    static CStdPtrArray m_aPreMessages;    //預處理消息隊列
======update 2011-07-09========================================
10 class UIMarkup -  解析XML
    CMarkup()
      功能 - 構造函數
      pstrXML - xml數據
      實現 -
        初始化成員變量
        調用Load()
    ~CMarkup()
      功能 - 析構函數

    Load()
      功能 - 加載xml數據
      pstrXML - xml數據
    LoadFromMem()
      功能 - 從內存中加載xml數據
      pByte - 內存數據指針
      dwSize - 大小
      encoding - 編碼方式 XMLFILE_ENCODING_UTF8(默認) XMLFILE_ENCODING_UNICODE XMLFILE_ENCODING_ASNI
      實現 -
        進行編碼轉換
        申請控件
        複製數據

    LoadFromFile()
     功能 - 從文件中加載xml數據
     pstrFilename - 文件名
     encoding - 編碼方式
     實現 -
       判斷資源類型是否爲zip包,如果爲zip包則進行解壓
       調用LoadFromMem()
    Release() - 釋放xml數據和元素信息數據
    IsValid() - Markup是否有效

    SetPreserveWhitespace() - 設置是否保存空白行
    GetLastErrorMessage()
      功能 - 得到錯誤信息
      pstrMessage - [out]錯誤信息內容
      cchMax - 信息長度
    GetLastErrorLocation
      功能 - 得到出錯位置
      pstrSource - 錯誤所在位置內容
      cchMax - 內容長度

    GetRoot() - 得到根節點

private:
    tagXMLELEMENT    //元素結構
    {
        ULONG iStart;    //在m_pstrXML中起始位置
        ULONG iChild;    //子標籤在m_pstrXML中的位置
        ULONG iNext;    //同級下一個標籤在m_pstrXML中的位置
        ULONG iParent;    //上一級標籤在m_pstrXML中的位置
        ULONG iData;    //元素數據在m_pstrXML中的位置
    } XMLELEMENT;

    LPTSTR m_pstrXML;    //xml數據
    XMLELEMENT* m_pElements;    //元素列表
    ULONG m_nElements;    //元素數量
    ULONG m_nReservedElements;    //存儲元素空間
    TCHAR m_szErrorMsg[100];    //錯誤消息
    TCHAR m_szErrorXML[50];        //錯誤內容
    bool m_bPreserveWhitespace;    //是否過濾空白
    解析xml數據
    bool _Parse();
    bool _Parse(LPTSTR& pstrText, ULONG iParent);
      實現 - 
        for(;;)
        {
            如果爲頂層則返回
            填充element
            解析名字
            解析屬性
            標籤閉合方式
            如果爲/>則continue
            如果爲>則遞歸調用_Parse()
            如果爲該標籤的對應閉合標籤 continue
        }
    XMLELEMENT* _ReserveElement(); - 申請保存元素空間
    跳過空白
      inline void _SkipWhitespace(LPTSTR& pstr) const;
      inline void _SkipWhitespace(LPCTSTR& pstr) const;
    跳過標識符
      inline void _SkipIdentifier(LPTSTR& pstr) const;
      inline void _SkipIdentifier(LPCTSTR& pstr) const;
    
    bool _ParseData(LPTSTR& pstrText, LPTSTR& pstrData, char cEnd);
     功能 - 解析數據
     pstrText - 被解析的數據字符串
     pstrData - 解析後的數據字符串
     cEnd - 終止字符
    解析轉義字符
      void _ParseMetaChar(LPTSTR& pstrText, LPTSTR& pstrDest);
    解析屬性
      bool _ParseAttributes(LPTSTR& pstrText);
    記錄錯誤信息返回錯誤
      bool _Failed(LPCTSTR pstrError, LPCTSTR pstrLocation = NULL);
11 class CMarkupNode
    CMarkupNode
=======update 2011-07-10========
11 class CMarkupNode
        CMarkupNode() - 構造函數 構造一個空節點
    CMarkupNode(CMarkup* pOwner, int iPos)
          功能 - 構造函數
          pOwner - CMarkup指針
          iPos - 在xml數據中的位置
        IsValid() - 節點對象是否有效
        GetParent() - 得到父節點
        GetSibling() - 得到兄弟節點
        GetChild() - 得到子節點
        GetChild(LPCTSTR pstrName)
          功能 - 按名字得到子節點
          實現 - 循環查找所有子節點,直到名字匹配
        HasSiblings() - 是否有兄弟節點
        HasChildren() - 是否有子節點
        GetName() - 得到節點對應的標籤名
        GetValue() - 得到節點對應的標籤數據值
        HasAttributes() - 是否有屬性
        HasAttribute(LPCTSTR pstrName) - 是否有名爲pstrName的屬性
        GetAttributeCount() - 得到節點屬性的數量
        GetAttributeName(int iIndex) - 按序號得到屬性名稱
    bool GetAttributeValue(int iIndex, LPTSTR pstrValue, SIZE_T cchMax)
          功能 - 得到屬性
          iIndex - 屬性序號
          pstrValue - [out] 屬性值字符串
          cchMax - 屬性值字符串長度
    bool GetAttributeValue(LPCTSTR pstrName, LPTSTR pstrValue, SIZE_T cchMax)
          功能 - 得到屬性
          pstrName - 屬性名
          pstrValue - [out] 屬性值字符串
          cchMax - 屬性值字符串長度

        _MapAttributes() - 解析xml屬性建立 屬性名和值的表映射到xml數據的位置

    enum { MAX_XML_ATTRIBUTES = 64 };        //屬性最大數量限制

    typedef struct
    {
        ULONG iName;
        ULONG iValue;
    } XMLATTRIBUTE;        //屬性結構

    int m_iPos;        //節點在xml數據中的位置
    int m_nAttributes;        //屬性數量
    XMLATTRIBUTE m_aAttributes[MAX_XML_ATTRIBUTES];        //屬性-值 映射xml位置 列表
    CMarkup* m_pOwner;        - CMarkup指針
12 class IDialogBuilderCallback - 構建UI時回調類 用於創造用戶自定義的控件
   virtual CControlUI* CreateControl(LPCTSTR pstrClass) = 0 - 創建用戶自定義控件, pstrClass控件名
13 class CDialogBuilder - 構建UI
     CControlUI* Create();
           功能 - 構建UI
         STRINGorID xml - 可以是一個內存xml數據或一個文件名
         STRINGorID type = (UINT) 0 - 如果xml數據位於EXE資源中則type指定資源類型
         IDialogBuilderCallback* pCallback = NULL - 回調函數
         CPaintManagerUI* pManager = NULL - 繪製管理者指針
           實現 -
             判斷xml類型
             加載xml數據
             調用Create(pCallback, pManager)構建
    CControlUI* Create(IDialogBuilderCallback* pCallback = NULL, CPaintManagerUI* pManager = NULL);
          功能 - 構建UI
          實現 - 
            得到頂層Window標籤,並解析屬性
        調用_Parse() 解析xml
    void GetLastErrorMessage(LPTSTR pstrMessage, SIZE_T cchMax) const; - 錯誤信息
    void GetLastErrorLocation(LPTSTR pstrSource, SIZE_T cchMax) const; - 出錯位置

    CControlUI* _Parse(CMarkupNode* parent, CControlUI* pParent = NULL, CPaintManagerUI* pManager = NULL);
        實現 -
          for(循環頂級標籤) 
          {
              按xml標籤創建控件對象
                  如果不是標準控件則調用m_pCallback->CreateControl()創建用戶自定義控件對象
                  如果有子節點則遞歸調用_Parse()
                  因爲某些屬性和父窗口相關,比如selected,必須先Add到父窗口
                  初始化控件默認屬性
                  根據xml數據解析處理控件屬性
         }
   CMarkup m_xml; //CMarkup對象
   IDialogBuilderCallback* m_pCallback;//構建控件回調
14 class CControlUI 控件
    GetName() - 得到控件名稱 名稱爲控件的唯一ID
    SetName() - 設置控件名稱
    GetInterface() - 得到控件指針
    GetClass() - 得到控件類名
    GetControlFlags() - 得到控件類型標誌
    Activate() - 控件是否活躍 (非不可用狀態,非不可見狀態)
    GetManager() - 得到繪製管理者
    SetMananer()
          功能 - 設置控件的繪製管理者
          實現 -
            設置控件管理者
            初始化
        GetParent() - 得到父控件
        GetText() - 得到控件顯示內容
        SetText() - 設置控件顯示內容
        GetBkColor() - 得到背景色
        GetBkColor2() - 得到背景色2
        SetBkColor2() - 設置背景色2
        GetBkColor3() - 得到背景色3
        SetBkColor3() - 設置背景色3
* 背景色1,2,3用於漸變色 顏色漸變過程爲1->2->3
        GetBkImage() - 得到背景圖片
        SetBkImage() - 設置背景圖片
        GetBorderColor() - 得到邊的顏色
        SetBorderColor() - 設置邊的顏色
        GetFocusBorderColor() - 設置獲得焦點時邊的顏色
        GetBorderSize() - 得到邊的寬度
        SetBorderSize() - 設置邊的寬度
        GetBorderRound() - 得到圓角
        SetBorderRound() - 設置圓角
        DrawImage() - 繪製圖片
        GetPos() - 得到控件位置
        SetPos() - 設置控件位置並重繪
        GetWidth() - 得到控件寬度
        GetHeight() - 得到控件高度
        GetX() - 得到控件橫座標位置(左上點橫座標)
        GetY() - 得到控件縱座標位置(左上點縱座標)
        GetPadding() - 設置外邊距,由上層窗口繪製(求周圍控件離它遠點或近點(負值,不過受繪製順序影響,比較少用)
        SetPadding() - 設置外邊距,由上層窗口繪製
    GetFixedXY() - 實際大小位置使用GetPos獲取,這裏得到的是預設的參考值
    SetFixedXY() - 僅float爲true時有效
    GetFixedWidth() - 實際大小位置使用GetPos獲取,這裏得到的是預設的參考值
    SetFixedWidth() - 預設的參考值
    GetFixedHeight() - 實際大小位置使用GetPos獲取,這裏得到的是預設的參考值
    SetFixedHeight() - 預設的參考值
        設置大小的限制值
      GetMinWidth()
          SetMinWidth()
          GetMaxWidth()
          SetMaxWidth()
          GetMinHeight()
          SetMinHeight()
          GetMaxHeight()
          SetMaxHeight()
        SetRelativePos() - 設置相對位置比例
        SetRelativeParentSize() - 設置父控件大小
        GetRelativePos() - 得到相對位置比例
        IsRelativePos() -是使用相對位置
        獲取/設置 提示信息
          GetToolTip()
          SetToolTip()
        獲取/設置 快捷鍵
          GetShortcut()
          SetShortcut()
        獲取/設置 上下文菜單是否被使用
          IsContextMenuUsed()
        獲取/設置 用戶數據(字符串)
          GetUserData()
          SetUserData()
        獲取/設置 用戶指針
          GetTag()
          SetTag()
        獲取/設置 控件是否可見
          IsVisible()
          SetVisible()
          SetInternVisible() // 僅供內部調用,有些UI擁有窗口句柄,需要重寫此函數
            有窗口句柄的UI在設置不可見時,需要先失去焦點
=============update 2011-07-11
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章