關於duilib的理解


0 duilib文件(5/17)
  [x] stb_image.c
  [x] stdafx.h stdafx.cpp
  [ ] UIActiveX.h UIActiveX.cpp
  [x] UIBase.h UIBase.cpp
  [ ] UICombo.h UICombo.cpp
  [x] UICommonControls.h UICommonControls.cpp
  [ ] UIContainer.h UIContainer.cpp
  [x] UIControl.h UIControl.cpp
  [x] UIDelegate.h UIDelegate.cpp
  [x] UIDlgBuilder.h UIDlgBuilder.cpp
  [x] UIlib.h UIlib.cpp
  [ ] UIList.h UIList.cpp
  [x] UIManager.h UIManager.cpp
  [x] UIMarkup.h UIMarkup.cpp
  [x] UIRender.h UIRender.cpp
  [ ] UIRichEdit.h UIRichEdit.cpp
  [x] XUnzip.cpp
1 stdAfx 預編譯
  * int lengthof(x)    計算數組長度宏
  * MAX        兩值最大
  * MIN        兩值最小
  * CLAMP(x,a,b)    xa,b之間則取x否則取最小
  * winmm.lib Windows 多媒體相關應用程序接口庫
  * comctl32.lib Windows 通用控件庫
2 UIBase
  * UI_WNDSTYLE_ 窗口風格屬性
  * UI_CLASSSTYLE_ 窗口類屬性
    /////<TODO:增加具體每項的解釋>

  * ASSERT(expr) - 斷言 同_ASSERTE(expr) 顯示斷言所在文件,行以及expr的內容

  * TRACE(LPCTSTR pstrFormat, ...)
    功能 調試信息
    參考 參考printf
  * TRACEMSG(UINT uMsg)
    功能 windows消息轉化成其對應的宏名
    uMsg - Windows消息ID
    返回值 宏名(字符串)

  * class STRINGorID
    功能 統一資源ID, 字符串類型和整型統一輸出為字符串類型

  * class CPoint
    描述 
    函數 -
      CPoint(LPARAM lParam)    //將消息中lParam轉化成點

  * class CSize
    描述 矩形的寬和高

  * class CRect
    描述 矩形區域
    函數 -
      void Empty()    //設置left,right,top,bottom為零
      void Join(const RECT& rc)    //合並兩個矩形產生一個包含兩個矩形的新的矩形
      void ResetOffset()    //將矩形移動到left=0,top=0的位置
      void Normalize()    //調整left,right,top,bottom使之left < right top < bottom
      void Offset(int cx, int cy)    //移動矩形, cx 橫向移動距離, cy 縱向移動距離
      void Inflate(int cx, int cy)    //放大矩形, cx左右各放大的大小, cy 上下各放大的大小
      void Deflate(int cx, int cy)    //縮小矩形, cx左右各縮小的大小, cy上下各縮小的大小
      void Union(CRect& rc)    //合並矩形Join()函數功能幾乎一致但對空矩形處理不同

  * class CStdPtrArray
    變量 -
      m_nAllocated    //已申請空間大小(可儲存Ptr的數量), 如果空間不足則去realloc m_nAllocated*2的空間

  * class CStdString    
    實現 如果長度小於MAX_LOCAL_STRING_LEN(63)則在棧上分配否則在堆上分配
    函數 -
      void Assign(LPCTSTR pstr, int nLength = -1)    //分配

  * class CStdStringMap
    描述 字符串map
    實現 使用times33哈希算法

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

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

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

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

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

  加入控件到延遲處理列表當中
    void AddDelayedCleanup(CControlUI* pControl);
  得到根控件
    CControlUI* GetRoot() const;
  調用根節點控件的函數按位置匹配控件
    CControlUI* FindControl(POINT pt) const;
  調用父控件的函數按名字匹配控件
    CControlUI* FindControl(CControlUI* pParent, POINT pt) const;
  在控件名map中按名字匹配控件
    CControlUI* FindControl(LPCTSTR pstrName);
  調用父控件的函數按名字匹配控件
    CControlUI* FindControl(CControlUI* pParent, LPCTSTR pstrName);
  消息循環
    static void MessageLoop();
  消息處理
    static bool TranslateMessage(const LPMSG pMsg);
  消息處理
    bool MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes);
  消息預處理
    bool PreMessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lRes);

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

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

    CStdStringPtrMap m_mImageHash;    //圖片資源名哈希表
    CStdStringPtrMap m_DefaultAttrHash;    //默認屬性哈希表
    
    static HINSTANCE m_hInstance;    //應用程序對象實例句柄
    static HINSTANCE m_hResourceInstance;    //資源對象實例句柄
    static CStdString m_pStrResourcePath;    //資源路徑
    static CStdString m_pStrResourceZip;    //zip包資源名稱
    static CStdPtrArray m_aPreMessages;    //預處理消息隊列

10 class UIMarkup -  解析XML
    CMarkup()
      功能 構造函數
      pstrXML - xml數據
      實現 -
        初始化成員變量
        調用Load()
    ~CMarkup()
      功能 析構函數

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

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

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

    GetRoot() - 得到根節點

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

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

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

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

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

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

    CControlUI* _Parse(CMarkupNode* parent, CControlUI* pParent = NULL, CPaintManagerUI* pManager = NULL);
    實現 -
      for(循環頂級標簽)
      {
          按xml標簽創建控件對象
          如果不是標准控件則調用m_pCallback->CreateControl()創建用戶自定義控件對象
          如果有子節點則遞歸調用_Parse()
          因為某些屬性和父窗口相關,比如selected,必須先Add到父窗口
          初始化控件默認屬性
          根據xml數據解析處理控件屬性
     }
   CMarkup m_xml; //CMarkup對象
   IDialogBuilderCallback* m_pCallback;//構建控件回調
14 class CControlUI - 控件
    GetName() - 得到控件名稱 名稱為控件的唯一ID
    SetName() - 設置控件名稱
    GetInterface() - 得到控件指針
    GetClass() - 得到控件類名
    GetControlFlags() - 得到控件的類型標志
    Activate() - 控件是否活躍 (非不可用狀態,非不可見狀態)
    GetManager() - 得到繪制管理者
    SetMananer()
      功能 設置控件的繪制管理者
      實現 -
        設置控件管理者
        初始化
    GetParent() - 得到父控件
    GetText() - 得到控件顯示內容
    SetText() - 設置控件顯示內容
    GetBkColor() - 得到背景色
    GetBkColor2() - 得到背景色2
    SetBkColor2() - 設置背景色2
    GetBkColor3() - 得到背景色3
    SetBkColor3() - 設置背景色3
背景色1,2,3用於漸變色 顏色漸變過程為1->2->3
    GetBkImage() - 得到背景圖片
    SetBkImage() - 設置背景圖片
    GetBorderColor() - 得到邊的顏色
    SetBorderColor() - 設置邊的顏色
    GetFocusBorderColor() - 設置獲得焦點時邊的顏色
    GetBorderSize() - 得到邊的寬度
    SetBorderSize() - 設置邊的寬度
    GetBorderRound() - 得到圓角
    SetBorderRound() - 設置圓角
    DrawImage() - 繪制圖片
    GetPos() - 得到控件位置
    SetPos() - 設置控件位置並重繪
    GetWidth() - 得到控件寬度
    GetHeight() - 得到控件高度
    GetX() - 得到控件橫坐標位置(左上點橫坐標)
    GetY() - 得到控件縱坐標位置(左上點縱坐標)
    GetPadding() - 設置外邊距,由上層窗口繪制(求周圍控件離它遠點或近點(負值,不過受繪制順序影響,比較少用)
    SetPadding() - 設置外邊距,由上層窗口繪制
    GetFixedXY() - 實際大小位置使用GetPos獲取,這里得到的是預設的參考值
    SetFixedXY() - floattrue時有效
    GetFixedWidth() - 實際大小位置使用GetPos獲取,這里得到的是預設的參考值
    SetFixedWidth() - 預設的參考值
    GetFixedHeight() - 實際大小位置使用GetPos獲取,這里得到的是預設的參考值
    SetFixedHeight() - 預設的參考值
    設置大小的限制值
      GetMinWidth()
      SetMinWidth()
      GetMaxWidth()
      SetMaxWidth()
      GetMinHeight()
      SetMinHeight()
      GetMaxHeight()
      SetMaxHeight()
    SetRelativePos() - 設置相對位置比例
    SetRelativeParentSize() - 設置父控件大小
    GetRelativePos() - 得到相對位置比例
    IsRelativePos() -是使用相對位置
    獲取/設置 提示信息
      GetToolTip()
      SetToolTip()
    獲取/設置 快捷鍵
      GetShortcut()
      SetShortcut()
    獲取/設置 上下文菜單是否被使用
      IsContextMenuUsed()
    獲取/設置 用戶數據(字符串)
      GetUserData()
      SetUserData()
    獲取/設置 用戶指針
      GetTag()
      SetTag()
    獲取/設置 控件是否可見
      IsVisible()
      SetVisible()
      SetInternVisible() // 僅供內部調用,有些UI擁有窗口句柄,需要重寫此函數
=============update 2011-07-11
    獲取/設置 控件可用
      IsEnabled()
      SetEnabled()
    獲取/設置 是否處理鼠標事件
      IsMouseEnabled()
      SetMouseEnabled()
    控件是否獲得焦點
      IsFocused()
    設置控件獲得焦點
      SetFocuse()
    控件是否懸浮
      IsFloat()
    設置控件為懸浮
      SetFloat()
    FindControl() - 查找控件
    Invalidate()
      功能 設置無效,引起刷新
      實現 循環至頂層控件為止計算當前無效區域與父控件交叉區域作為新無效區域。
    獲取/設置 需更新狀態
      IsUpdateNeeded()
      NeedUpdate()
    Init() - 初始化控件事件響應SetManager()中被調用
    DoInit() - 做初始化處理函數Init()調用
    DoEvent() - 事件響應函數
    SetAttribute() - 設置屬性根據解析后的名稱對所關心的屬性設置狀態成員變量的值
    ApplyAttributeList() - 解析標簽的屬性字符串調用SetAttribute()
    EstimateSize() - 預估控件大小
    DoPaint()
      功能 控件繪制
      實現 繪制循序:背景顏色->背景圖->狀態圖->文本->邊框
    PaintBkColor()
      功能 繪制背景色
    PaintBkImage()
      功能 繪制背景圖片
    PaintStatusImage()
      功能 根據狀態繪制背景圖片
    PaintText() - 繪制文字
    PaintBorder() - 繪制邊框
    DoPostPaint() - ?
    事件源 可以通過委托的設計模式為初始化,銷毀,事件處理過程中加入更多的處理過程
    CEventSource OnInit; - 初始化事件源
    CEventSource OnDestroy; - 銷毀事件源
    CEventSource OnEvent; - 事件響應事件源
    
======update 2011 07 16
15 UIlib.h/UIlib.cpp
   * UIlib.h
     導出導入宏
     包含系統的頭文件
     包含duilib庫的頭文件
   * UIlib.cpp
     Bjarke Viksoe UI library
     dllmain() 函數
16 class CDelegateBase 委托模式中的虛基類
     CDelegateBase(void* pObject, void* pFn); - 構造函數,pObject為委托者的對象, pFn為執行方法
     CDelegateBase(const CDelegateBase& rhs); - 拷貝構造函數
     virtual ~CDelegateBase(); - 析構函數
     bool Equals(const CDelegateBase& rhs) const; - 比較兩個委托者, true 一致 false不同
     bool operator() (TEventUI& event); - 響應委托進行處理 event為響應的事件
     virtual CDelegateBase* Copy() = 0; - 拷貝一個委托者
     void* GetFn(); - 得到執行方法
     void* GetObject(); - 得到委托者對象
     virtual bool Invoke(TEventUI& event) = 0; - 調用執行方法
     void* m_pObject; - 委托者
     void* m_pFn; - 執行方法
17 class CDelegateStatic 靜態委托,委托者為空,但有執行過程
18 class CDelegate 委托,委托者不為空
19 產生委托
   CDelegate<O, T> MakeDelegate(O* pObject, bool (T::* pFn)(TEventUI&))
  inline CDelegateStatic MakeDelegate(bool (*pFn)(TEventUI&))
20 class CEventSource - 事件源
     加入一個委托者
       void operator+= (CDelegateBase& d);
       void operator+= (FnType pFn);
    刪除一個委托者
       void operator-= (CDelegateBase& d);
       void operator-= (FnType pFn);
    響應事件進行處理
    bool operator() (TEventUI& event);
    CStdPtrArray m_aDelegates; - 委托者列表
21 class CLabelUI - 標簽控件
    CLabelUI() - 構造函數
    m_uTextStyle - 樣式默認居中
    m_dwTextColor - 可用時文字顏色
    m_dwDisabledTextColor - 不可用時文字顏色
    m_iFont - 字體序號
    m_bShowHtml - 是否使用內嵌hmtl標記格式
    GetClass() - 返回控件名
    GetInterface() - 得到對象指針
    獲取/設置 文本樣式
      GetTextStyle()
      SetTextStyle()
    獲取/設置 可用狀態文字顏色
      SetTextColor()
      GetTextColor()
    獲取/設置 為可用狀態文字顏色
      SetDisableTextColor()
      GetDisabledTextColor()
    獲取/設置 控件使用的字體對應在字體列表中的序號
      SetFont()
      GetFont()
    獲取/設置 文字與邊框之間填充距離
      GetTextPadding()
      SetTextPadding()
    獲取/設置 是否使用內嵌html標記格式
      IsShowHtml()
      SetShowHtml()
    EstimateSize() - 預估控件大小
    DoEvent() - 事件處理
    SetAttribute() - 設置屬性
    PaintText() - 繪制文本
22 class CButtonUI
    CButtonUI() - 構造函數文本樣式為單行居中
    GetClass() - 返回控件名
    GetInterface() - 得到對象指針
    GetControlFlags() - 得到控件的類型標志
    DoEvent() - 事件處理
    非鼠標事件交給基類CLabelUI處理鼠標事件由此函數處理
    Activate()
      功能 激活按鈕控件
      實現 判斷是否活躍,如活躍發送通知
    SetEnabled() - 設置按鈕控件是否可用
      實現 調用基類設置如不可用則清空按鈕狀態
    設置/獲取 鼠標懸時文本的顏色
      SetHotTextColor()
      GetHotTextColor()
    設置/獲取 按鈕按下時文本顏色
      SetPushedTextColor()
      GetPushedTextColor()
    設置/獲取 按鈕獲得焦點時文本顏色
      SetFocusedTextColor()
      GetFocusedTextColor()
    獲取/設置 正常狀態下按鈕背景圖片
      GetNormalImage()
      SetNormalImage()
    獲取/設置 鼠標懸浮時按鈕背景圖片
      SetHotImage()
      GetHotImage()
    獲取/設置 按鈕被按下時背景圖片
      GetPushedImage()
      SetPushedImage()
    獲取/設置 按鈕獲得焦點時背景圖片
      GetFocusedImage()
      SetFocusedImage()
    獲取/設置 非可用狀態下按鈕背景圖片
      GetDisabledImage()
      SetDisabledImage()
    EstimateSize() - 預估大小
    SetAttribute() - 設置屬性根據解析后的名稱對所關心的屬性設置狀態成員變量的值
    PaintText() - 繪制文本
    PaintStatusImage() - 繪制狀態背景圖片
23 class COptionUI - 選項控件(CheckBox RadioBox)
    COptionUI() - 構造函數
    ~COptionUI() - 析構函數
      CPaintManaerUI::RemoveOptionGroup()
    GetClass() - 返回控件名
    GetInterface() - 得到對象指針
    SetManager() - 設置繪制管理者父控件
    獲取/設置 選項所屬組
    GetGroup()
    SetGroup()
    獲取/設置 選項是否處於選中狀態
    IsSelected()
    Selected()
    Activate() - 激活選項控件
    獲取/設置 選中狀態背景圖片
      GetSelectedImage()
      SetSelectedImage()
    獲取/設置 前景圖片
      GetForeImage()
      SetForeImage()
    EstimateSize() - 預估選項控件大小
    SetAttribute() - 設置屬性根據解析后的名稱對所關心的屬性設置狀態成員變量的值
    PaintStatusImage() - 繪制狀態背景圖片
24 class CTextUI
  * CTextUI() - 構造
    ~CTextUI() - 析構
    GetClass() - 返回控件名
    GetControlFlags() - 得到控件的類型標志
    GetInterface() - 得到對象指針

    GetLinkContent() - 得到當前控件中指定序號的超文本的內容
    DoEvent() - 事件處理
    EstimateSize() - 預估選項控件大小
    PaintText() - 繪制文字

    MAX_LINK - 超文本數量限制
    m_nLinks - 超文本數量
    m_rcLinks - 超文本區域數組
    m_sLinks - 超文本內容數組
    int m_bHoverLink - 鼠標浮動的超文本鏈接序號

25 class CProgressUI
    GetClass() - 返回控件名
    GetInterface() - 得到對象指針

    - 獲取/設置 進度條方向
      bool IsHorizontal();
      void SetHorizontal(bool bHorizontal = true);
    -獲取/設置 最小值
    int GetMinValue() const;
    void SetMinValue(int nMin);
    獲取/設置 最大值
    int GetMaxValue() const;
    void SetMaxValue(int nMax);
    獲取 設置 最小值
    int GetValue() const;
    void SetValue(int nValue);
    獲取 設置 前景圖
    LPCTSTR GetFgImage() const;
    void SetFgImage(LPCTSTR pStrImage);

    void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); - 設置屬性
    void PaintStatusImage(HDC hDC); - 繪制狀態圖

    bool m_bHorizontal - 進度條控件方向
    int m_nMax; 最大值
    int m_nMin; 最小值
    int m_nValue; 當前值

    CStdString m_sFgImage; - 前景圖
    CStdString m_sFgImageModify; - 前景圖2

26 class CSliderUI
    CSliderUI() - 構造
    GetClass() - 返回控件名
    GetInterface() - 得到對象指針

    UINT GetControlFlags() const; -  得到控件的類型標志

    void SetEnabled(bool bEnable = true); - 設置滑塊控件是否可用

    獲取 設置滑塊步長
    int GetChangeStep();
    void SetChangeStep(int step);

    獲取設置滑塊大小
    void SetThumbSize(SIZE szXY);
    RECT GetThumbRect() const;
    獲取設置滑塊圖
    LPCTSTR GetThumbImage() const;
    void SetThumbImage(LPCTSTR pStrImage);
    獲取設置鼠標懸浮狀態滑塊圖
    LPCTSTR GetThumbHotImage() const;
    void SetThumbHotImage(LPCTSTR pStrImage);
    獲取設置滑塊按下狀態滑塊圖
    LPCTSTR GetThumbPushedImage() const;
    void SetThumbPushedImage(LPCTSTR pStrImage);
  
    void DoEvent(TEventUI& event); - 事件處理
    void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); - 設置屬性
    void PaintStatusImage(HDC hDC); - 繪制狀態圖

    SIZE m_szThumb; - 滑塊大小
    UINT m_uButtonState; - 控件狀態
    int m_nStep; - 步長

    CStdString m_sThumbImage; - 正常狀態滑塊塊圖
    CStdString m_sThumbHotImage; - 鼠標懸浮狀態滑塊圖
    CStdString m_sThumbPushedImage; - 按下狀態滑塊圖

    CStdString m_sImageModify; - 滑塊圖2


免責聲明!

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



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