Files
2017-05-30 22:09:10 +08:00

1052 lines
25 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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_nBorderStyle(PS_SOLID),
m_nTooltipWidth(300)
{
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(RECT));
::ZeroMemory(&m_rcItem, sizeof(RECT));
::ZeroMemory(&m_rcPaint, sizeof(RECT));
::ZeroMemory(&m_rcBorderSize,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();
}
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)
{
CDuiString strTemp(pstrText);
strTemp.Replace(_T("<n>"),_T("\r\n"));
m_sToolTip=strTemp;
}
void CControlUI::SetToolTipWidth( int nWidth )
{
m_nTooltipWidth=nWidth;
}
int CControlUI::GetToolTipWidth( void )
{
return m_nTooltipWidth;
}
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));
RECT rcPadding = {0};
SetBorderSize(rcPadding);
}
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 ))//��Բ�DZ߿�
{
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;
}
int CControlUI::GetLeftBorderSize() const
{
return m_rcBorderSize.left;
}
void CControlUI::SetLeftBorderSize( int nSize )
{
m_rcBorderSize.left = nSize;
Invalidate();
}
int CControlUI::GetTopBorderSize() const
{
return m_rcBorderSize.top;
}
void CControlUI::SetTopBorderSize( int nSize )
{
m_rcBorderSize.top = nSize;
Invalidate();
}
int CControlUI::GetRightBorderSize() const
{
return m_rcBorderSize.right;
}
void CControlUI::SetRightBorderSize( int nSize )
{
m_rcBorderSize.right = nSize;
Invalidate();
}
int CControlUI::GetBottomBorderSize() const
{
return m_rcBorderSize.bottom;
}
void CControlUI::SetBottomBorderSize( int nSize )
{
m_rcBorderSize.bottom = nSize;
Invalidate();
}
int CControlUI::GetBorderStyle() const
{
return m_nBorderStyle;
}
void CControlUI::SetBorderStyle( int nStyle )
{
m_nBorderStyle = nStyle;
Invalidate();
}
} // namespace DuiLib