You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

277 lines
8.1 KiB
C++

// XTPSplitterWndTheme.cpp: implementation of the XTPSplitterWndTheme class.
//
// This file is a part of the XTREME CONTROLS MFC class library.
// (c)1998-2012 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Common/XTPColorManager.h"
#include "Common/XTPResourceImage.h"
#include "Common/XTPSystemHelpers.h"
#include "Common/XTPDrawHelpers.h"
#include "../Util/XTPControlTheme.h"
#include "XTPSplitterWnd.h"
#include "XTPSplitterWndTheme.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
enum ESplitType { splitBox, splitBar, splitIntersection, splitBorder };
/////////////////////////////////////////////////////////////////////////////
// CXTPSplitterWndTheme
CXTPSplitterWndTheme::CXTPSplitterWndTheme()
: m_bTabColors(FALSE)
{
}
void CXTPSplitterWndTheme::RefreshMetrics()
{
// set splitter colors.
m_crBack.SetStandardValue(::GetSysColor(COLOR_3DFACE));
m_crOuterBorder.SetStandardValue(::GetSysColor(COLOR_3DHILIGHT), ::GetSysColor(COLOR_3DSHADOW));
m_crInnerBorder.SetStandardValue(::GetSysColor(COLOR_3DFACE), ::GetSysColor(COLOR_WINDOWFRAME));
// set split box colors.
m_crBoxBack = m_crBack;
m_crOuterBoxBorder = m_crOuterBorder;
m_crInnerBoxBorder = m_crInnerBorder;
}
void CXTPSplitterWndTheme::DrawSplitter(CDC* pDC, CXTPSplitterWnd* pSplitter, int nType, const CRect& rectArg)
{
CRect rect = rectArg;
// draw the borders.
switch (nType)
{
case splitBorder:
pDC->Draw3dRect(rect, pSplitter->IsBorderVisible() ? m_crOuterBorder.clrDark : m_crBack, pSplitter->IsBorderVisible() ? m_crOuterBorder.clrLight : m_crBack);
rect.InflateRect(-CX_BORDER, -CY_BORDER);
pDC->Draw3dRect(rect, pSplitter->IsBorderVisible() ? m_crInnerBorder.clrDark : m_crBack, pSplitter->IsBorderVisible() ? m_crInnerBorder.clrLight : m_crBack);
return;
case splitIntersection:
ASSERT(!XTPSystemVersion()->IsWin95OrGreater());
break;
case splitBox:
pDC->Draw3dRect(rect, m_crOuterBoxBorder.clrLight, m_crOuterBoxBorder.clrDark);
rect.InflateRect(-CX_BORDER, -CY_BORDER);
pDC->Draw3dRect(rect, m_crInnerBoxBorder.clrLight, m_crInnerBoxBorder.clrDark);
rect.InflateRect(-CX_BORDER, -CY_BORDER);
pDC->FillSolidRect(&rect, m_crBoxBack.clrDark);
return;
case splitBar:
break;
default:
ASSERT(FALSE); // unknown splitter type
}
// fill the background.
pDC->FillSolidRect(&rect, m_crBack.clrDark);
}
void CXTPSplitterWndTheme::EnableTabColors(BOOL bEnable /*=TRUE*/)
{
m_bTabColors = bEnable;
RefreshMetrics();
}
CBrush* CXTPSplitterWndTheme::GetTrackBrush()
{
return CDC::GetHalftoneBrush();
}
/////////////////////////////////////////////////////////////////////////////
// CXTPSplitterWndThemeOfficeXP
CXTPSplitterWndThemeOfficeXP::CXTPSplitterWndThemeOfficeXP()
{
m_nTheme = xtpControlThemeOfficeXP;
}
void CXTPSplitterWndThemeOfficeXP::RefreshMetrics()
{
// set splitter colors.
m_crBack.SetStandardValue(::GetSysColor(COLOR_3DFACE));
m_crOuterBorder.SetStandardValue(::GetSysColor(COLOR_3DFACE));
m_crInnerBorder.SetStandardValue(::GetSysColor(COLOR_3DHILIGHT), ::GetSysColor(COLOR_3DSHADOW));
// set split box colors.
m_crBoxBack = m_crBack;
m_crOuterBoxBorder.SetStandardValue(::GetSysColor(COLOR_3DHILIGHT), ::GetSysColor(COLOR_3DSHADOW));
m_crInnerBoxBorder.SetStandardValue(::GetSysColor(COLOR_3DFACE));
}
CBrush* CXTPSplitterWndThemeOfficeXP::GetTrackBrush()
{
return CBrush::FromHandle((HBRUSH)::GetStockObject(WHITE_BRUSH));
}
/////////////////////////////////////////////////////////////////////////////
// CXTPSplitterWndThemeOffice2003
CXTPSplitterWndThemeOffice2003::CXTPSplitterWndThemeOffice2003()
{
m_nTheme = xtpControlThemeOffice2003;
}
void CXTPSplitterWndThemeOffice2003::RefreshMetrics()
{
CXTPSplitterWndThemeOfficeXP::RefreshMetrics();
// set splitter colors.
if (!XTPColorManager()->IsLunaColorsDisabled())
{
XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();
switch (systemTheme)
{
case xtpSystemThemeBlue:
case xtpSystemThemeRoyale:
case xtpSystemThemeAero:
m_crBack.SetStandardValue(RGB(165, 195, 255));
m_crOuterBorder.SetStandardValue(RGB(165, 195, 255));
m_crInnerBorder.SetStandardValue(RGB(0, 44, 148));
break;
case xtpSystemThemeOlive:
m_crBack.SetStandardValue(RGB(226, 231, 191));
m_crOuterBorder.SetStandardValue(RGB(226, 231, 191));
m_crInnerBorder.SetStandardValue(RGB(99, 130, 90));
break;
case xtpSystemThemeSilver:
m_crBack.SetStandardValue(RGB(223, 223, 234));
m_crOuterBorder.SetStandardValue(RGB(223, 223, 234));
m_crInnerBorder.SetStandardValue(RGB(123, 125, 148));
break;
}
}
// set split box colors.
m_crBoxBack = m_crBack;
m_crOuterBoxBorder = m_crOuterBorder;
m_crInnerBoxBorder = m_crInnerBorder;
}
void CXTPSplitterWndThemeOffice2003::DrawSplitter(CDC* pDC, CXTPSplitterWnd* pSplitter, int nType, const CRect& rectArg)
{
if (nType == splitBox)
{
// fill the background.
CRect rect = rectArg;
pDC->FillSolidRect(&rect, m_crBoxBack.clrDark);
CXTPPenDC pen(*pDC, m_crInnerBorder.clrDark);
if (rect.Width() > rect.Height())
{
// vSplitterBox
pDC->MoveTo(rect.left,rect.top);
pDC->LineTo(rect.left,rect.bottom-1);
pDC->LineTo(rect.right,rect.bottom-1);
}
else
{
// hSplitterBox
pDC->MoveTo(rect.left,rect.top);
pDC->LineTo(rect.right-1,rect.top);
pDC->LineTo(rect.right-1,rect.bottom);
}
}
else
{
CXTPSplitterWndThemeOfficeXP::DrawSplitter(pDC, pSplitter, nType, rectArg);
}
}
/////////////////////////////////////////////////////////////////////////////
// CXTPSplitterWndThemeResource
CXTPSplitterWndThemeResource::CXTPSplitterWndThemeResource()
{
m_nTheme = xtpControlThemeResource;
}
void CXTPSplitterWndThemeResource::RefreshMetrics()
{
CXTPResourceImages* pImages = XTPResourceImages();
if (pImages)
{
// get colors from resource.
COLORREF crBack = pImages->GetImageColor(_T("Window"), m_bTabColors ? _T("SplitterFaceTab") : _T("SplitterFace"), GetXtremeColor(COLOR_3DFACE));
COLORREF crBorder = pImages->GetImageColor(_T("Window"), m_bTabColors ? _T("SplitterFrameTab") : _T("SplitterFrame"), GetXtremeColor(COLOR_3DSHADOW));
// set splitter colors.
m_crBack.SetStandardValue(crBack);
m_crOuterBorder.SetStandardValue(crBack);
m_crInnerBorder.SetStandardValue(crBorder);
// set split box colors.
m_crBoxBack = m_crBack;
m_crOuterBoxBorder = m_crOuterBorder;
m_crInnerBoxBorder = m_crInnerBorder;
}
else
{
CXTPSplitterWndThemeOfficeXP::RefreshMetrics();
}
}
/////////////////////////////////////////////////////////////////////////////
// CXTPSplitterWndThemeVisualStudio2010
CXTPSplitterWndThemeVisualStudio2010::CXTPSplitterWndThemeVisualStudio2010()
{
m_nTheme = xtpControlThemeVisualStudio2010;
}
void CXTPSplitterWndThemeVisualStudio2010::RefreshMetrics()
{
// set splitter colors.
m_crBack.SetStandardValue(m_bTabColors ? RGB(255, 243, 206) : RGB(173, 186, 206));
m_crOuterBorder.SetStandardValue(m_bTabColors ? RGB(255, 243, 206) : RGB(173, 186, 206));
m_crInnerBorder.SetStandardValue(m_bTabColors ? RGB(255, 243, 206) : RGB(132, 146, 165));
// set split box colors.
m_crBoxBack.SetStandardValue(RGB(208, 215, 226));
m_crOuterBoxBorder.SetStandardValue(m_bTabColors ? RGB(155, 167, 183) : RGB(208, 215, 226));
m_crInnerBoxBorder.SetStandardValue(RGB(208, 215, 226));
}
void CXTPSplitterWndThemeVisualStudio2010::DrawSplitter(CDC* pDC, CXTPSplitterWnd* pSplitter, int nType, const CRect& rectArg)
{
if (m_bTabColors)
{
CXTPSplitterWndThemeOfficeXP::DrawSplitter(pDC, pSplitter, nType, rectArg);
}
else
{
CXTPSplitterWndThemeOffice2003::DrawSplitter(pDC, pSplitter, nType, rectArg);
}
}