找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4079|回复: 0

IM 开源项目 客户端UI框架 Direct UI(01)

[复制链接]
发表于 2012-2-8 22:05:27 | 显示全部楼层 |阅读模式
近日依旧在进行客户端界面使用DirectUI 进行尝试,由于一切控件均需要进行自绘,过程较为耗时。

控件的实现由CUIBaseCtrl基类开始
定义如下:/* CLASS_BEGIN *****************************************************
  1.     类名:CUIBaseCtrl
  2.    功能:控件基类
  3.    CLASS_END  ******************************************************/
  4. #ifndef H_CUIBASECTRL_H
  5. #define H_CUIBASECTRL_H
  6. #include "CTypeDef.h"
  7. #include "UIRenderEngine.h"
  8. #include "UICache.h"
  9. #include "UIStructDef.h"
  10. #include "BinarySet.h"
  11. enum e_CheckBordType
  12. {
  13.         e_bIsWorkRange = 0,                                                                // 选中工作区域
  14.         e_bIsCkLBorder,                                                                        // 选中左边框
  15.         e_bIsCkRBorder,                                                                        // 选中右边框
  16.         e_bIsCkTBorder,                                                                        // 选中上边框
  17.         e_bIsCkBBorder,                                                                        // 选中上边框
  18.         e_bIsCkLTBorder,                                                                // 选中左顶点
  19.         e_bIsCkRTBorder,                                                                // 选中右顶点
  20.         e_bIsCkLBBorder,                                                                // 选中上底点
  21.         e_bIsCkRBBorder,                                                                // 选中上底点
  22. };
  23. class CWinWnd;
  24. // 控件基类
  25. class CUIBaseCtrl
  26. {
  27. public:
  28.         CUIBaseCtrl(CUICache* apCache, CWinWnd* ahWnd);
  29.         ~CUIBaseCtrl(void);
  30.         void        SetVisiable(BOOL abIsVisiable);                                                                                 // 设置是否可见
  31.         BOOL        GetVisiable(void);                                                                                                                   // 获取是否可见
  32.         void        SetCtrlID(ULong aulCtrlID);                                                                                                // 设置控件ID
  33.         ULong        GetCtrlID(void);                                                                                                                // 获取控件ID
  34.         HWND    GetWnd(void);                                                                                                                        // 获取窗口       
  35.         HINSTANCE GetInstance(void);
  36.         int     GetFont(void) {return m_iFont;}                                                                                        // 获取窗口       
  37.         int     SetFont(int aiFont) {m_iFont = aiFont;}                                                                        // 获取窗口       
  38.         void        SetRect(RECT& aoRect);                                                                                                        // 设置控件所在矩形区域
  39.         void        SetRect(int aiXVertex, int aiYVertex, int aiWidth, int aiHeight);                // 设置控件所在矩形区域
  40.         void    SetBordeRect(void);                                                                                                                // 设置边框矩形
  41.         RECT&        GetRect(void);                                                                                                                        // 获取控件所在矩形区域
  42.         int                GetWidth(void);                                                                                                                        // 获取控件宽度
  43.         int                GetHeight(void);                                                                                                                // 获取控件高度
  44.         int     GetXVertex(void);                                                                                                                // 获取顶点X
  45.         int     GetYVertex(void);                                                                                                                // 获取顶点Y
  46.         void        SetBorderSize(int aiBorderSize);                                                                                // 设置控件边框
  47.         int                GetBorderSize(void);                                                                                                        // 获取控件边框
  48.         void        SetBorderRound(SIZE asBorderRound);                                                                                // 设置控件圆角
  49.         SIZE        GetBorderRound(void);                                                                                                        // 获取控件圆角
  50.         void        SetWndRound(int aiRound);                                                                                                // 设置窗体圆角
  51.         int                GetWndRound(void);                                                                                                                // 获取窗体圆角
  52.         void        SetData(unsigned char*);                                                                                                // 设置控件数据
  53.         UInt8*        GetData(void) const;                                                                                                        // 获取控件数据
  54.         void        SetMaxSize(BOOL abIsMaxSize);                                                                                        // 设置窗口是否最大化
  55.         BOOL        GetMaxSize(void);                                                                                                                // 获取窗口是否最大化
  56.         BOOL        AddChildCtrl(CUIBaseCtrl*);                                                                                                // 增加子控件
  57.         BOOL        DelChildCtrl(CUIBaseCtrl*);                                                                                                // 删除子控件
  58.         BOOL        SetParentCtrl(CUIBaseCtrl*);                                                                                        // 设置父控件
  59.         CUIBaseCtrl*        GetParentCtrl(void);                                                                                        // 获取父控件
  60.         void        SetBkColor(ULong aulBkColor);                                                                                        // 设置背景色
  61.         ULong        GetBkColor(void);                                                                                                                // 获取背景色
  62.         void        SetBkImage(TCHAR* apImageName);                                                                                        // 获取背图片
  63.         TCHAR*        GetBkImage(void);                                                                                                                // 设置背图片
  64.         void    SetStatusImage(TCHAR* apImageName);
  65.         CStdString& GetStatusImage(void);                                                                                               
  66.         BOOL        DrawImage(HDC hDC, TCHAR* apImageName, LPCTSTR pStrModify = NULL, int aiNarrow = 0);                // 绘制图片
  67.         void        Invalidate(void);                                                                                                                // 更新
  68.         void        SetFocus(BOOL abIsFocus);                                                                                                // 是否选中
  69.         RECT&        GetWorkRect(void);                                                                                                                // 获取工作区域矩形
  70.         BOOL        IsPtInCtrlRect(POINT& );                                                                                                // 坐标是否在控件区域内
  71.         BOOL        IsPtInWorkRect(POINT&);                                                                                                        // 坐标是否在工作区域内
  72.         BOOL        IsPtInLRect(POINT&);                                                                                                        // 坐标是否左边框内
  73.         BOOL        IsPtInRRect(POINT&);                                                                                                        // 坐标是否右边框内
  74.         BOOL        IsPtInTRect(POINT&);                                                                                                        // 坐标是否上边框内
  75.         BOOL        IsPtInBRect(POINT&);                                                                                                        // 坐标是否下边框内
  76.         BOOL        IsPtInLTRect(POINT&);                                                                                                        // 坐标是否左顶点
  77.         BOOL        IsPtInRTRect(POINT&);                                                                                                        // 坐标是否右顶点
  78.         BOOL        IsPtInLBRect(POINT&);                                                                                                        // 坐标是否上底点
  79.         BOOL        IsPtInRBRect(POINT&);                                                                                                        // 坐标是否下底点
  80.         void        OnBReSize(int aiYBefore, int aiYAfter, RECT& aoRedressRect,                                // 下边框重新计算
  81.                                           RECT& aoParentRect, int aiBorderSize);
  82.         void        OnTReSize(int aiYBefore, int aiYAfter, RECT& aoRedressRect,                                // 上边框重新计算
  83.                                           RECT& aoParentRect, int aiBorderSize);
  84.         void        OnRReSize(int aiXBefore, int aiXAfter, RECT& aoRedressRect,                                // 右边框重新计算
  85.                                           RECT& aoParentRect, int aiBorderSize);
  86.         void        OnLReSize(int aiXBefore, int aiXAfter, RECT& aoRedressRect,                                // 左边框重新计算
  87.                                           RECT& aoParentRect, int aiBorderSize);
  88.         CUIBaseCtrl* FindCtrl(POINT& aoPoint);                                                                                        // 找到指定坐标所属的子窗口
  89.         CUIBaseCtrl* GetTopCtrl(void);                                                                                                        // 获得底层控件
  90.         void        SetTestMouseHit(BOOL abMouseHit)                {m_bTestMouseHit = abMouseHit;}                //
  91.         BOOL        GetTestMouseHit(void)                                        {return m_bTestMouseHit;}
  92.        
  93.         void        SetTestMouseLeave(BOOL abMouseLeave)        {m_bTestMouseLeave = abMouseLeave;}
  94.         BOOL        GetTestMouseLeave(void)                 {return m_bTestMouseLeave;}
  95.         // 设置处理消息回调函数
  96.         BOOL        SetMsgCallBack(ULong aulMsgId, MsgCallBack apFunc);
  97.         // 获取窗口的最大化 还原等属性
  98.         int                GetStytle(void);
  99.         void SetPrintBkColor(BOOL abIsdrawBkCol)                { m_bPrntBkColor                = abIsdrawBkCol ;}
  100.         void SetPrintBkImage(BOOL abPrntBkImage)                { m_bPrntBkImage                = abPrntBkImage ;}
  101.         void SetPrintStImage(BOOL abPrntGdiplusImage)        { m_bPrntGdiPlusImage        = abPrntGdiplusImage ;}
  102.         void SetPrintText(BOOL abPrntText)                                { m_bPrntText                        = abPrntText ;}
  103.         void SetPrintBorder(BOOL abPrntBorder)                        { m_bPrntBorder                        = abPrntBorder ;}
  104.         CStdString& GetWndText(void)                                        { return m_strWinText;}
  105.         void SetWndText(TCHAR* apText);
  106.         //设置文字风格
  107.         void SetTextStyle(ULong aulTextStyle) { m_ulTextStyle = aulTextStyle ;}
  108.         virtual void OnPaint(HDC ahDC, const RECT& aoRect, S_MsgEventUI& apEvent);                // 绘制控件
  109. // 消息处理
  110. protected:
  111.         friend class CMSGMgr;
  112.        
  113.         virtual void PaintBkColor(HDC ahDC);                                                                                        // 绘制背景
  114.         virtual void PaintBkImage(HDC ahDC);                                                                                        // 绘制背景图片
  115.         virtual void PaintGdiplusImage(HDC hDC);                                                                                // 绘制状态图
  116.         virtual void PaintText(HDC hDC);                                                                                                // 绘制文字
  117.         virtual void PaintBorder(HDC hDC);                                                                                                // 绘制边框
  118.         virtual void PaintMoveBorder(HDC hDC);                                                                                        // 绘制运动边框
  119.         virtual void PaintChangeSize(HDC hDC);                                                                                        // 绘制大小改变
  120.         virtual void OnSize(S_MsgEventUI& apEvent);                                                                                // 大小改变时
  121.         virtual void OnCtrlMsg(S_MsgEventUI& apEvent);                                                                        // 控件消息分派
  122.         virtual void OnLButtonDown(S_MsgEventUI& apEvent);                                                                // 当鼠标左键落下
  123.         virtual void OnLButtonUP(S_MsgEventUI& apEvent);                                                                // 当鼠标左键弹起时
  124.         virtual void OnLBuDbClk(S_MsgEventUI& apEvent);                                                                        // 当鼠标左键双击
  125.         virtual void OnRButtonDown(S_MsgEventUI& apEvent);                                                                // 当鼠标右键落下
  126.         virtual void OnRButtonUP(S_MsgEventUI& apEvent);                                                                // 当鼠标右键弹起时
  127.         virtual void OnRBuDbClk(S_MsgEventUI& apEvent);                                                                        // 当鼠标右键双击
  128.         virtual void OnMouseMove(S_MsgEventUI& apEvent);                                                                // 鼠标移动到
  129.         virtual void OnMouseHover(S_MsgEventUI& apEvent);                                                                // 鼠标停留
  130.         virtual void OnMouseHit(S_MsgEventUI& apEvent);                                                                        // 鼠标撞击
  131.         virtual void OnMouseLeave(S_MsgEventUI& apEvent);                                                                // 鼠标移动到
  132.         virtual void OnKillFocus(S_MsgEventUI& apEvent);                                                                // 失去焦点
  133.         virtual        void OnCtrlBroadcast(S_MsgEventUI& apEvent);                                                        // 控件广播消息
  134.         virtual void OnMaxRestore(void);                                                                                                // 设置窗口的最大化和恢复
  135.         virtual void OnOCMCommand(S_MsgEventUI& apEvent);
  136. // 动作
  137. protected:
  138.         // 平移控件
  139.         virtual void MoveChildWindow(int aiXMove, int aiYMove);                                                        // 移动子窗口
  140.         virtual void BegMoveWindow(POINT& aoPtMouse);                                                                        // 开始移动窗口
  141.         virtual void EndMoveWindow(POINT& aoPtMouse);                                                                        // 结束移动窗口
  142.         virtual void DrawMoveRect(POINT& aoPtMouse);                                                                        // 绘制移动时区域
  143.         virtual void DrawChangeRect(POINT& aoPtMouse);                                                                        // 绘制变化时区域
  144.         // 改变控件大小
  145.         virtual void BegSizeChange(POINT& aoPtMouse);                                                                        // 开始改变
  146.         virtual void EndSizeChange(POINT& aoPtMouse);                                                                        // 结束改变
  147.         virtual void IsChMouseOnBorder(POINT& aoPtMouse);                                                                // 测试鼠标是否边框上
  148. protected:
  149.         CWinWnd*                                                m_hWinWnd;                                                                               
  150.         ULong                                                        m_ulCtrlID;                                                                                // 控件ID
  151.         HWND                                                        m_hWnd;
  152.         CUICache*                                                m_pUIResCache;                                                                        // 界面资源缓冲
  153.         UInt8*                                                        m_pData;                                                                                // 控件关联数据
  154.         RECT                                                        m_oRect;                                                                                // 当前控件所在的区域
  155.         RECT                                                        m_oWockRect;                                                                        // 工作区域
  156.         RECT                                                        m_oRectPrint;                                                                        // 相交矩形部分       
  157.         RECT                                                        m_oMovingRect;                                                                        // 移动矩形
  158.         RECT                                                        m_oSCUpDateRect;                                                                // 大小改变时更新区域
  159.         RECT                                                        m_oBordeLRect;                                                                        // 左边框矩形
  160.         RECT                                                        m_oBordeRRect;                                                                        // 右边框矩形
  161.         RECT                                                        m_oBordeTRect;                                                                        // 上边框矩形
  162.         RECT                                                        m_oBordeBRect;                                                                        // 下边框矩形
  163.         RECT                                                        m_oBordeLTRect;                                                                        // 左顶点
  164.         RECT                                                        m_oBordeRTRect;                                                                        // 右顶点
  165.         RECT                                                        m_oBordeLBRect;                                                                        // 左底点
  166.         RECT                                                        m_oBordeRBRect;                                                                        // 右底点
  167.         CUIBaseCtrl*                                        m_pParentCtrl;                                                                        // 父控件
  168.         TBinarySet<CUIBaseCtrl*>                m_pChildCtrlSet;                                                                // 子控件
  169.         CThreadLock                                                m_oChildCtrlSetLock;                                                        // 子控件锁
  170.         BOOL                                                        m_bColorHSL;                                                                        // 色调(H)、饱和度(S)、亮度(L)  
  171.         BOOL                                                        m_bIsFocus;                                                                                // 是否选中
  172.         BOOL                                                        m_bTestMouseHit;                                                                // 鼠标是否在控件上
  173.         BOOL                                                        m_bTestMouseLeave;                                                                // 鼠标是否在控件上
  174.         ULong                                                        m_ulBkColor;                                                                        // 背景色
  175.         TCHAR*                                                        m_pBkImage;                                                                                // 背景图片描述
  176.         CStdString                                                m_oStatusImage;                                                                        // 状态图片描述
  177.         int                                                                m_iBorderSize;                                                                        // 边框大小
  178.         SIZE                                                        m_cxyBorderRound;                                                                // 边框圆角
  179.         int                                                                m_iRound;                                                                                // 窗体圆角
  180.         ULong                                                        m_ulNomalBordecCl;                                                                // 常规边框颜色
  181.         ULong                                                        m_ulFocusBordecCl;                                                                // 焦点边框颜色
  182.         int                                                                m_iXmove;                                                                                // 移动时X坐标平移
  183.         int                                                                m_iYmove;                                                                                // 移动时Y坐标平移
  184.         int                                                                m_liMaxLXmove;                                                                        // 最大左移               
  185.         int                                                                m_liMaxRXmove;                                                                        // 最大右移
  186.         int                                                                m_liMaxUYmove;                                                                        // 最大上移
  187.         int                                                                m_liMaxDYmove;                                                                        // 最大下移       
  188.         BOOL                                                        m_bIsInMove;                                                                        // 是否在移动
  189.         int                                                                m_iXChange;                                                                                // 改变时X坐标平移
  190.         int                                                                m_iYChange;                                                                                // 改变时Y坐标平移
  191.         e_CheckBordType                                        m_eCheckBordType;                                                                // 鼠标选中区域类型
  192.         BOOL                                                        m_bIsHitBorder;                                                                        // 是否停留在边框
  193.         BOOL                                                        m_bInChangeSize;                                                                // 改变大小中
  194.         TCHAR*                                                        m_pMouseIcon;                                                                        // 鼠标图标
  195.         BOOL                                                        m_bIsMaxSize;                                                                        // 是否最大化
  196.        
  197.         BOOL                                                        m_bPrntBkColor;
  198.         BOOL                                                        m_bPrntBkImage;
  199.         BOOL                                                        m_bPrntGdiPlusImage;
  200.         BOOL                                                        m_bPrntText;
  201.         BOOL                                                        m_bPrntBorder;
  202.         CStdString                                                m_strWinText;                                                                         // 文字
  203.         CStdString                                                m_strTextName;                                                                         // 文字名称
  204.         ULong                                                        m_ulTextColor;                                                                         // 颜色
  205.         ULong                                                        m_ulDisTextColor;
  206.         ULong                                                        m_ulTextStyle;                                   // 风格
  207.         BOOL                                                        m_bIsVisiable;                                                                         // 是否可见(可用)
  208. private:
  209.         RECT                                                        m_oRectBefore;
  210.         int                                                                m_iStytle;
  211.         int                                                                m_iFont;                                                                                 // 字体
  212. };
  213. #endif//H_CUIBASECTRL_H
  214. 实现如下:#include "StdAfx.h"
  215. #include "UIBaseCtrl.h"
  216. #include "UIWinWnd.h"
  217. CUIBaseCtrl::CUIBaseCtrl(CUICache* apCache, CWinWnd* apWinWnd)
  218. : m_bColorHSL(FALSE)
  219. , m_bTestMouseHit(TRUE)
  220. , m_bTestMouseLeave(TRUE)
  221. , m_bIsInMove(FALSE)
  222. , m_bIsHitBorder(FALSE)
  223. , m_bInChangeSize(0)
  224. , m_bIsMaxSize(FALSE)
  225. , m_bIsFocus(FALSE)
  226. , m_bPrntBkColor(TRUE)
  227. , m_bPrntBkImage(TRUE)
  228. , m_bPrntGdiPlusImage(FALSE)
  229. , m_bPrntText(TRUE)
  230. , m_bPrntBorder(FALSE)
  231. , m_pBkImage(NULL)
  232. , m_pUIResCache(apCache)
  233. , m_ulNomalBordecCl(0x999999)
  234. , m_ulFocusBordecCl(0x388E8E) // 选中后的颜色
  235. , m_iBorderSize(1)
  236. , m_pParentCtrl(0)
  237. , m_pMouseIcon(0)
  238. , m_iXmove(0)
  239. , m_iYmove(0)
  240. , m_iStytle(SW_RESTORE)
  241. , m_iRound(0)
  242. , m_iFont(-1)
  243. , m_liMaxLXmove(0)
  244. , m_liMaxRXmove(0)
  245. , m_liMaxUYmove(0)
  246. , m_liMaxDYmove(0)       
  247. , m_ulTextColor(0x555555)
  248. , m_bIsVisiable(TRUE)
  249. , m_strTextName(_T("Default"))
  250. {
  251.         memset(&m_oRectPrint, 0, sizeof(RECT));
  252.         m_cxyBorderRound.cx = 0;
  253.         m_cxyBorderRound.cy = 0;
  254.         m_hWinWnd = apWinWnd;
  255.         m_hWnd = m_hWinWnd->GetWnd();
  256. }
  257. CUIBaseCtrl::~CUIBaseCtrl(void)
  258. {
  259. }
  260. // 设置控件ID
  261. void        CUIBaseCtrl::SetCtrlID(ULong aulCtrlID)
  262. {
  263.         m_ulCtrlID = aulCtrlID;
  264. }
  265. // 设置是否可见
  266. void        CUIBaseCtrl::SetVisiable(BOOL abIsVisiable)
  267. {
  268.         m_bIsVisiable =  abIsVisiable;
  269.         ::InvalidateRect(m_hWnd, &GetRect(), TRUE);
  270. }
  271. // 获取是否可见
  272. BOOL        CUIBaseCtrl::GetVisiable(void)
  273. {
  274.         return m_bIsVisiable;
  275. }                                       
  276. // 获取控件ID
  277. ULong        CUIBaseCtrl::GetCtrlID(void)
  278. {
  279.         return m_ulCtrlID;
  280. }
  281. HWND CUIBaseCtrl::GetWnd(void)
  282. {
  283.         return m_hWinWnd->GetWnd();
  284. }
  285. HINSTANCE CUIBaseCtrl::GetInstance(void)
  286. {
  287.         return m_hWinWnd->GetInstance();
  288. }
  289. void CUIBaseCtrl::SetRect(int aiXVertex, int aiYVertex, int aiWidth, int aiHeight)
  290. {
  291.         if (aiWidth < m_iBorderSize*3)       
  292.                 aiWidth =  m_iBorderSize*3;
  293.         if (aiHeight < m_iBorderSize*3)       
  294.                 aiHeight = m_iBorderSize*3;
  295.         m_oRect.left   = aiXVertex;
  296.         m_oRect.right  = aiXVertex + aiWidth;
  297.         m_oRect.top    = aiYVertex;
  298.         m_oRect.bottom = aiYVertex + aiHeight;
  299.         m_oWockRect    = m_oRect;
  300.         if (m_iBorderSize) SetBordeRect();
  301. }
  302. // 设置控件所在矩形区域
  303. void CUIBaseCtrl::SetRect(RECT& aoRect)
  304. {
  305.         if ((aoRect.right - aoRect.left) < (m_iBorderSize*3))
  306.                 aoRect.right = aoRect.left + (m_iBorderSize*3);
  307.         if ((aoRect.bottom - aoRect.top) < (m_iBorderSize*3))
  308.                 aoRect.bottom = aoRect.top + (m_iBorderSize*3);
  309.         m_oRect     = aoRect;
  310.         m_oWockRect = aoRect;
  311.         if (m_iBorderSize)
  312.                 SetBordeRect();
  313.         ::InvalidateRect(m_hWnd,&m_oRect,TRUE);
  314. }
  315. void CUIBaseCtrl::SetBordeRect(void)
  316. {
  317.         // 矫正工作区域
  318.         m_oWockRect.left                += m_iBorderSize;
  319.         m_oWockRect.right                -= m_iBorderSize;
  320.         m_oWockRect.top                        += m_iBorderSize;
  321.         m_oWockRect.bottom                -= m_iBorderSize;
  322.         // 计算左边界矩形
  323.         m_oBordeLRect.left                =  m_oRect.left;
  324.         m_oBordeLRect.right                =  m_oBordeLRect.left                + m_iBorderSize;
  325.         m_oBordeLRect.top                =  m_oRect.top                                + m_iBorderSize ;
  326.         m_oBordeLRect.bottom        =  m_oRect.bottom                        - m_iBorderSize ;
  327.         // 计算右边界矩形
  328.         m_oBordeRRect.left      =  m_oRect.right                        - m_iBorderSize;
  329.         m_oBordeRRect.right     =  m_oRect.right;
  330.         m_oBordeRRect.top                =  m_oRect.top                                + m_iBorderSize ;
  331.         m_oBordeRRect.bottom        =  m_oRect.bottom                        - m_iBorderSize ;
  332.         // 计算上边界矩形
  333.         m_oBordeTRect.left      =  m_oRect.left                                + m_iBorderSize ;
  334.         m_oBordeTRect.right     =  m_oRect.right                        - m_iBorderSize ;
  335.         m_oBordeTRect.top                =  m_oRect.top;
  336.         m_oBordeTRect.bottom        =  m_oRect.top                                + m_iBorderSize;
  337.         // 计算下边界矩形
  338.         m_oBordeBRect.left      =  m_oRect.left                                + m_iBorderSize;
  339.         m_oBordeBRect.right     =  m_oRect.right                        - m_iBorderSize;
  340.         m_oBordeBRect.top                =  m_oRect.bottom                - m_iBorderSize;
  341.         m_oBordeBRect.bottom        =  m_oRect.bottom;
  342.         // 计算左顶点
  343.         m_oBordeLTRect.left     =  m_oRect.left;
  344.         m_oBordeLTRect.right    =  m_oRect.left                                + m_iBorderSize*4;
  345.         m_oBordeLTRect.top                =  m_oRect.top;
  346.         m_oBordeLTRect.bottom        =  m_oRect.top                                + m_iBorderSize*4;
  347.         // 计算右顶点
  348.         m_oBordeRTRect.left     =  m_oRect.right            - m_iBorderSize*4;
  349.         m_oBordeRTRect.right    =  m_oRect.right;
  350.         m_oBordeRTRect.top                =  m_oRect.top;
  351.         m_oBordeRTRect.bottom        =  m_oRect.top                                + m_iBorderSize*4;
  352.         // 计算左底点
  353.         m_oBordeLBRect.left     =  m_oRect.left;
  354.         m_oBordeLBRect.right    =  m_oRect.left                                + m_iBorderSize*4;
  355.         m_oBordeLBRect.top                =  m_oRect.bottom                        - m_iBorderSize*4;
  356.         m_oBordeLBRect.bottom        =  m_oRect.bottom;
  357.         // 计算右底点
  358.         m_oBordeRBRect.left     =  m_oRect.right                        - m_iBorderSize*4;
  359.         m_oBordeRBRect.right    =  m_oRect.right;
  360.         m_oBordeRBRect.top                =  m_oRect.bottom                        - m_iBorderSize*4;
  361.         m_oBordeRBRect.bottom        =  m_oRect.bottom;
  362. }
  363. // 获取控件所在矩形区域
  364. RECT& CUIBaseCtrl::GetRect(void)
  365. {
  366.         return m_oRect;
  367. }       
  368. // 获取工作区域矩形
  369. RECT& CUIBaseCtrl::GetWorkRect(void)
  370. {
  371.         return m_oWockRect;
  372. }                                                                                                       
  373. // 获取控件宽度
  374. int        CUIBaseCtrl::GetWidth(void)
  375. {
  376.          return (m_oRect.right - m_oRect.left);
  377. }
  378. // 获取控件高度
  379. int        CUIBaseCtrl::GetHeight(void)
  380. {
  381.         return (m_oRect.bottom - m_oRect.top);
  382. }                                                                                                               
  383. // 获取顶点X
  384. int CUIBaseCtrl::GetXVertex(void)
  385. {
  386.         return  m_oRect.left;
  387. }
  388. // 获取顶点Y
  389. int CUIBaseCtrl::GetYVertex(void)
  390. {
  391.         return  m_oRect.top;
  392. }                                                                                                               
  393. // 设置控件边框
  394. void CUIBaseCtrl::SetBorderSize(int aiBorderSize)
  395. {
  396.         m_iBorderSize = aiBorderSize;
  397.         Invalidate();
  398. }       
  399. // 获取控件边框
  400. int         CUIBaseCtrl::GetBorderSize(void)
  401. {
  402.         return m_iBorderSize;
  403. }
  404. // 设置控件圆角
  405. void CUIBaseCtrl::SetBorderRound(SIZE asBorderRound)
  406. {
  407.         m_cxyBorderRound.cx = asBorderRound.cx;
  408.         m_cxyBorderRound.cy = asBorderRound.cy;
  409.         Invalidate();
  410. }
  411. // 获取控件圆角
  412. SIZE CUIBaseCtrl::GetBorderRound(void)
  413. {
  414.         return m_cxyBorderRound;
  415. }               
  416. // 设置窗体圆角
  417. void CUIBaseCtrl::SetWndRound(int aiRound)
  418. {
  419.         m_iRound = aiRound;
  420.         SIZE liSize;
  421.         liSize.cx = m_iRound;
  422.         liSize.cy = m_iRound;
  423.         SetBorderRound(liSize);
  424. }
  425. // 获取窗体圆角
  426. int CUIBaseCtrl::GetWndRound(void)
  427. {
  428.         return m_iRound;
  429. }
  430. // 增加子控件
  431. BOOL CUIBaseCtrl::AddChildCtrl(CUIBaseCtrl* apCtrl)
  432. {
  433.         if (!apCtrl)
  434.             return FALSE;
  435.         m_pChildCtrlSet.Insert(apCtrl);
  436.         apCtrl->SetParentCtrl(this);
  437.         return TRUE;
  438. }       
  439. // 设置父控件
  440. BOOL CUIBaseCtrl::SetParentCtrl(CUIBaseCtrl* apParentCtrl)
  441. {
  442.         if (! apParentCtrl)
  443.                 return FALSE;
  444.         m_pParentCtrl = apParentCtrl;
  445.         return TRUE;
  446. }               
  447. // 获取父控件
  448. CUIBaseCtrl*        CUIBaseCtrl::GetParentCtrl(void)
  449. {
  450.         return m_pParentCtrl;
  451. }
  452. // 设置控件数据
  453. void CUIBaseCtrl::SetData(unsigned char* apData)
  454. {
  455.         m_pData = apData;
  456. }       
  457. // 获取控件数据
  458. UInt8* CUIBaseCtrl::GetData(void) const
  459. {
  460.         return m_pData;
  461. }
  462. // 设置窗口是否最大化
  463. void CUIBaseCtrl::SetMaxSize(BOOL abIsMaxSize)
  464. {
  465.         m_bIsMaxSize = abIsMaxSize;
  466.         if (m_pParentCtrl)
  467.                 m_pParentCtrl->SetMaxSize(abIsMaxSize);
  468. }
  469. // 获取窗口是否最大化
  470. BOOL CUIBaseCtrl::GetMaxSize(void)
  471. {
  472.         return m_bIsMaxSize;
  473. }                                                                                               
  474. void CUIBaseCtrl::SetBkColor(ULong aulBkColor)
  475. {
  476.         m_ulBkColor = aulBkColor;
  477. }
  478. ULong CUIBaseCtrl::GetBkColor(void)
  479. {
  480.         return m_ulBkColor;
  481. }
  482. // 设置背图片
  483. void   CUIBaseCtrl::SetBkImage(TCHAR* apImageName)
  484. {
  485.         if (NULL == apImageName)
  486.                 return;
  487.        
  488.         if (m_pBkImage)
  489.                  delete [] m_pBkImage;
  490.         int liCnt = 0;
  491. #ifdef UNICODE
  492.         liCnt = wcslen(apImageName);
  493. #else
  494.         liCnt = strlen(apImageName);
  495. #endif
  496.         m_pBkImage = new TCHAR[liCnt+1];
  497.         memset(m_pBkImage, 0 , sizeof(TCHAR)* (liCnt+1));
  498.         memcpy(m_pBkImage, apImageName,sizeof(TCHAR)* liCnt);
  499. }       
  500. // 获取背图片
  501. TCHAR* CUIBaseCtrl::GetBkImage(void)
  502. {
  503.         return m_pBkImage;
  504. }               
  505. // 设置状态图片
  506. void   CUIBaseCtrl::SetStatusImage(TCHAR* apImageName)
  507. {
  508.         if (apImageName)
  509.                 m_oStatusImage = apImageName;
  510. }
  511. // 获取状态图片
  512. CStdString& CUIBaseCtrl::GetStatusImage(void)
  513. {
  514.         return m_oStatusImage;
  515. }
  516. // 删除子控件
  517. BOOL CUIBaseCtrl::DelChildCtrl(CUIBaseCtrl* apCtrl)
  518. {
  519.         if (!apCtrl)
  520.                 return FALSE;
  521.         m_pChildCtrlSet.Erase(apCtrl);
  522.         return TRUE;
  523. }       
  524. void CUIBaseCtrl::OnPaint(HDC ahDC, const RECT& aoRect, S_MsgEventUI& apEvent)
  525. {
  526.         //如果没有重叠区域
  527.           if( !::IntersectRect(&m_oRectPrint, &aoRect, &m_oRect))
  528.                 return;
  529.         // 分派给控件
  530.         OnCtrlMsg(apEvent);
  531.         // 如果可见的话再绘制
  532.         if (m_bIsVisiable)
  533.         {
  534.                 // 绘制背景
  535.                 if (m_bPrntBkColor)
  536.                         PaintBkColor(ahDC);
  537.                 // 背景贴图
  538.                 if(m_bPrntBkImage)       
  539.                         PaintBkImage(ahDC);
  540.                 // 状态贴图
  541.                 if(m_bPrntGdiPlusImage)
  542.                         PaintGdiplusImage(ahDC);
  543.                 // 文字
  544.                 if(m_bPrntText)
  545.                         PaintText(ahDC);
  546.                 // 边框
  547.                 if(m_bPrntBorder)
  548.                         PaintBorder(ahDC);
  549.         }
  550.         CUIBaseCtrl* lpChildCtrl = NULL;
  551.         for (int i = m_pChildCtrlSet.Size() -1; i>=0 ; i--)
  552.         {
  553.                 lpChildCtrl = m_pChildCtrlSet[i];
  554.                 if (lpChildCtrl)
  555.                 {
  556.                         apEvent.m_ulCtrlId = lpChildCtrl->GetCtrlID();
  557.                         apEvent.m_pCtrl    = lpChildCtrl;
  558.                         lpChildCtrl->OnPaint(ahDC, aoRect, apEvent);
  559.                 }
  560.         }
  561.         SetFocus(FALSE);
  562. }
  563. // 大小改变时
  564. void CUIBaseCtrl::OnSize(S_MsgEventUI& apEvent)
  565. {
  566.         CUIBaseCtrl* lpChildCtrl = NULL;
  567.         for (int i = m_pChildCtrlSet.Size() -1; i>=0 ; i--)
  568.         {
  569.                 lpChildCtrl = m_pChildCtrlSet[i];
  570.                 if (lpChildCtrl)
  571.                 {
  572.                         apEvent.m_ulCtrlId = lpChildCtrl->GetCtrlID();
  573.                         apEvent.m_pCtrl    = lpChildCtrl;
  574.                         lpChildCtrl->OnSize(apEvent);
  575.                 }
  576.         }
  577. }                                                                       
  578. // 控件广播消息
  579. void CUIBaseCtrl::OnCtrlBroadcast(S_MsgEventUI& apEvent)
  580. {
  581.         CUIBaseCtrl* lpChildCtrl = NULL;
  582.         apEvent.m_ulCtrlId        = m_ulCtrlID;
  583.         apEvent.m_pCtrl                = this;
  584.         OnCtrlMsg(apEvent);
  585.         for (int i = m_pChildCtrlSet.Size() -1; i>=0 ; i--)
  586.         {
  587.                 lpChildCtrl = m_pChildCtrlSet[i];
  588.                 if (lpChildCtrl)
  589.                         lpChildCtrl->OnCtrlBroadcast(apEvent);
  590.         }
  591. }
  592. // 绘制背景
  593. void CUIBaseCtrl::PaintBkColor(HDC ahDC)
  594. {
  595.         if (m_ulBkColor != 0)
  596.                 CRenderEngine::DrawColor(ahDC, m_oRect, m_ulBkColor);
  597. }       
  598. void CUIBaseCtrl::PaintBkImage(HDC hDC)
  599. {
  600.         if (m_pBkImage)
  601.                 DrawImage(hDC, m_pBkImage);
  602. }
  603. // 是否选中
  604. void        CUIBaseCtrl::SetFocus(BOOL abIsFocus)
  605. {
  606.         m_bIsFocus = abIsFocus;
  607. }       
  608. // 绘制图片
  609. BOOL CUIBaseCtrl::DrawImage(HDC hDC, TCHAR* apImageName, LPCTSTR pStrModify/* = NULL*/, int aiNarrow/* = 0*/)
  610. {
  611.         if (aiNarrow)
  612.         {
  613.                 RECT loRect = m_oRect;
  614.                 loRect.left   += aiNarrow;
  615.                 loRect.right  -= aiNarrow;
  616.                 loRect.bottom -= aiNarrow;
  617.                 loRect.top          += aiNarrow;
  618.                 return CRenderEngine::DrawImageString(m_pUIResCache, hDC, loRect, m_oRectPrint,  apImageName,  pStrModify );
  619.         }
  620.         else
  621.                 return CRenderEngine::DrawImageString(m_pUIResCache, hDC, m_oRect, m_oRectPrint,  apImageName,  pStrModify);
  622. }
  623. // 更新
  624. void        CUIBaseCtrl::Invalidate(void)
  625. {  
  626.         ::InvalidateRect(m_hWnd,&m_oRect, TRUE);
  627. }                       
  628.                                                                        
  629. // 绘制状态图
  630. void CUIBaseCtrl::PaintGdiplusImage(HDC hDC)
  631. {
  632.         if (m_bPrntGdiPlusImage)
  633.                 CRenderEngine::DrawImageGdiPlus(m_pUIResCache, hDC, m_oStatusImage,  Gdiplus::RectF(m_oRect.left, m_oRect.top, (m_oRect.right - m_oRect.left), (m_oRect.bottom - m_oRect.top)));
  634. }
  635. // 绘制文字
  636. void CUIBaseCtrl::PaintText(HDC hDC)
  637. {
  638. }
  639. // 绘制边框
  640. void CUIBaseCtrl::PaintBorder(HDC hDC)
  641. {
  642.         if( m_iBorderSize > 0 )
  643.         {
  644.                 if( m_cxyBorderRound.cx > 0 || m_cxyBorderRound.cy > 0 )
  645.                 {
  646.                         if (m_bIsFocus && m_ulFocusBordecCl != 0)
  647.                                 CRenderEngine::DrawRoundRect(hDC, m_oRect, m_iBorderSize, m_cxyBorderRound.cx, m_cxyBorderRound.cy, m_ulFocusBordecCl);
  648.                         else
  649.                                 CRenderEngine::DrawRoundRect(hDC, m_oRect, m_iBorderSize, m_cxyBorderRound.cx, m_cxyBorderRound.cy, m_ulNomalBordecCl);
  650.                 }
  651.                 else
  652.                 {
  653.                           if (m_bIsFocus && m_ulFocusBordecCl != 0)
  654.                                   CRenderEngine::DrawRect(hDC, m_oRect, m_iBorderSize, m_ulFocusBordecCl);
  655.                         else if (m_ulNomalBordecCl != 0)
  656.                                 CRenderEngine::DrawRect(hDC, m_oRect, m_iBorderSize,m_ulNomalBordecCl);       
  657.                 }
  658.         }
  659. }
  660. void CUIBaseCtrl::PaintMoveBorder(HDC hDC)
  661. {
  662.         if (m_bIsInMove)
  663.         {
  664.                 if( m_cxyBorderRound.cx > 0 || m_cxyBorderRound.cy > 0 )
  665.                 {
  666.                         if (m_bIsFocus && m_ulFocusBordecCl != 0)
  667.                                 CRenderEngine::DrawRoundRect(hDC, m_oMovingRect, m_iBorderSize, m_cxyBorderRound.cx, m_cxyBorderRound.cy, m_ulFocusBordecCl);
  668.                         else
  669.                                 CRenderEngine::DrawRoundRect(hDC, m_oMovingRect, m_iBorderSize, m_cxyBorderRound.cx, m_cxyBorderRound.cy, m_ulNomalBordecCl);
  670.                 }
  671.                 else
  672.                 {
  673.                         if (m_bIsFocus && m_ulFocusBordecCl != 0)
  674.                                 CRenderEngine::DrawRect(hDC, m_oMovingRect, m_iBorderSize, m_ulFocusBordecCl);
  675.                         else if (m_ulNomalBordecCl != 0)
  676.                                 CRenderEngine::DrawRect(hDC, m_oMovingRect, m_iBorderSize,m_ulNomalBordecCl);
  677.                 }
  678.         }
  679. }
  680. void CUIBaseCtrl::PaintChangeSize(HDC hDC)
  681. {
  682.         if (m_bInChangeSize)
  683.         {
  684.                 if( m_cxyBorderRound.cx > 0 || m_cxyBorderRound.cy > 0 )
  685.                 {
  686.                         if (m_bIsFocus && m_ulFocusBordecCl != 0)
  687.                                 CRenderEngine::DrawRoundRect(hDC, m_oMovingRect, m_iBorderSize, m_cxyBorderRound.cx, m_cxyBorderRound.cy, m_ulFocusBordecCl);
  688.                         else
  689.                                 CRenderEngine::DrawRoundRect(hDC, m_oMovingRect, m_iBorderSize, m_cxyBorderRound.cx, m_cxyBorderRound.cy, m_ulNomalBordecCl);
  690.                 }
  691.                 else
  692.                 {
  693.                         if (m_bIsFocus && m_ulFocusBordecCl != 0)
  694.                                 CRenderEngine::DrawRect(hDC, m_oMovingRect, m_iBorderSize, m_ulFocusBordecCl);
  695.                         else if (m_ulNomalBordecCl != 0)
  696.                                 CRenderEngine::DrawRect(hDC, m_oMovingRect, m_iBorderSize, m_ulNomalBordecCl);
  697.                 }
  698.         }
  699. }
  700. // 坐标是否在控件区域内
  701. BOOL CUIBaseCtrl::IsPtInCtrlRect(POINT& aoPoint)
  702. {
  703.         return CRenderEngine::IsPtInRect(aoPoint, m_oRect);
  704. }       
  705. // 坐标是否在工作区域内
  706. BOOL CUIBaseCtrl::IsPtInWorkRect(POINT& aoPoint)                                                                                                       
  707. {
  708.         return CRenderEngine::IsPtInRect(aoPoint, m_oWockRect);
  709. }       
  710. // 坐标是否左边框内
  711. BOOL CUIBaseCtrl::IsPtInLRect(POINT& aoPoint)                                                                                                       
  712. {
  713.         return CRenderEngine::IsPtInRect(aoPoint, m_oBordeLRect);
  714. }               
  715. // 坐标是否右边框内
  716. BOOL CUIBaseCtrl::IsPtInRRect(POINT& aoPoint)                                                                                                       
  717. {
  718.         return CRenderEngine::IsPtInRect(aoPoint, m_oBordeRRect);
  719. }
  720. // 坐标是否上边框内
  721. BOOL CUIBaseCtrl::IsPtInTRect(POINT& aoPoint)                                                                                                       
  722. {
  723.         return CRenderEngine::IsPtInRect(aoPoint, m_oBordeTRect);
  724. }
  725. // 坐标是否下边框内
  726. BOOL CUIBaseCtrl::IsPtInBRect(POINT& aoPoint)                                                                                                       
  727. {
  728.         return CRenderEngine::IsPtInRect(aoPoint, m_oBordeBRect);
  729. }
  730. // 坐标是否左顶点
  731. BOOL CUIBaseCtrl::IsPtInLTRect(POINT& aoPoint)                                                                                                       
  732. {
  733.         return CRenderEngine::IsPtInRect(aoPoint, m_oBordeLTRect);
  734. }
  735. // 坐标是否右顶点
  736. BOOL CUIBaseCtrl::IsPtInRTRect(POINT& aoPoint)                                                                                                       
  737. {
  738.         return CRenderEngine::IsPtInRect(aoPoint, m_oBordeRTRect);
  739. }
  740. // 坐标是否上底点
  741. BOOL CUIBaseCtrl::IsPtInLBRect(POINT& aoPoint)                                                                                                       
  742. {
  743.         return CRenderEngine::IsPtInRect(aoPoint, m_oBordeLBRect);
  744. }
  745. // 坐标是否下底点
  746. BOOL CUIBaseCtrl::IsPtInRBRect(POINT& aoPoint)                                                                                                       
  747. {
  748.         return CRenderEngine::IsPtInRect(aoPoint, m_oBordeRBRect);
  749. }
  750. // 找到指定坐标所属的子窗口
  751. CUIBaseCtrl* CUIBaseCtrl::FindCtrl(POINT& aoPoint)
  752. {
  753.         CUIBaseCtrl* lpFindCtrl = NULL;
  754.         // 如果在当前区域内
  755.         if (IsPtInCtrlRect(aoPoint))
  756.         {
  757.                 for (int i = m_pChildCtrlSet.Size() -1; i>=0 ; i--)
  758.                 {
  759.                         lpFindCtrl = m_pChildCtrlSet[i];
  760.                         if (lpFindCtrl)
  761.                                 if (NULL !=  lpFindCtrl->FindCtrl(aoPoint))
  762.                                         return lpFindCtrl->FindCtrl(aoPoint);
  763.                 }
  764.                 return this;
  765.         }
  766.         return NULL;
  767. }
  768. // 获得底层控件
  769. CUIBaseCtrl* CUIBaseCtrl::GetTopCtrl(void)
  770. {
  771.         if (NULL != m_pParentCtrl)
  772.                 return m_pParentCtrl->GetTopCtrl();
  773.         return this;
  774. }
  775.                                                                
  776. // 控件消息分派
  777. void CUIBaseCtrl::OnCtrlMsg(S_MsgEventUI& apEvent)
  778. {
  779.         if (m_pUIResCache)
  780.         {
  781.                 MsgCallBack lpfCBack = m_pUIResCache->GetMsgBack(apEvent.m_ulMsgId, apEvent.m_ulCtrlId);
  782.                 if ((lpfCBack)&&(m_hWinWnd))
  783.                         (m_hWinWnd->*lpfCBack)(apEvent);
  784.         }
  785. }                                                       
  786. // 当鼠标左键落下
  787. void CUIBaseCtrl::OnLButtonDown(S_MsgEventUI& apEvent)
  788. {
  789.         OnCtrlMsg(apEvent);
  790. }
  791. // 当鼠标左键弹起时                                               
  792. void CUIBaseCtrl::OnLButtonUP(S_MsgEventUI& apEvent)
  793. {
  794.         OnCtrlMsg(apEvent);
  795. }               
  796. // 当鼠标左键双击
  797. void CUIBaseCtrl::OnLBuDbClk(S_MsgEventUI& apEvent)
  798. {
  799.         OnCtrlMsg(apEvent);
  800. }
  801. // 当鼠标右键落下
  802. void CUIBaseCtrl::OnRButtonDown(S_MsgEventUI& apEvent)
  803. {
  804.         OnCtrlMsg(apEvent);
  805. }
  806. // 当鼠标右键弹起时
  807. void CUIBaseCtrl::OnRButtonUP(S_MsgEventUI& apEvent)
  808. {
  809.         OnCtrlMsg(apEvent);
  810. }
  811. // 当鼠标右键双击
  812. void CUIBaseCtrl::OnRBuDbClk(S_MsgEventUI& apEvent)
  813. {
  814.         OnCtrlMsg(apEvent);
  815. }                                                                       
  816. void CUIBaseCtrl::OnMouseHover(S_MsgEventUI& apEvent)
  817. {
  818.         OnCtrlMsg(apEvent);
  819. }
  820. void CUIBaseCtrl::OnMouseMove(S_MsgEventUI& apEvent)
  821. {
  822.         OnCtrlMsg(apEvent);
  823. }
  824. void CUIBaseCtrl::OnMouseHit(S_MsgEventUI& apEvent)
  825. {
  826.         OnCtrlMsg(apEvent);
  827. }
  828. // 鼠标移动到
  829. void CUIBaseCtrl::OnMouseLeave(S_MsgEventUI& apEvent)
  830. {
  831.         OnCtrlMsg(apEvent);
  832. }
  833. // 失去焦点
  834. void CUIBaseCtrl::OnKillFocus(S_MsgEventUI& apEvent)
  835. {
  836.         OnCtrlMsg(apEvent);
  837. }
  838. // 开始移动
  839. void CUIBaseCtrl::BegMoveWindow(POINT& aoPtMouse)
  840. {
  841.         // 优先改变
  842.         if (IsPtInWorkRect(aoPtMouse))
  843.         {
  844.                 m_iXmove = aoPtMouse.x;
  845.                 m_iYmove = aoPtMouse.y;
  846.                 m_bIsInMove = TRUE;
  847.         }
  848. }
  849. // 窗口移动
  850. void CUIBaseCtrl::MoveChildWindow(int aiXMove, int aiYMove)
  851. {
  852.         CUIBaseCtrl* lpChildCtrl = NULL;
  853.         CRect loCholdRect;
  854.         for (int i = m_pChildCtrlSet.Size() -1; i>=0 ; i--)
  855.         {
  856.                 lpChildCtrl = m_pChildCtrlSet[i];
  857.                 if (lpChildCtrl)
  858.                 {
  859.                         loCholdRect = lpChildCtrl->GetRect();
  860.                         loCholdRect.left  += aiXMove;
  861.                         loCholdRect.right += aiXMove;
  862.                         loCholdRect.top          += aiYMove;
  863.                         loCholdRect.bottom+= aiYMove;
  864.                         lpChildCtrl->SetRect(loCholdRect);
  865.                         lpChildCtrl->MoveChildWindow(aiXMove, aiYMove);
  866.                 }
  867.         }
  868. }
  869. // 结束移动
  870. void CUIBaseCtrl::EndMoveWindow(POINT& aoPtMouse)
  871. {
  872.         DrawMoveRect(aoPtMouse);
  873.         if((((0 == m_iXmove) && (0 == m_iYmove)) ||
  874.                 ((0 == aoPtMouse.x) && (0 == aoPtMouse.y))))
  875.         { return;}
  876.         RECT loRectUpdate = m_oRect;
  877.         // 平移
  878.         m_iXmove                                =        aoPtMouse.x - m_iXmove;
  879.         m_iYmove                                =        aoPtMouse.y - m_iYmove;
  880.         RECT loCtrlRect                        =        m_oRect;
  881.         loCtrlRect.left                        +=        m_iXmove;
  882.         loCtrlRect.right                +=        m_iXmove;
  883.         loCtrlRect.top                        +=        m_iYmove;
  884.         loCtrlRect.bottom                +=        m_iYmove;
  885.         m_iXmove = 0;
  886.         m_iYmove = 0;
  887.         // 矫正
  888.         RECT loRectParent;
  889.         if (!m_pParentCtrl)
  890.                 ::GetClientRect(m_hWnd, &loRectParent);
  891.         else loRectParent = m_pParentCtrl->GetRect();
  892.         if (loCtrlRect.left < loRectParent.left)                m_iXmove = loRectParent.left        - loCtrlRect.left;
  893.         if (loCtrlRect.right > loRectParent.right)                m_iXmove = loRectParent.right        - loCtrlRect.right;
  894.         if (loCtrlRect.top < loRectParent.top)                        m_iYmove = loRectParent.top                - loCtrlRect.top;
  895.         if (loCtrlRect.bottom > loRectParent.bottom)        m_iYmove = loRectParent.bottom        - loCtrlRect.bottom;
  896.         // 平移
  897.         loCtrlRect.left                += m_iXmove;
  898.         loCtrlRect.right        += m_iXmove;
  899.         loCtrlRect.top                += m_iYmove;
  900.         loCtrlRect.bottom        += m_iYmove;
  901.         // 移动子窗口
  902.         int liXChildMove = loCtrlRect.left  - m_oRect.left;
  903.         int liYChildMove = loCtrlRect.top - m_oRect.top;
  904.         MoveChildWindow(liXChildMove, liYChildMove);
  905.         // 重置控件矩形
  906.         SetRect(loCtrlRect);
  907.        
  908.         loRectUpdate.left     = min(loRectUpdate.left, loCtrlRect.left);
  909.         loRectUpdate.right    = max(loRectUpdate.right, loCtrlRect.right);
  910.         loRectUpdate.top      = min(loRectUpdate.top, loCtrlRect.top        );
  911.         loRectUpdate.bottom   = max(loRectUpdate.bottom,loCtrlRect.bottom);
  912.         // 更新
  913.         ::InvalidateRect(m_hWnd, &loRectUpdate,TRUE);
  914.         m_bIsInMove = FALSE;
  915.         m_liMaxLXmove = 0;
  916.         m_liMaxRXmove = 0;
  917.         m_liMaxUYmove = 0;
  918.         m_liMaxDYmove = 0;       
  919. }       
  920. // 绘制移动时区域
  921. void CUIBaseCtrl::DrawMoveRect(POINT& aoPtMouse)
  922. {
  923.         if((0 == m_iXmove) && (0 == m_iYmove) && (!m_bIsInMove))
  924.         { return;}
  925.         if (m_liMaxLXmove > (aoPtMouse.x - m_iXmove)) m_liMaxLXmove = (aoPtMouse.x - m_iXmove);
  926.         if (m_liMaxRXmove < (aoPtMouse.x - m_iXmove)) m_liMaxRXmove = (aoPtMouse.x - m_iXmove);
  927.         if (m_liMaxUYmove > (aoPtMouse.y - m_iYmove)) m_liMaxUYmove = (aoPtMouse.y - m_iYmove);
  928.         if (m_liMaxDYmove < (aoPtMouse.y - m_iYmove)) m_liMaxDYmove = (aoPtMouse.y - m_iYmove);
  929.         // 平移
  930.         int  liXmove                 = aoPtMouse.x - m_iXmove;
  931.         int  liYmove                 = aoPtMouse.y - m_iYmove;
  932.         m_oMovingRect                 = m_oRect;
  933.         // 矫正
  934.         RECT loRectParent;
  935.         if (!m_pParentCtrl)
  936.                 ::GetClientRect(m_hWnd, &loRectParent);
  937.         else
  938.                 loRectParent = m_pParentCtrl->GetRect();
  939.         if (m_oMovingRect.left < loRectParent.left)                        liXmove = loRectParent.left - m_oMovingRect.left;
  940.         if (m_oMovingRect.right > loRectParent.right)                        liXmove = loRectParent.right - m_oMovingRect.right;
  941.         if (m_oMovingRect.top < loRectParent.top)                                liYmove = loRectParent.top - m_oMovingRect.top;
  942.         if (m_oMovingRect.bottom > loRectParent.bottom)                liYmove = loRectParent.bottom - m_oMovingRect.bottom;
  943.         // 平移
  944.         m_oMovingRect.left                += liXmove;
  945.         m_oMovingRect.right                += liXmove;
  946.         m_oMovingRect.top                += liYmove;
  947.         m_oMovingRect.bottom        += liYmove;
  948.         //
  949.         RECT loRectUpdate = m_oRect;
  950.         loRectUpdate.left   += m_liMaxLXmove;
  951.         loRectUpdate.right  += m_liMaxRXmove;
  952.         loRectUpdate.top    += m_liMaxUYmove;
  953.         loRectUpdate.bottom += m_liMaxDYmove;
  954.         // 更新
  955.         ::InvalidateRect(m_hWnd, &loRectUpdate,TRUE);
  956. }
  957. void CUIBaseCtrl::IsChMouseOnBorder(POINT& aoPtMouse)
  958. {
  959.         // 如果落在非工作区域
  960. //         if ( !IsPtInWorkRect(aoPtMouse))
  961. //         {
  962.                 if (IsPtInLRect(aoPtMouse))
  963.                 {
  964.                         m_eCheckBordType = e_bIsCkLBorder;
  965.                         ::SetCursor(LoadCursor(NULL, IDC_SIZEWE));
  966.                         m_pMouseIcon = IDC_SIZEWE;
  967.                         m_bIsHitBorder  = TRUE;
  968.                 }
  969.                 else if( IsPtInRRect(aoPtMouse))
  970.                 {
  971.                         m_eCheckBordType = e_bIsCkRBorder;
  972.                         ::SetCursor(LoadCursor(NULL, IDC_SIZEWE));
  973.                         m_pMouseIcon = IDC_SIZEWE;
  974.                         m_bIsHitBorder  = TRUE;
  975.                        
  976.                 }
  977.                 else if( IsPtInTRect(aoPtMouse))
  978.                 {
  979.                         m_eCheckBordType = e_bIsCkTBorder;
  980.                         ::SetCursor(LoadCursor(NULL, IDC_SIZENS));
  981.                         m_bIsHitBorder  = TRUE;
  982.                         m_pMouseIcon = IDC_SIZENS;
  983.                 }
  984.                 else if( IsPtInBRect(aoPtMouse))
  985.                 {
  986.                         m_eCheckBordType = e_bIsCkBBorder;
  987.                         ::SetCursor(LoadCursor(NULL, IDC_SIZENS));
  988.                         m_bIsHitBorder  = TRUE;
  989.                         m_pMouseIcon = IDC_SIZENS;
  990.                 }
  991.                 else if( IsPtInLTRect(aoPtMouse))
  992.                 {
  993.                         m_eCheckBordType = e_bIsCkLTBorder;
  994.                         ::SetCursor(LoadCursor(NULL, IDC_SIZENWSE));
  995.                         m_bIsHitBorder  = TRUE;
  996.                         m_pMouseIcon = IDC_SIZENWSE;
  997.                 }
  998.                 else if( IsPtInRTRect(aoPtMouse))
  999.                 {
  1000.                         m_eCheckBordType = e_bIsCkRTBorder;
  1001.                         ::SetCursor(LoadCursor(NULL, IDC_SIZENESW));
  1002.                         m_bIsHitBorder  = TRUE;
  1003.                         m_pMouseIcon = IDC_SIZENESW;
  1004.                 }
  1005.                 else if( IsPtInLBRect(aoPtMouse))
  1006.                 {
  1007.                         m_eCheckBordType = e_bIsCkLBBorder;
  1008.                         ::SetCursor(LoadCursor(NULL, IDC_SIZENESW));
  1009.                         m_bIsHitBorder  = TRUE;
  1010.                         m_pMouseIcon = IDC_SIZENESW;
  1011.                 }
  1012.                 else if( IsPtInRBRect(aoPtMouse))
  1013.                 {
  1014.                         m_eCheckBordType = e_bIsCkRBBorder;
  1015.                         ::SetCursor(LoadCursor(NULL, IDC_SIZENWSE));
  1016.                         m_bIsHitBorder  = TRUE;
  1017.                         m_pMouseIcon = IDC_SIZENWSE;
  1018.                 }
  1019.                 return;
  1020.         //}
  1021.         m_eCheckBordType = e_bIsWorkRange;
  1022.         m_bIsHitBorder   = FALSE;
  1023.         m_pMouseIcon         = NULL;
  1024. }
  1025. // 开始改变
  1026. void CUIBaseCtrl::BegSizeChange(POINT& aoPtMouse)
  1027. {
  1028.         // 如果边框被选中
  1029.         if (m_bIsHitBorder)
  1030.         {
  1031.                 m_iXChange = aoPtMouse.x;
  1032.                 m_iYChange = aoPtMouse.y;
  1033.                 m_bInChangeSize = TRUE;
  1034.                 m_oSCUpDateRect = m_oRect;
  1035.                 ::SetCursor(LoadCursor(NULL, m_pMouseIcon));
  1036.         }
  1037. }
  1038. void CUIBaseCtrl::OnLReSize(int aiXBefore, int aiXAfter, RECT& aoRedressRect, RECT& aoParentRect, int aiBorderSize)
  1039. {
  1040.         if ((aiXAfter - aiXBefore) < 0)
  1041.         {
  1042.                 aoRedressRect.left -= (aiXBefore - aiXAfter);
  1043.                 if(aoRedressRect.left < aoParentRect.left)
  1044.                         aoRedressRect.left = aoParentRect.left;
  1045.         }
  1046.         else
  1047.         {
  1048.                 aoRedressRect.left += (aiXAfter - aiXBefore);
  1049.                 if (aoRedressRect.left > ( aoRedressRect.right - (aiBorderSize*3)))
  1050.                         aoRedressRect.left = ( aoRedressRect.right - (aiBorderSize*3));
  1051.         }
  1052. }
  1053. void CUIBaseCtrl::OnRReSize(int aiXBefore, int aiXAfter, RECT& aoRedressRect, RECT& aoParentRect, int aiBorderSize)
  1054. {
  1055.         if ((aiXAfter - aiXBefore) > 0)
  1056.         {
  1057.                 aoRedressRect.right += (aiXAfter  - aiXBefore);
  1058.                 if (aoRedressRect.right > aoParentRect.right)
  1059.                         aoRedressRect.right = aoParentRect.right;
  1060.         }
  1061.         // 变小了
  1062.         else
  1063.         {
  1064.                 aoRedressRect.right -= (aiXBefore - aiXAfter);
  1065.                 if (aoRedressRect.right < ( aoRedressRect.left + (aiBorderSize*3)))
  1066.                         aoRedressRect.right = ( aoRedressRect.left + (aiBorderSize*3));
  1067.         }
  1068. }
  1069. void CUIBaseCtrl::OnTReSize(int aiYBefore, int aiYAfter, RECT& aoRedressRect, RECT& aoParentRect, int aiBorderSize)
  1070. {
  1071.         if (aiYAfter < aiYBefore)
  1072.         {
  1073.                 aoRedressRect.top += (aiYAfter - aiYBefore);
  1074.                 if (aoRedressRect.top < aoParentRect.top)
  1075.                         aoRedressRect.top = aoParentRect.top;
  1076.         }
  1077.         else
  1078.         {
  1079.                 aoRedressRect.top -= aiYBefore - aiYAfter;
  1080.                 if (aoRedressRect.top > (aoRedressRect.bottom - (aiBorderSize*3)))
  1081.                         aoRedressRect.top = aoRedressRect.bottom - (aiBorderSize*3);
  1082.         }
  1083. }
  1084. void CUIBaseCtrl::OnBReSize(int aiYBefore, int aiYAfter, RECT& aoRedressRect, RECT& aoParentRect, int aiBorderSize)
  1085. {
  1086.         // 变大
  1087.         if (aiYAfter < aiYBefore)
  1088.         {
  1089.                 aoRedressRect.bottom += (aiYAfter - aiYBefore);
  1090.                 if (aoRedressRect.bottom < aoRedressRect.top +  (aiBorderSize*3))
  1091.                         aoRedressRect.bottom = (aoRedressRect.top +  (aiBorderSize*3));
  1092.         }
  1093.         else
  1094.         {
  1095.                 aoRedressRect.bottom += (aiYAfter - aiYBefore);
  1096.                 if (aoRedressRect.bottom > aoParentRect.bottom)
  1097.                         aoRedressRect.bottom = aoParentRect.bottom;
  1098.         }
  1099. }
  1100. //GetDesktopWindow
  1101. //GetWindowRect
  1102. // 绘制变化时区域
  1103. void CUIBaseCtrl::DrawChangeRect(POINT& aoPtMouse)
  1104. {
  1105.         if (!m_bInChangeSize)
  1106.         {
  1107.                 IsChMouseOnBorder(aoPtMouse);
  1108.                 return;
  1109.         }
  1110.         // 设置鼠标状态
  1111.         ::SetCursor(LoadCursor(NULL, m_pMouseIcon));
  1112.         if (!m_pParentCtrl)
  1113.                 ::GetClientRect(m_hWnd, &m_oMovingRect);
  1114.         else
  1115.                 m_oMovingRect = m_oRect;
  1116.         HWND lhTopWnd = NULL;
  1117.         RECT loParentRect;
  1118.         if (m_pParentCtrl)
  1119.         {
  1120.                 loParentRect = m_pParentCtrl->GetRect();
  1121.                 loParentRect.left        += m_pParentCtrl->GetBorderSize();
  1122.                 loParentRect.right        -= m_pParentCtrl->GetBorderSize();
  1123.                 loParentRect.top        += m_pParentCtrl->GetBorderSize();
  1124.                 loParentRect.bottom        += m_pParentCtrl->GetBorderSize();
  1125.         }
  1126.         else
  1127.                 ::GetClientRect(m_hWnd, &loParentRect);
  1128. //         {
  1129. //                 lhTopWnd  = ::GetDesktopWindow();
  1130. //                 ::GetClientRect(lhTopWnd, &loParentRect);
  1131. //         }
  1132.         switch (m_eCheckBordType)
  1133.         {
  1134.         case e_bIsCkLBorder:        // 选中左边框
  1135.                 OnLReSize(m_iXChange, aoPtMouse.x , m_oMovingRect, loParentRect, m_iBorderSize);
  1136.                 break;
  1137.         case e_bIsCkRBorder:        // 选中右边框
  1138.                 OnRReSize(m_iXChange, aoPtMouse.x , m_oMovingRect, loParentRect, m_iBorderSize);
  1139.                 break;               
  1140.         case e_bIsCkTBorder:        // 选中上边框       
  1141.                 OnTReSize(m_iYChange, aoPtMouse.y ,m_oMovingRect, loParentRect, m_iBorderSize);
  1142.                 break;
  1143.         case e_bIsCkBBorder:        // 选中下边框
  1144.                 OnBReSize(m_iYChange, aoPtMouse.y ,m_oMovingRect, loParentRect, m_iBorderSize);
  1145.                 break;
  1146.         case e_bIsCkLTBorder:        // 选中左顶点
  1147.                 OnLReSize(m_iXChange, aoPtMouse.x , m_oMovingRect, loParentRect, m_iBorderSize);
  1148.                 OnTReSize(m_iYChange, aoPtMouse.y ,m_oMovingRect, loParentRect, m_iBorderSize);
  1149.                 break;
  1150.         case e_bIsCkRTBorder:        // 选中右顶点
  1151.                 OnRReSize(m_iXChange, aoPtMouse.x , m_oMovingRect, loParentRect, m_iBorderSize);
  1152.                 OnTReSize(m_iYChange, aoPtMouse.y ,m_oMovingRect, loParentRect, m_iBorderSize);
  1153.                 break;
  1154.         case e_bIsCkLBBorder:        // 选中左底点
  1155.                 OnLReSize(m_iXChange, aoPtMouse.x , m_oMovingRect, loParentRect, m_iBorderSize);
  1156.                 OnBReSize(m_iYChange, aoPtMouse.y ,m_oMovingRect, loParentRect, m_iBorderSize);
  1157.                 break;
  1158.         case e_bIsCkRBBorder:        // 选中右底点
  1159.                 OnRReSize(m_iXChange, aoPtMouse.x , m_oMovingRect, loParentRect, m_iBorderSize);
  1160.                 OnBReSize(m_iYChange, aoPtMouse.y ,m_oMovingRect, loParentRect, m_iBorderSize);
  1161.                 break;
  1162.         default:
  1163.                 {
  1164.                         m_bIsHitBorder  = 0;
  1165.                         m_bInChangeSize = 0;
  1166.                         m_pMouseIcon        = 0;
  1167.                 }
  1168.                 break;
  1169.         }
  1170.         // 更新
  1171.         if (m_oSCUpDateRect.left        > m_oMovingRect.left)
  1172.                 m_oSCUpDateRect.left        =  m_oMovingRect.left;
  1173.         if (m_oSCUpDateRect.right        < m_oMovingRect.right)
  1174.                 m_oSCUpDateRect.right        = m_oMovingRect.right;
  1175.         if (m_oSCUpDateRect.top                > m_oMovingRect.top)
  1176.                 m_oSCUpDateRect.top                = m_oMovingRect.top;
  1177.         if (m_oSCUpDateRect.bottom        < m_oMovingRect.bottom)
  1178.                 m_oSCUpDateRect.bottom        = m_oMovingRect.bottom;
  1179. //           if (lhTopWnd)
  1180. //                   ::InvalidateRect(lhTopWnd, &loParentRect,TRUE);
  1181. //           else
  1182.                 ::InvalidateRect(m_hWnd, &m_oSCUpDateRect,TRUE);
  1183. }
  1184. // 结束改变
  1185. void CUIBaseCtrl::EndSizeChange(POINT& aoPtMouse)
  1186. {
  1187.         if (!m_bInChangeSize)
  1188.         {
  1189.                 IsChMouseOnBorder(aoPtMouse);
  1190.                 return;
  1191.         }
  1192.         // 设置鼠标状态
  1193.         RECT loTempRect = m_oRect;
  1194.         RECT loParentRect;
  1195.         if (m_pParentCtrl)
  1196.         {
  1197.                 loParentRect = m_pParentCtrl->GetRect();
  1198.                 loParentRect.left        += m_pParentCtrl->GetBorderSize();
  1199.                 loParentRect.right        -= m_pParentCtrl->GetBorderSize();
  1200.                 loParentRect.top        += m_pParentCtrl->GetBorderSize();
  1201.                 loParentRect.bottom        += m_pParentCtrl->GetBorderSize();
  1202.         }
  1203.         else ::GetClientRect(m_hWnd, &loParentRect);
  1204.         switch (m_eCheckBordType)
  1205.         {
  1206.         case e_bIsCkLBorder:        // 选中左边框
  1207.                 OnLReSize(m_iXChange, aoPtMouse.x , loTempRect, loParentRect, m_iBorderSize);
  1208.                 break;
  1209.         case e_bIsCkRBorder:        // 选中右边框
  1210.                 OnRReSize(m_iXChange, aoPtMouse.x , loTempRect, loParentRect, m_iBorderSize);
  1211.                 break;               
  1212.         case e_bIsCkTBorder:        // 选中上边框       
  1213.                 OnTReSize(m_iYChange, aoPtMouse.y ,loTempRect, loParentRect, m_iBorderSize);
  1214.                 break;
  1215.         case e_bIsCkBBorder:        // 选中下边框
  1216.                 OnBReSize(m_iYChange, aoPtMouse.y ,loTempRect, loParentRect, m_iBorderSize);
  1217.                 break;
  1218.         case e_bIsCkLTBorder:        // 选中左顶点
  1219.                 OnLReSize(m_iXChange, aoPtMouse.x , loTempRect, loParentRect, m_iBorderSize);
  1220.                 OnTReSize(m_iYChange, aoPtMouse.y ,loTempRect, loParentRect, m_iBorderSize);
  1221.                 break;
  1222.         case e_bIsCkRTBorder:        // 选中右顶点
  1223.                 OnRReSize(m_iXChange, aoPtMouse.x , loTempRect, loParentRect, m_iBorderSize);
  1224.                 OnTReSize(m_iYChange, aoPtMouse.y ,loTempRect, loParentRect, m_iBorderSize);
  1225.                 break;
  1226.         case e_bIsCkLBBorder:        // 选中左底点
  1227.                 OnLReSize(m_iXChange, aoPtMouse.x , loTempRect, loParentRect, m_iBorderSize);
  1228.                 OnBReSize(m_iYChange, aoPtMouse.y ,loTempRect, loParentRect, m_iBorderSize);
  1229.                 break;
  1230.         case e_bIsCkRBBorder:        // 选中右底点
  1231.                 OnRReSize(m_iXChange, aoPtMouse.x , loTempRect, loParentRect, m_iBorderSize);
  1232.                 OnBReSize(m_iYChange, aoPtMouse.y ,loTempRect, loParentRect, m_iBorderSize);
  1233.                 break;
  1234.         default:
  1235.                 break;
  1236.         }
  1237.         // 更新
  1238.         if (m_oSCUpDateRect.left   > loTempRect.left)                m_oSCUpDateRect.left        =  loTempRect.left;
  1239.         if (m_oSCUpDateRect.right  < loTempRect.right)                m_oSCUpDateRect.right        =  loTempRect.right;
  1240.         if (m_oSCUpDateRect.top           > loTempRect.top)                m_oSCUpDateRect.top                =  loTempRect.top;
  1241.         if (m_oSCUpDateRect.bottom < loTempRect.bottom)            m_oSCUpDateRect.bottom        =  loTempRect.bottom;
  1242.         SetRect(loTempRect);
  1243.         m_bIsHitBorder  = 0;
  1244.         m_bInChangeSize = 0;
  1245.         m_pMouseIcon        = 0;
  1246.         ::InvalidateRect(m_hWnd, &m_oSCUpDateRect,TRUE);
  1247. }       
  1248. void CUIBaseCtrl::OnMaxRestore(void)
  1249. {
  1250.         if (m_pParentCtrl)
  1251.                 m_pParentCtrl->OnMaxRestore();
  1252.         else
  1253.         {
  1254.                 if (SW_MAXIMIZE == m_iStytle )
  1255.                 {
  1256.                         m_iStytle = SW_RESTORE;
  1257.                         ::MoveWindow( m_hWnd, m_oRectBefore.left,
  1258.                                           m_oRectBefore.top,
  1259.                                                   m_oRectBefore.right  - m_oRectBefore.left,
  1260.                                                   m_oRectBefore.bottom - m_oRectBefore.top,
  1261.                                                   TRUE);
  1262.                         m_iStytle = SW_RESTORE;
  1263.                 }
  1264.                 else
  1265.                 {
  1266.                         m_iStytle = SW_MAXIMIZE;
  1267.                         RECT        Screen;
  1268.                         GetWindowRect(m_hWnd,&m_oRectBefore);
  1269.                         SystemParametersInfo(SPI_GETWORKAREA,0,&Screen,0);
  1270.                         ::MoveWindow( m_hWnd, Screen.left,
  1271.                                               Screen.top,
  1272.                                                   Screen.right,
  1273.                                               Screen.bottom,
  1274.                                                   TRUE);
  1275.                 }
  1276.         }
  1277. }
  1278. int CUIBaseCtrl::GetStytle(void)
  1279. {
  1280.         if (NULL != m_pParentCtrl)
  1281.                 return m_pParentCtrl->GetStytle();
  1282.         return m_iStytle;
  1283. }
  1284. void CUIBaseCtrl::OnOCMCommand(S_MsgEventUI& apEvent)
  1285. {
  1286. }
  1287. void CUIBaseCtrl::SetWndText(TCHAR* apText)
  1288. {
  1289.         if (apText)
  1290.                 m_strWinText = apText;
  1291. }
  1292. 代码实现的很烂,稍后再做调整和优化,目前的目标,就是实现功能。由此基类派生出具体的控件,目前可以使用的包括: CUIAreaCtrl      区域
  1293. CUIPicAreaCtrl   图片区域
  1294. CUIButtonCtrl    按钮
  1295. CUIProgressCtrl  进度条
  1296. CUITextCtrl&nbsp 文本框
  1297. CUITitleBarCtrl  台头
  1298. CUITreeCtrl      树 --- 进行中ing
  1299. 其中也CUITreeCtrl 的实现较为复杂,现在还在进行中,其具体定义如下:  /* CLASS_BEGIN *****************************************************
  1300.    类名:CUITreeCtrl
  1301.    功能:树控件
  1302.    说嘛:目前用链表实现了这颗树是否合理有待验证
  1303.    CLASS_END  ******************************************************/
  1304. #ifndef H_UITREECTRL_H
  1305. #define H_UITREECTRL_H
  1306. #include "UIBaseCtrl.h"
  1307. // 节点状态
  1308. enum E_TNodeStatu
  1309. {
  1310.         e_Statu_Shrink        = 0,        // 收缩状态
  1311.         e_Statu_Stretch,                // 伸展状态
  1312.         e_Statu_Hide,                        // 隐藏状态
  1313. };
  1314. class CUITreeCtrl;
  1315. // 树节点
  1316. class CUITreeNodeCtrl : public CUIBaseCtrl
  1317. {
  1318. public:
  1319.         CUITreeNodeCtrl(CUICache* apCache, CWinWnd* apWinWnd);
  1320.         ~CUITreeNodeCtrl(void);
  1321. public:
  1322.         // 设置Y顶点位置
  1323.         int SetYVertex(SInt32 aiYVertex);
  1324.         // 设置节点高度
  1325.         void SetNodeHigth(SInt32 aiNodeHigth);
  1326.         // 获取节点高度
  1327.         SInt32 GetNodeHigth(void);
  1328.         // 绘制
  1329.         virtual void OnPaint(HDC ahDC, const RECT& aoRect, S_MsgEventUI& apEvent);     
  1330. protected:
  1331.         // 绘制背景
  1332.         virtual void PaintBkColor(HDC ahDC);       
  1333.         // 绘制背景图片
  1334.         virtual void PaintBkImage(HDC ahDC);
  1335.         // 绘制状态图
  1336.         virtual void PaintGdiplusImage(HDC hDC);
  1337.         // 绘制文字
  1338.         virtual void PaintText(HDC hDC);
  1339.         // 绘制边框
  1340.         virtual void PaintBorder(HDC hDC);                                                                                               
  1341. private:       
  1342.         friend class CUITreeCtrl;
  1343.         SInt32                                                                        m_iNodeHigth;                        // 节点高度
  1344.         SInt32                                                                        m_iYVertex;                                // Y顶点位置
  1345.         E_TNodeStatu                                                        m_eTNodeStatu;                        // 节点状态
  1346.         CUITreeNodeCtrl*                                                m_pNodeUp;                                // 上一个节点
  1347.         CUITreeNodeCtrl*                                                m_pNodeDown;                        // 下一个节点
  1348.         CUITreeCtrl*                                                        m_pChildTree;                        // 节点可以连接子树
  1349.         BOOL                                                                        m_bIsChoose;                        // 是否被选中
  1350. };
  1351. // 树控件
  1352. class CUITreeCtrl : public CUIBaseCtrl
  1353. {
  1354. public:
  1355.         CUITreeCtrl(CUICache* apCache, CWinWnd* apWinWnd);
  1356.         ~CUITreeCtrl(void);
  1357.         friend class CUITreeNodeCtrl;
  1358. public:
  1359.         // 增加节点到指定节点上方
  1360.         CUITreeNodeCtrl* AddNodeUp(CUITreeNodeCtrl* apConnectNode/* = NULL*/);
  1361.         // 增加节点到指定节点下方
  1362.         CUITreeNodeCtrl* AddNodeDown(CUITreeNodeCtrl* apConnectNode/* = NULL*/);
  1363.         // 增加子节点到指定节点下方
  1364.         CUITreeNodeCtrl* AddNodeChild(CUITreeNodeCtrl* apConnectNode/* = NULL*/);
  1365.         // 删除指定节点
  1366.         BOOL DeleteNode(CUITreeNodeCtrl*& apChildNode);
  1367.         // 检查子节点是否属于
  1368.         BOOL IsCTNode(CUITreeNodeCtrl* apChildTNode, CUITreeNodeCtrl* apFaterNode);
  1369.         // 查询子树
  1370.         CUITreeCtrl* FindChildTree(CUITreeNodeCtrl* apCurNode);
  1371.         // 查询首节点
  1372.         CUITreeNodeCtrl* FindHeadNode(void);
  1373.         // 查询尾节点
  1374.         CUITreeNodeCtrl* FindTailNode(void);
  1375.         // 查询下一个节点
  1376.         CUITreeNodeCtrl* FindUpNode(CUITreeNodeCtrl* apCurNode);
  1377.         // 查询下一个节点
  1378.         CUITreeNodeCtrl* FindDownNode(CUITreeNodeCtrl* apCurNode);
  1379.         // 重新计算所有节点的位置
  1380.         int ResetNodePos(int aiStartPos = 0);
  1381.         // 绘制
  1382.         virtual void OnPaint(HDC ahDC, const RECT& aoRect, S_MsgEventUI& apEvent);
  1383.         // 计算控件大小
  1384.         void CacuRectSize(RECT& loWorkRect);
  1385. private:
  1386.         //        首节点
  1387.         CUITreeNodeCtrl*                                                m_pHeadNodeCtrl;
  1388.         //        尾节点
  1389.         CUITreeNodeCtrl*                                                m_pTailNodeCtrl;
  1390.         //  线程安全
  1391.         CThreadLock                                                                m_oTreeLock;
  1392.         //  是否是顶层控件
  1393.         BOOL                                                                        m_bIsTopCtrl;
  1394. };
  1395. #endif//H_UITREECTRL_H
复制代码
由于没有想到好的方式来处理树的底层数据结构, 目前采用的是双向链表 + 子链表的方式来实现, 待完成后看看效率是否达标吧。

http://blog.csdn.net/jptaozhantaozhan/article/details/7242451

您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-23 03:47 , Processed in 0.032097 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表