#ifndef __UICONTROL_H__ #define __UICONTROL_H__ #pragma once namespace DuiLib { ///////////////////////////////////////////////////////////////////////////////////// // typedef CControlUI* (CALLBACK* FINDCONTROLPROC)(CControlUI*, LPVOID); class UILIB_API CControlUI { public: CControlUI(); virtual ~CControlUI(); public: virtual CDuiString GetName() const; virtual void SetName(LPCTSTR pstrName); virtual LPCTSTR GetClass() const; virtual LPVOID GetInterface(LPCTSTR pstrName); virtual UINT GetControlFlags() const; virtual bool Activate(); virtual CPaintManagerUI* GetManager() const; virtual void SetManager(CPaintManagerUI* pManager, CControlUI* pParent, bool bInit = true); virtual CControlUI* GetParent() const; // 文本相关 virtual CDuiString GetText() const; virtual void SetText(LPCTSTR pstrText); // 图形相关 DWORD GetBkColor() const; void SetBkColor(DWORD dwBackColor); DWORD GetBkColor2() const; void SetBkColor2(DWORD dwBackColor); DWORD GetBkColor3() const; void SetBkColor3(DWORD dwBackColor); LPCTSTR GetBkImage(); void SetBkImage(LPCTSTR pStrImage); DWORD GetFocusBorderColor() const; void SetFocusBorderColor(DWORD dwBorderColor); bool IsColorHSL() const; void SetColorHSL(bool bColorHSL); SIZE GetBorderRound() const; void SetBorderRound(SIZE cxyRound); bool DrawImage(HDC hDC, LPCTSTR pStrImage, LPCTSTR pStrModify = NULL); //边框相关 int GetBorderSize() const; void SetBorderSize(int nSize); DWORD GetBorderColor() const; void SetBorderColor(DWORD dwBorderColor); void SetBorderSize(RECT rc); int GetLeftBorderSize() const; void SetLeftBorderSize(int nSize); int GetTopBorderSize() const; void SetTopBorderSize(int nSize); int GetRightBorderSize() const; void SetRightBorderSize(int nSize); int GetBottomBorderSize() const; void SetBottomBorderSize(int nSize); int GetBorderStyle() const; void SetBorderStyle(int nStyle); // 位置相关 virtual const RECT& GetPos() const; virtual void SetPos(RECT rc); virtual int GetWidth() const; virtual int GetHeight() const; virtual int GetX() const; virtual int GetY() const; virtual RECT GetPadding() const; virtual void SetPadding(RECT rcPadding); // 设置外边距,由上层窗口绘制 virtual SIZE GetFixedXY() const; // 实际大小位置使用GetPos获取,这里得到的是预设的参考值 virtual void SetFixedXY(SIZE szXY); // 仅float为true时有效 virtual int GetFixedWidth() const; // 实际大小位置使用GetPos获取,这里得到的是预设的参考值 virtual void SetFixedWidth(int cx); // 预设的参考值 virtual int GetFixedHeight() const; // 实际大小位置使用GetPos获取,这里得到的是预设的参考值 virtual void SetFixedHeight(int cy); // 预设的参考值 virtual int GetMinWidth() const; virtual void SetMinWidth(int cx); virtual int GetMaxWidth() const; virtual void SetMaxWidth(int cx); virtual int GetMinHeight() const; virtual void SetMinHeight(int cy); virtual int GetMaxHeight() const; virtual void SetMaxHeight(int cy); virtual void SetRelativePos(SIZE szMove,SIZE szZoom); virtual void SetRelativeParentSize(SIZE sz); virtual TRelativePosUI GetRelativePos() const; virtual bool IsRelativePos() const; // 鼠标提示 virtual CDuiString GetToolTip() const; virtual void SetToolTip(LPCTSTR pstrText); // 快捷键 virtual TCHAR GetShortcut() const; virtual void SetShortcut(TCHAR ch); // 菜单 virtual bool IsContextMenuUsed() const; virtual void SetContextMenuUsed(bool bMenuUsed); // 用户属性 virtual const CDuiString& GetUserData(); // 辅助函数,供用户使用 virtual void SetUserData(LPCTSTR pstrText); // 辅助函数,供用户使用 virtual UINT_PTR GetTag() const; // 辅助函数,供用户使用 virtual void SetTag(UINT_PTR pTag); // 辅助函数,供用户使用 // 一些重要的属性 virtual bool IsVisible() const; virtual void SetVisible(bool bVisible = true); virtual void SetInternVisible(bool bVisible = true); // 仅供内部调用,有些UI拥有窗口句柄,需要重写此函数 virtual bool IsEnabled() const; virtual void SetEnabled(bool bEnable = true); virtual bool IsMouseEnabled() const; virtual void SetMouseEnabled(bool bEnable = true); virtual bool IsKeyboardEnabled() const; virtual void SetKeyboardEnabled(bool bEnable = true); virtual bool IsFocused() const; virtual void SetFocus(); virtual bool IsFloat() const; virtual void SetFloat(bool bFloat = true); virtual CControlUI* FindControl(FINDCONTROLPROC Proc, LPVOID pData, UINT uFlags); void Invalidate(); bool IsUpdateNeeded() const; void NeedUpdate(); void NeedParentUpdate(); DWORD GetAdjustColor(DWORD dwColor); virtual void Init(); virtual void DoInit(); virtual void Event(TEventUI& event); virtual void DoEvent(TEventUI& event); virtual void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue); CControlUI* ApplyAttributeList(LPCTSTR pstrList); virtual SIZE EstimateSize(SIZE szAvailable); virtual void DoPaint(HDC hDC, const RECT& rcPaint); virtual void PaintBkColor(HDC hDC); virtual void PaintBkImage(HDC hDC); virtual void PaintStatusImage(HDC hDC); virtual void PaintText(HDC hDC); virtual void PaintBorder(HDC hDC); virtual void DoPostPaint(HDC hDC, const RECT& rcPaint); //虚拟窗口参数 void SetVirtualWnd(LPCTSTR pstrValue); CDuiString GetVirtualWnd() const; public: CEventSource OnInit; CEventSource OnDestroy; CEventSource OnSize; CEventSource OnEvent; CEventSource OnNotify; protected: CPaintManagerUI* m_pManager; CControlUI* m_pParent; CDuiString m_sVirtualWnd; CDuiString m_sName; bool m_bUpdateNeeded; bool m_bMenuUsed; RECT m_rcItem; RECT m_rcPadding; SIZE m_cXY; SIZE m_cxyFixed; SIZE m_cxyMin; SIZE m_cxyMax; bool m_bVisible; bool m_bInternVisible; bool m_bEnabled; bool m_bMouseEnabled; bool m_bKeyboardEnabled ; bool m_bFocused; bool m_bFloat; bool m_bSetPos; // 防止SetPos循环调用 TRelativePosUI m_tRelativePos; CDuiString m_sText; CDuiString m_sToolTip; TCHAR m_chShortcut; CDuiString m_sUserData; UINT_PTR m_pTag; DWORD m_dwBackColor; DWORD m_dwBackColor2; DWORD m_dwBackColor3; CDuiString m_sBkImage; CDuiString m_sForeImage; DWORD m_dwBorderColor; DWORD m_dwFocusBorderColor; bool m_bColorHSL; int m_nBorderSize; int m_nBorderStyle; SIZE m_cxyBorderRound; RECT m_rcPaint; RECT m_rcBorderSize; }; } // namespace DuiLib #endif // __UICONTROL_H__
#include "StdAfx.h" namespace DuiLib { CControlUI::CControlUI() : m_pManager(NULL), m_pParent(NULL), m_bUpdateNeeded(true), m_bMenuUsed(false), m_bVisible(true), m_bInternVisible(true), m_bFocused(false), m_bEnabled(true), m_bMouseEnabled(true), m_bKeyboardEnabled(true), m_bFloat(false), m_bSetPos(false), m_chShortcut('\0'), m_pTag(NULL), m_dwBackColor(0), m_dwBackColor2(0), m_dwBackColor3(0), m_dwBorderColor(0), m_dwFocusBorderColor(0), m_bColorHSL(false), m_nBorderSize(0) { m_cXY.cx = m_cXY.cy = 0; m_cxyFixed.cx = m_cxyFixed.cy = 0; m_cxyMin.cx = m_cxyMin.cy = 0; m_cxyMax.cx = m_cxyMax.cy = 9999; m_cxyBorderRound.cx = m_cxyBorderRound.cy = 0; ::ZeroMemory(&m_rcPadding, sizeof(m_rcPadding)); ::ZeroMemory(&m_rcItem, sizeof(RECT)); ::ZeroMemory(&m_rcPaint, sizeof(RECT)); ::ZeroMemory(&m_tRelativePos, sizeof(TRelativePosUI)); } CControlUI::~CControlUI() { if( OnDestroy ) OnDestroy(this); if( m_pManager != NULL ) m_pManager->ReapObjects(this); } CDuiString CControlUI::GetName() const { return m_sName; } void CControlUI::SetName(LPCTSTR pstrName) { m_sName = pstrName; } LPVOID CControlUI::GetInterface(LPCTSTR pstrName) { if( _tcscmp(pstrName, DUI_CTR_CONTROL) == 0 ) return this; return NULL; } LPCTSTR CControlUI::GetClass() const { return _T("ControlUI"); } UINT CControlUI::GetControlFlags() const { return 0; } bool CControlUI::Activate() { if( !IsVisible() ) return false; if( !IsEnabled() ) return false; return true; } CPaintManagerUI* CControlUI::GetManager() const { return m_pManager; } void CControlUI::SetManager(CPaintManagerUI* pManager, CControlUI* pParent, bool bInit) { m_pManager = pManager; m_pParent = pParent; if( bInit && m_pParent ) Init(); } CControlUI* CControlUI::GetParent() const { return m_pParent; } CDuiString CControlUI::GetText() const { return m_sText; } void CControlUI::SetText(LPCTSTR pstrText) { if( m_sText == pstrText ) return; m_sText = pstrText; Invalidate(); } DWORD CControlUI::GetBkColor() const { return m_dwBackColor; } void CControlUI::SetBkColor(DWORD dwBackColor) { if( m_dwBackColor == dwBackColor ) return; m_dwBackColor = dwBackColor; Invalidate(); } DWORD CControlUI::GetBkColor2() const { return m_dwBackColor2; } void CControlUI::SetBkColor2(DWORD dwBackColor) { if( m_dwBackColor2 == dwBackColor ) return; m_dwBackColor2 = dwBackColor; Invalidate(); } DWORD CControlUI::GetBkColor3() const { return m_dwBackColor3; } void CControlUI::SetBkColor3(DWORD dwBackColor) { if( m_dwBackColor3 == dwBackColor ) return; m_dwBackColor3 = dwBackColor; Invalidate(); } LPCTSTR CControlUI::GetBkImage() { return m_sBkImage; } void CControlUI::SetBkImage(LPCTSTR pStrImage) { if( m_sBkImage == pStrImage ) return; m_sBkImage = pStrImage; Invalidate(); } DWORD CControlUI::GetBorderColor() const { return m_dwBorderColor; } void CControlUI::SetBorderColor(DWORD dwBorderColor) { if( m_dwBorderColor == dwBorderColor ) return; m_dwBorderColor = dwBorderColor; Invalidate(); } DWORD CControlUI::GetFocusBorderColor() const { return m_dwFocusBorderColor; } void CControlUI::SetFocusBorderColor(DWORD dwBorderColor) { if( m_dwFocusBorderColor == dwBorderColor ) return; m_dwFocusBorderColor = dwBorderColor; Invalidate(); } bool CControlUI::IsColorHSL() const { return m_bColorHSL; } void CControlUI::SetColorHSL(bool bColorHSL) { if( m_bColorHSL == bColorHSL ) return; m_bColorHSL = bColorHSL; Invalidate(); } int CControlUI::GetBorderSize() const { return m_nBorderSize; } void CControlUI::SetBorderSize(int nSize) { if( m_nBorderSize == nSize ) return; m_nBorderSize = nSize; Invalidate(); } //************************************ // 函数名称: SetBorderSize // 返回类型: void // 参数信息: RECT rc // 函数说明: //************************************ void CControlUI::SetBorderSize( RECT rc ) { m_rcBorderSize = rc; Invalidate(); } SIZE CControlUI::GetBorderRound() const { return m_cxyBorderRound; } void CControlUI::SetBorderRound(SIZE cxyRound) { m_cxyBorderRound = cxyRound; Invalidate(); } bool CControlUI::DrawImage(HDC hDC, LPCTSTR pStrImage, LPCTSTR pStrModify) { return CRenderEngine::DrawImageString(hDC, m_pManager, m_rcItem, m_rcPaint, pStrImage, pStrModify); } const RECT& CControlUI::GetPos() const { return m_rcItem; } void CControlUI::SetPos(RECT rc) { if( rc.right < rc.left ) rc.right = rc.left; if( rc.bottom < rc.top ) rc.bottom = rc.top; CDuiRect invalidateRc = m_rcItem; if( ::IsRectEmpty(&invalidateRc) ) invalidateRc = rc; m_rcItem = rc; if( m_pManager == NULL ) return; if( !m_bSetPos ) { m_bSetPos = true; if( OnSize ) OnSize(this); m_bSetPos = false; } if( m_bFloat ) { CControlUI* pParent = GetParent(); if( pParent != NULL ) { RECT rcParentPos = pParent->GetPos(); if( m_cXY.cx >= 0 ) m_cXY.cx = m_rcItem.left - rcParentPos.left; else m_cXY.cx = m_rcItem.right - rcParentPos.right; if( m_cXY.cy >= 0 ) m_cXY.cy = m_rcItem.top - rcParentPos.top; else m_cXY.cy = m_rcItem.bottom - rcParentPos.bottom; m_cxyFixed.cx = m_rcItem.right - m_rcItem.left; m_cxyFixed.cy = m_rcItem.bottom - m_rcItem.top; } } m_bUpdateNeeded = false; invalidateRc.Join(m_rcItem); CControlUI* pParent = this; RECT rcTemp; RECT rcParent; while( pParent = pParent->GetParent() ) { rcTemp = invalidateRc; rcParent = pParent->GetPos(); if( !::IntersectRect(&invalidateRc, &rcTemp, &rcParent) ) { return; } } m_pManager->Invalidate(invalidateRc); } int CControlUI::GetWidth() const { return m_rcItem.right - m_rcItem.left; } int CControlUI::GetHeight() const { return m_rcItem.bottom - m_rcItem.top; } int CControlUI::GetX() const { return m_rcItem.left; } int CControlUI::GetY() const { return m_rcItem.top; } RECT CControlUI::GetPadding() const { return m_rcPadding; } void CControlUI::SetPadding(RECT rcPadding) { m_rcPadding = rcPadding; NeedParentUpdate(); } SIZE CControlUI::GetFixedXY() const { return m_cXY; } void CControlUI::SetFixedXY(SIZE szXY) { m_cXY.cx = szXY.cx; m_cXY.cy = szXY.cy; if( !m_bFloat ) NeedParentUpdate(); else NeedUpdate(); } int CControlUI::GetFixedWidth() const { return m_cxyFixed.cx; } void CControlUI::SetFixedWidth(int cx) { if( cx < 0 ) return; m_cxyFixed.cx = cx; if( !m_bFloat ) NeedParentUpdate(); else NeedUpdate(); } int CControlUI::GetFixedHeight() const { return m_cxyFixed.cy; } void CControlUI::SetFixedHeight(int cy) { if( cy < 0 ) return; m_cxyFixed.cy = cy; if( !m_bFloat ) NeedParentUpdate(); else NeedUpdate(); } int CControlUI::GetMinWidth() const { return m_cxyMin.cx; } void CControlUI::SetMinWidth(int cx) { if( m_cxyMin.cx == cx ) return; if( cx < 0 ) return; m_cxyMin.cx = cx; if( !m_bFloat ) NeedParentUpdate(); else NeedUpdate(); } int CControlUI::GetMaxWidth() const { return m_cxyMax.cx; } void CControlUI::SetMaxWidth(int cx) { if( m_cxyMax.cx == cx ) return; if( cx < 0 ) return; m_cxyMax.cx = cx; if( !m_bFloat ) NeedParentUpdate(); else NeedUpdate(); } int CControlUI::GetMinHeight() const { return m_cxyMin.cy; } void CControlUI::SetMinHeight(int cy) { if( m_cxyMin.cy == cy ) return; if( cy < 0 ) return; m_cxyMin.cy = cy; if( !m_bFloat ) NeedParentUpdate(); else NeedUpdate(); } int CControlUI::GetMaxHeight() const { return m_cxyMax.cy; } void CControlUI::SetMaxHeight(int cy) { if( m_cxyMax.cy == cy ) return; if( cy < 0 ) return; m_cxyMax.cy = cy; if( !m_bFloat ) NeedParentUpdate(); else NeedUpdate(); } void CControlUI::SetRelativePos(SIZE szMove,SIZE szZoom) { m_tRelativePos.bRelative = TRUE; m_tRelativePos.nMoveXPercent = szMove.cx; m_tRelativePos.nMoveYPercent = szMove.cy; m_tRelativePos.nZoomXPercent = szZoom.cx; m_tRelativePos.nZoomYPercent = szZoom.cy; } void CControlUI::SetRelativeParentSize(SIZE sz) { m_tRelativePos.szParent = sz; } TRelativePosUI CControlUI::GetRelativePos() const { return m_tRelativePos; } bool CControlUI::IsRelativePos() const { return m_tRelativePos.bRelative; } CDuiString CControlUI::GetToolTip() const { return m_sToolTip; } void CControlUI::SetToolTip(LPCTSTR pstrText) { m_sToolTip = pstrText; } TCHAR CControlUI::GetShortcut() const { return m_chShortcut; } void CControlUI::SetShortcut(TCHAR ch) { m_chShortcut = ch; } bool CControlUI::IsContextMenuUsed() const { return m_bMenuUsed; } void CControlUI::SetContextMenuUsed(bool bMenuUsed) { m_bMenuUsed = bMenuUsed; } const CDuiString& CControlUI::GetUserData() { return m_sUserData; } void CControlUI::SetUserData(LPCTSTR pstrText) { m_sUserData = pstrText; } UINT_PTR CControlUI::GetTag() const { return m_pTag; } void CControlUI::SetTag(UINT_PTR pTag) { m_pTag = pTag; } bool CControlUI::IsVisible() const { return m_bVisible && m_bInternVisible; } void CControlUI::SetVisible(bool bVisible) { if( m_bVisible == bVisible ) return; bool v = IsVisible(); m_bVisible = bVisible; if( m_bFocused ) m_bFocused = false; if (!bVisible && m_pManager && m_pManager->GetFocus() == this) { m_pManager->SetFocus(NULL) ; } if( IsVisible() != v ) { NeedParentUpdate(); } } void CControlUI::SetInternVisible(bool bVisible) { m_bInternVisible = bVisible; if (!bVisible && m_pManager && m_pManager->GetFocus() == this) { m_pManager->SetFocus(NULL) ; } } bool CControlUI::IsEnabled() const { return m_bEnabled; } void CControlUI::SetEnabled(bool bEnabled) { if( m_bEnabled == bEnabled ) return; m_bEnabled = bEnabled; Invalidate(); } bool CControlUI::IsMouseEnabled() const { return m_bMouseEnabled; } void CControlUI::SetMouseEnabled(bool bEnabled) { m_bMouseEnabled = bEnabled; } bool CControlUI::IsKeyboardEnabled() const { return m_bKeyboardEnabled ; } void CControlUI::SetKeyboardEnabled(bool bEnabled) { m_bKeyboardEnabled = bEnabled ; } bool CControlUI::IsFocused() const { return m_bFocused; } void CControlUI::SetFocus() { if( m_pManager != NULL ) m_pManager->SetFocus(this); } bool CControlUI::IsFloat() const { return m_bFloat; } void CControlUI::SetFloat(bool bFloat) { if( m_bFloat == bFloat ) return; m_bFloat = bFloat; NeedParentUpdate(); } CControlUI* CControlUI::FindControl(FINDCONTROLPROC Proc, LPVOID pData, UINT uFlags) { if( (uFlags & UIFIND_VISIBLE) != 0 && !IsVisible() ) return NULL; if( (uFlags & UIFIND_ENABLED) != 0 && !IsEnabled() ) return NULL; if( (uFlags & UIFIND_HITTEST) != 0 && (!m_bMouseEnabled || !::PtInRect(&m_rcItem, * static_cast<LPPOINT>(pData))) ) return NULL; return Proc(this, pData); } void CControlUI::Invalidate() { if( !IsVisible() ) return; RECT invalidateRc = m_rcItem; CControlUI* pParent = this; RECT rcTemp; RECT rcParent; while( pParent = pParent->GetParent() ) { rcTemp = invalidateRc; rcParent = pParent->GetPos(); if( !::IntersectRect(&invalidateRc, &rcTemp, &rcParent) ) { return; } } if( m_pManager != NULL ) m_pManager->Invalidate(invalidateRc); } bool CControlUI::IsUpdateNeeded() const { return m_bUpdateNeeded; } void CControlUI::NeedUpdate() { if( !IsVisible() ) return; m_bUpdateNeeded = true; Invalidate(); if( m_pManager != NULL ) m_pManager->NeedUpdate(); } void CControlUI::NeedParentUpdate() { if( GetParent() ) { GetParent()->NeedUpdate(); GetParent()->Invalidate(); } else { NeedUpdate(); } if( m_pManager != NULL ) m_pManager->NeedUpdate(); } DWORD CControlUI::GetAdjustColor(DWORD dwColor) { if( !m_bColorHSL ) return dwColor; short H, S, L; CPaintManagerUI::GetHSL(&H, &S, &L); return CRenderEngine::AdjustColor(dwColor, H, S, L); } void CControlUI::Init() { DoInit(); if( OnInit ) OnInit(this); } void CControlUI::DoInit() { } void CControlUI::Event(TEventUI& event) { if( OnEvent(&event) ) DoEvent(event); } void CControlUI::DoEvent(TEventUI& event) { if( event.Type == UIEVENT_SETCURSOR ) { ::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW))); return; } if( event.Type == UIEVENT_SETFOCUS ) { m_bFocused = true; Invalidate(); return; } if( event.Type == UIEVENT_KILLFOCUS ) { m_bFocused = false; Invalidate(); return; } if( event.Type == UIEVENT_TIMER ) { m_pManager->SendNotify(this, DUI_MSGTYPE_TIMER, event.wParam, event.lParam); return; } if( event.Type == UIEVENT_CONTEXTMENU ) { if( IsContextMenuUsed() ) { m_pManager->SendNotify(this, DUI_MSGTYPE_MENU, event.wParam, event.lParam); return; } } if( m_pParent != NULL ) m_pParent->DoEvent(event); } void CControlUI::SetVirtualWnd(LPCTSTR pstrValue) { m_sVirtualWnd = pstrValue; m_pManager->UsedVirtualWnd(true); } CDuiString CControlUI::GetVirtualWnd() const { CDuiString str; if( !m_sVirtualWnd.IsEmpty() ){ str = m_sVirtualWnd; } else{ CControlUI* pParent = GetParent(); if( pParent != NULL){ str = pParent->GetVirtualWnd(); } else{ str = _T(""); } } return str; } void CControlUI::SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue) { if( _tcscmp(pstrName, _T("pos")) == 0 ) { RECT rcPos = { 0 }; LPTSTR pstr = NULL; rcPos.left = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr); rcPos.top = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr); rcPos.right = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr); rcPos.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr); SIZE szXY = {rcPos.left >= 0 ? rcPos.left : rcPos.right, rcPos.top >= 0 ? rcPos.top : rcPos.bottom}; SetFixedXY(szXY); SetFixedWidth(rcPos.right - rcPos.left); SetFixedHeight(rcPos.bottom - rcPos.top); } else if( _tcscmp(pstrName, _T("relativepos")) == 0 ) { SIZE szMove,szZoom; LPTSTR pstr = NULL; szMove.cx = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr); szMove.cy = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr); szZoom.cx = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr); szZoom.cy = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr); SetRelativePos(szMove,szZoom); } else if( _tcscmp(pstrName, _T("padding")) == 0 ) { RECT rcPadding = { 0 }; LPTSTR pstr = NULL; rcPadding.left = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr); rcPadding.top = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr); rcPadding.right = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr); rcPadding.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr); SetPadding(rcPadding); } else if( _tcscmp(pstrName, _T("bkcolor")) == 0 || _tcscmp(pstrName, _T("bkcolor1")) == 0 ) { while( *pstrValue > _T('\0') && *pstrValue <= _T(' ') ) pstrValue = ::CharNext(pstrValue); if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue); LPTSTR pstr = NULL; DWORD clrColor = _tcstoul(pstrValue, &pstr, 16); SetBkColor(clrColor); } else if( _tcscmp(pstrName, _T("bkcolor2")) == 0 ) { while( *pstrValue > _T('\0') && *pstrValue <= _T(' ') ) pstrValue = ::CharNext(pstrValue); if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue); LPTSTR pstr = NULL; DWORD clrColor = _tcstoul(pstrValue, &pstr, 16); SetBkColor2(clrColor); } else if( _tcscmp(pstrName, _T("bkcolor3")) == 0 ) { while( *pstrValue > _T('\0') && *pstrValue <= _T(' ') ) pstrValue = ::CharNext(pstrValue); if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue); LPTSTR pstr = NULL; DWORD clrColor = _tcstoul(pstrValue, &pstr, 16); SetBkColor3(clrColor); } else if( _tcscmp(pstrName, _T("bordercolor")) == 0 ) { if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue); LPTSTR pstr = NULL; DWORD clrColor = _tcstoul(pstrValue, &pstr, 16); SetBorderColor(clrColor); } else if( _tcscmp(pstrName, _T("focusbordercolor")) == 0 ) { if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue); LPTSTR pstr = NULL; DWORD clrColor = _tcstoul(pstrValue, &pstr, 16); SetFocusBorderColor(clrColor); } else if( _tcscmp(pstrName, _T("colorhsl")) == 0 ) SetColorHSL(_tcscmp(pstrValue, _T("true")) == 0); else if( _tcscmp(pstrName, _T("bordersize")) == 0 ) { CDuiString nValue = pstrValue; if(nValue.Find(',') < 0) SetBorderSize(_ttoi(pstrValue)); else { RECT rcPadding = { 0 }; LPTSTR pstr = NULL; rcPadding.left = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr); rcPadding.top = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr); rcPadding.right = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr); rcPadding.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr); SetBorderSize(rcPadding); } } else if( _tcscmp(pstrName, _T("leftbordersize")) == 0 ) SetLeftBorderSize(_ttoi(pstrValue)); else if( _tcscmp(pstrName, _T("topbordersize")) == 0 ) SetTopBorderSize(_ttoi(pstrValue)); else if( _tcscmp(pstrName, _T("rightbordersize")) == 0 ) SetRightBorderSize(_ttoi(pstrValue)); else if( _tcscmp(pstrName, _T("bottombordersize")) == 0 ) SetBottomBorderSize(_ttoi(pstrValue)); else if( _tcscmp(pstrName, _T("borderstyle")) == 0 ) SetBorderStyle(_ttoi(pstrValue)); else if( _tcscmp(pstrName, _T("borderround")) == 0 ) { SIZE cxyRound = { 0 }; LPTSTR pstr = NULL; cxyRound.cx = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr); cxyRound.cy = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr); SetBorderRound(cxyRound); } else if( _tcscmp(pstrName, _T("bkimage")) == 0 ) SetBkImage(pstrValue); else if( _tcscmp(pstrName, _T("width")) == 0 ) SetFixedWidth(_ttoi(pstrValue)); else if( _tcscmp(pstrName, _T("height")) == 0 ) SetFixedHeight(_ttoi(pstrValue)); else if( _tcscmp(pstrName, _T("minwidth")) == 0 ) SetMinWidth(_ttoi(pstrValue)); else if( _tcscmp(pstrName, _T("minheight")) == 0 ) SetMinHeight(_ttoi(pstrValue)); else if( _tcscmp(pstrName, _T("maxwidth")) == 0 ) SetMaxWidth(_ttoi(pstrValue)); else if( _tcscmp(pstrName, _T("maxheight")) == 0 ) SetMaxHeight(_ttoi(pstrValue)); else if( _tcscmp(pstrName, _T("name")) == 0 ) SetName(pstrValue); else if( _tcscmp(pstrName, _T("text")) == 0 ) SetText(pstrValue); else if( _tcscmp(pstrName, _T("tooltip")) == 0 ) SetToolTip(pstrValue); else if( _tcscmp(pstrName, _T("userdata")) == 0 ) SetUserData(pstrValue); else if( _tcscmp(pstrName, _T("enabled")) == 0 ) SetEnabled(_tcscmp(pstrValue, _T("true")) == 0); else if( _tcscmp(pstrName, _T("mouse")) == 0 ) SetMouseEnabled(_tcscmp(pstrValue, _T("true")) == 0); else if( _tcscmp(pstrName, _T("keyboard")) == 0 ) SetKeyboardEnabled(_tcscmp(pstrValue, _T("true")) == 0); else if( _tcscmp(pstrName, _T("visible")) == 0 ) SetVisible(_tcscmp(pstrValue, _T("true")) == 0); else if( _tcscmp(pstrName, _T("float")) == 0 ) SetFloat(_tcscmp(pstrValue, _T("true")) == 0); else if( _tcscmp(pstrName, _T("shortcut")) == 0 ) SetShortcut(pstrValue[0]); else if( _tcscmp(pstrName, _T("menu")) == 0 ) SetContextMenuUsed(_tcscmp(pstrValue, _T("true")) == 0); else if( _tcscmp(pstrName, _T("virtualwnd")) == 0 ) SetVirtualWnd(pstrValue); } CControlUI* CControlUI::ApplyAttributeList(LPCTSTR pstrList) { CDuiString sItem; CDuiString sValue; while( *pstrList != _T('\0') ) { sItem.Empty(); sValue.Empty(); while( *pstrList != _T('\0') && *pstrList != _T('=') ) { LPTSTR pstrTemp = ::CharNext(pstrList); while( pstrList < pstrTemp) { sItem += *pstrList++; } } ASSERT( *pstrList == _T('=') ); if( *pstrList++ != _T('=') ) return this; ASSERT( *pstrList == _T('\"') ); if( *pstrList++ != _T('\"') ) return this; while( *pstrList != _T('\0') && *pstrList != _T('\"') ) { LPTSTR pstrTemp = ::CharNext(pstrList); while( pstrList < pstrTemp) { sValue += *pstrList++; } } ASSERT( *pstrList == _T('\"') ); if( *pstrList++ != _T('\"') ) return this; SetAttribute(sItem, sValue); if( *pstrList++ != _T(' ') ) return this; } return this; } SIZE CControlUI::EstimateSize(SIZE szAvailable) { return m_cxyFixed; } void CControlUI::DoPaint(HDC hDC, const RECT& rcPaint) { if( !::IntersectRect(&m_rcPaint, &rcPaint, &m_rcItem) ) return; // 绘制循序:背景颜色->背景图->状态图->文本->边框 if( m_cxyBorderRound.cx > 0 || m_cxyBorderRound.cy > 0 ) { CRenderClip roundClip; CRenderClip::GenerateRoundClip(hDC, m_rcPaint, m_rcItem, m_cxyBorderRound.cx, m_cxyBorderRound.cy, roundClip); PaintBkColor(hDC); PaintBkImage(hDC); PaintStatusImage(hDC); PaintText(hDC); PaintBorder(hDC); } else { PaintBkColor(hDC); PaintBkImage(hDC); PaintStatusImage(hDC); PaintText(hDC); PaintBorder(hDC); } } void CControlUI::PaintBkColor(HDC hDC) { if( m_dwBackColor != 0 ) { if( m_dwBackColor2 != 0 ) { if( m_dwBackColor3 != 0 ) { RECT rc = m_rcItem; rc.bottom = (rc.bottom + rc.top) / 2; CRenderEngine::DrawGradient(hDC, rc, GetAdjustColor(m_dwBackColor), GetAdjustColor(m_dwBackColor2), true, 8); rc.top = rc.bottom; rc.bottom = m_rcItem.bottom; CRenderEngine::DrawGradient(hDC, rc, GetAdjustColor(m_dwBackColor2), GetAdjustColor(m_dwBackColor3), true, 8); } else CRenderEngine::DrawGradient(hDC, m_rcItem, GetAdjustColor(m_dwBackColor), GetAdjustColor(m_dwBackColor2), true, 16); } else if( m_dwBackColor >= 0xFF000000 ) CRenderEngine::DrawColor(hDC, m_rcPaint, GetAdjustColor(m_dwBackColor)); else CRenderEngine::DrawColor(hDC, m_rcItem, GetAdjustColor(m_dwBackColor)); } } void CControlUI::PaintBkImage(HDC hDC) { if( m_sBkImage.IsEmpty() ) return; if( !DrawImage(hDC, (LPCTSTR)m_sBkImage) ) m_sBkImage.Empty(); } void CControlUI::PaintStatusImage(HDC hDC) { return; } void CControlUI::PaintText(HDC hDC) { return; } void CControlUI::PaintBorder(HDC hDC) { if(m_dwBorderColor != 0 || m_dwFocusBorderColor != 0) { if(m_nBorderSize > 0 && ( m_cxyBorderRound.cx > 0 || m_cxyBorderRound.cy > 0 ))//画圆角边框 { if (IsFocused() && m_dwFocusBorderColor != 0) CRenderEngine::DrawRoundRect(hDC, m_rcItem, m_nBorderSize, m_cxyBorderRound.cx, m_cxyBorderRound.cy, GetAdjustColor(m_dwFocusBorderColor)); else CRenderEngine::DrawRoundRect(hDC, m_rcItem, m_nBorderSize, m_cxyBorderRound.cx, m_cxyBorderRound.cy, GetAdjustColor(m_dwBorderColor)); } else { if (IsFocused() && m_dwFocusBorderColor != 0 && m_nBorderSize > 0) CRenderEngine::DrawRect(hDC, m_rcItem, m_nBorderSize, GetAdjustColor(m_dwFocusBorderColor)); else if(m_rcBorderSize.left > 0 || m_rcBorderSize.top > 0 || m_rcBorderSize.right > 0 || m_rcBorderSize.bottom > 0) { RECT rcBorder; if(m_rcBorderSize.left > 0){ rcBorder = m_rcItem; rcBorder.right = m_rcItem.left; CRenderEngine::DrawLine(hDC,rcBorder,m_rcBorderSize.left,GetAdjustColor(m_dwBorderColor),m_nBorderStyle); } if(m_rcBorderSize.top > 0){ rcBorder = m_rcItem; rcBorder.bottom = m_rcItem.top; CRenderEngine::DrawLine(hDC,rcBorder,m_rcBorderSize.top,GetAdjustColor(m_dwBorderColor),m_nBorderStyle); } if(m_rcBorderSize.right > 0){ rcBorder = m_rcItem; rcBorder.left = m_rcItem.right; CRenderEngine::DrawLine(hDC,rcBorder,m_rcBorderSize.right,GetAdjustColor(m_dwBorderColor),m_nBorderStyle); } if(m_rcBorderSize.bottom > 0){ rcBorder = m_rcItem; rcBorder.top = m_rcItem.bottom; CRenderEngine::DrawLine(hDC,rcBorder,m_rcBorderSize.bottom,GetAdjustColor(m_dwBorderColor),m_nBorderStyle); } } else if(m_nBorderSize > 0) CRenderEngine::DrawRect(hDC, m_rcItem, m_nBorderSize, GetAdjustColor(m_dwBorderColor)); } } } void CControlUI::DoPostPaint(HDC hDC, const RECT& rcPaint) { return; } //************************************ // 函数名称: GetLeftBorderSize // 返回类型: int // 函数说明: //************************************ int CControlUI::GetLeftBorderSize() const { return m_rcBorderSize.left; } //************************************ // 函数名称: SetLeftBorderSize // 返回类型: void // 参数信息: int nSize // 函数说明: //************************************ void CControlUI::SetLeftBorderSize( int nSize ) { m_rcBorderSize.left = nSize; Invalidate(); } //************************************ // 函数名称: GetTopBorderSize // 返回类型: int // 函数说明: //************************************ int CControlUI::GetTopBorderSize() const { return m_rcBorderSize.top; } //************************************ // 函数名称: SetTopBorderSize // 返回类型: void // 参数信息: int nSize // 函数说明: //************************************ void CControlUI::SetTopBorderSize( int nSize ) { m_rcBorderSize.top = nSize; Invalidate(); } //************************************ // 函数名称: GetRightBorderSize // 返回类型: int // 函数说明: //************************************ int CControlUI::GetRightBorderSize() const { return m_rcBorderSize.right; } //************************************ // 函数名称: SetRightBorderSize // 返回类型: void // 参数信息: int nSize // 函数说明: //************************************ void CControlUI::SetRightBorderSize( int nSize ) { m_rcBorderSize.right = nSize; Invalidate(); } //************************************ // 函数名称: GetBottomBorderSize // 返回类型: int // 函数说明: //************************************ int CControlUI::GetBottomBorderSize() const { return m_rcBorderSize.bottom; } //************************************ // 函数名称: SetBottomBorderSize // 返回类型: void // 参数信息: int nSize // 函数说明: //************************************ void CControlUI::SetBottomBorderSize( int nSize ) { m_rcBorderSize.bottom = nSize; Invalidate(); } //************************************ // 函数名称: GetBorderStyle // 返回类型: int // 函数说明: //************************************ int CControlUI::GetBorderStyle() const { return m_nBorderStyle; } //************************************ // 函数名称: SetBorderStyle // 返回类型: void // 参数信息: int nStyle // 函数说明: //************************************ void CControlUI::SetBorderStyle( int nStyle ) { m_nBorderStyle = nStyle; Invalidate(); } } // namespace DuiLib