// XTPResourceTheme.cpp : implementation of the CXTPResourceTheme class.
//
// This file is a part of the XTREME COMMANDBARS 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/XTPDrawHelpers.h"
#include "Common/XTPResourceImage.h"
#include "Common/XTPHookManager.h"
#include "Common/XTPMarkupRender.h"
#include "Common/XTPResourceManager.h"
#include "Common/XTPSystemHelpers.h"
#include "Common/XTPColorManager.h"
#include "Common/XTPWinThemeWrapper.h"
#include "Common/XTPVC80Helpers.h"
#include "XTPCommandBarsDefines.h"
#include "XTPCommandBar.h"
#include "XTPPopupBar.h"
#include "XTPMessageBar.h"
#include "XTPScrollBase.h"
#include "XTPControls.h"
#include "XTPControl.h"
#include "XTPControlButton.h"
#include "XTPControlPopup.h"
#include "XTPControlGallery.h"
#include "XTPControlProgress.h"
#include "XTPStatusBar.h"
#include "XTPCommandBarsFrameHook.h"
#include "XTPPaintManager.h"
#include "XTPOffice2003Theme.h"
#include "XTPResourceTheme.h"
#ifdef _XTP_INCLUDE_RIBBON
#include "Ribbon/XTPRibbonPaintManager.h"
#endif
#ifndef OIC_WINLOGO
#define OIC_WINLOGO 32517
#endif
#ifndef LAYOUT_BITMAPORIENTATIONPRESERVED
#define LAYOUT_BITMAPORIENTATIONPRESERVED 0x00000008
#endif
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//===========================================================================
// Summary:
// The CXTPControlGalleryResourceTheme class is used to enable a Gallery Office 2007 style theme for Command Bars.
// See Also: CXTPPaintManager::SetTheme
//===========================================================================
class _XTP_EXT_CLASS CXTPControlGalleryResourceTheme : public CXTPControlGalleryPaintManager
{
public:
//-----------------------------------------------------------------------
// Summary: Constructs a CXTPControlGalleryResourceTheme object.
// Input: pPaintManager - Reference to a CXTPPaintManager object.
//-----------------------------------------------------------------------
CXTPControlGalleryResourceTheme(CXTPPaintManager* pPaintManager);
public:
//-----------------------------------------------------------------------
// Summary:
// This method is called to draw background of the gallery
// Parameters:
// pDC - Pointer to device context
// pGallery - CXTPControlGallery object to draw
// rc - Bounding rectangle of gallery object
//-----------------------------------------------------------------------
virtual void FillControl(CDC* pDC, CXTPControlGallery* pGallery, CRect rc);
//-----------------------------------------------------------------------
// Summary:
// This method called to draw scrollbar of inplace gallery
// Parameters:
// pDC - Pointer to device context
// pGallery - CXTPControlGallery object to draw
// See Also: DrawScrollBar
//-----------------------------------------------------------------------
virtual void DrawPopupScrollBar(CDC* pDC, CXTPControlGallery* pGallery);
//-----------------------------------------------------------------------
// Summary:
// This method is called to draw scrollbar of the gallery.
// Parameters:
// pDC - Pointer to device context.
// pGallery - ScrollBar to draw.
//-----------------------------------------------------------------------
virtual void DrawScrollBar(CDC* pDC, CXTPScrollBase* pGallery);
//-----------------------------------------------------------------------
// Summary:
// This method is called to draw label control
// Parameters:
// pDC - Pointer to device context
// pLabel - Label item
// rc - Bounding rectangle of the label
//-----------------------------------------------------------------------
virtual void DrawLabel(CDC* pDC, CXTPControlGalleryItem* pLabel, CRect rc);
//-----------------------------------------------------------------------
// Summary:
// This method is called to refresh the visual metrics of the manager.
//-----------------------------------------------------------------------
virtual void RefreshMetrics();
protected:
COLORREF m_clrControlGallerySelected; // Selected item color.
COLORREF m_clrControlGalleryNormal; // Normal item color.
COLORREF m_clrControlGalleryBorder; // Border color.
};
class _XTP_EXT_CLASS CXTPSliderResourceTheme : public CXTPSliderPaintManager
{
public:
CXTPSliderResourceTheme(CXTPPaintManager* pPaintManager)
: CXTPSliderPaintManager(pPaintManager)
{
}
public:
virtual void DrawScrollBar(CDC* pDC, CXTPScrollBase* pGallery);
virtual void RefreshMetrics();
};
class _XTP_EXT_CLASS CXTPProgressResourceTheme : public CXTPProgressPaintManager
{
public:
CXTPProgressResourceTheme(CXTPPaintManager* pPaintManager);
public:
virtual void DrawProgress(CDC* pDC, CXTPProgressBase* pGallery);
};
IMPLEMENT_DYNAMIC(CXTPResourceTheme, CXTPOffice2003Theme)
CXTPResourceTheme::CXTPResourceTheme()
{
m_pShadowManager->SetShadowOptions(xtpShadowOfficeAlpha | xtpShadowShowPopupControl);
m_systemTheme = xtpSystemThemeUnknown;
m_bThemedStatusBar = TRUE;
m_bOffice2007Padding = TRUE;
delete m_pGalleryPaintManager;
m_pGalleryPaintManager = new CXTPControlGalleryResourceTheme(this);
delete m_pSliderPaintManager;
m_pSliderPaintManager = new CXTPSliderResourceTheme(this);
delete m_pProgressPaintManager;
m_pProgressPaintManager = new CXTPProgressResourceTheme(this);
m_pImages = XTPResourceImages();
}
CXTPFramePaintManager* CXTPResourceTheme::GetFramePaintManager()
{
if (!m_pFramePaintManager)
{
m_pFramePaintManager = new CXTPFramePaintManager(this);
m_pFramePaintManager->RefreshMetrics();
}
return m_pFramePaintManager;
}
CXTPRibbonPaintManager* CXTPResourceTheme::GetRibbonPaintManager()
{
#ifdef _XTP_INCLUDE_RIBBON
if (!m_pRibbonPaintManager)
{
m_pRibbonPaintManager = new CXTPRibbonPaintManager(this);
m_pRibbonPaintManager->RefreshMetrics();
}
#endif
return m_pRibbonPaintManager;
}
CXTPResourceTheme::~CXTPResourceTheme()
{
m_pImages->RemoveAll();
}
CXTPResourceImages* CXTPResourceTheme::GetImages() const
{
return m_pImages;
}
void CXTPResourceTheme::SetImages(CXTPResourceImages* pImages)
{
m_pImages = pImages;
}
void CXTPResourceTheme::SetImageHandle(HMODULE hResource, LPCTSTR lpszIniFileName)
{
GetImages()->SetHandle(hResource, lpszIniFileName);
RefreshMetrics();
}
CXTPResourceImage* CXTPResourceTheme::LoadImage(LPCTSTR lpszFileName)
{
return GetImages()->LoadFile(lpszFileName);
}
BOOL CXTPResourceTheme::IsImagesAvailable()
{
return TRUE;
}
COLORREF CXTPResourceTheme::GetRectangleTextColor(BOOL bSelected, BOOL bPressed, BOOL bEnabled, BOOL bChecked, BOOL bPopuped, XTPBarType barType, XTPBarPosition barPosition)
{
if (barType == xtpBarTypeMenuBar && !bSelected && bEnabled && !bPressed && !bChecked && !bPopuped)
{
return m_clrMenuBarText;
}
return CXTPOffice2003Theme::GetRectangleTextColor(bSelected, bPressed, bEnabled, bChecked, bPopuped, barType, barPosition);
}
void CXTPResourceTheme::RefreshMetrics()
{
CXTPOffice2003Theme::RefreshMetrics();
//////////////////////////////////////////////////////////////////////////
GetImages()->AssertValid();
//////////////////////////////////////////////////////////////////////////
m_clrStatusTextColor = GetImages()->GetImageColor(_T("StatusBar"), _T("StatusBarText"));
m_clrStatusTextGrayColor = GetImages()->GetImageColor(_T("StatusBar"), _T("StatusBarTextGray"));
m_clrStatusBarShadow = GetImages()->GetImageColor(_T("StatusBar"), _T("StatusBarShadow"));
m_clrStatusBarTop.SetStandardValue(GetImages()->GetImageColor(_T("StatusBar"), _T("StatusBarFaceTopLight")),
GetImages()->GetImageColor(_T("StatusBar"), _T("StatusBarFaceTopDark")));
m_clrStatusBarBottom.SetStandardValue(GetImages()->GetImageColor(_T("StatusBar"), _T("StatusBarFaceBottomLight")),
GetImages()->GetImageColor(_T("StatusBar"), _T("StatusBarFaceBottomDark")));
m_clrDockBar.SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("DockBarFace")));
m_clrCommandBar.SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("ToolbarFaceLight")),
GetImages()->GetImageColor(_T("Toolbar"), _T("ToolbarFaceDark")), 0.75f);
m_clrToolbarShadow.SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("ToolbarFaceShadow")));
m_clrToolbarExpand.SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("ControlToolbarExpandLight")),
GetImages()->GetImageColor(_T("Toolbar"), _T("ControlToolbarExpandDark")), 0.75f);
m_clrPopupControl.SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("ControlHighlightPopupedLight")),
GetImages()->GetImageColor(_T("Toolbar"), _T("ControlHighlightPopupedDark")));
m_clrMenuGripper.SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("MenuPopupGripperLight")),
GetImages()->GetImageColor(_T("Toolbar"), _T("MenuPopupGripperDark")));
m_clrMenuExpandedGripper.SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("MenuPopupExpandedGripperLight")),
GetImages()->GetImageColor(_T("Toolbar"), _T("MenuPopupExpandedGripperDark")));
m_clrMenuExpand = m_clrPopupControl;
m_pShadowManager->SetShadowColor(0);
m_clrTearOffGripper.SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("MenuPopupTearOffGripper")));
m_clrMenuBarText = GetImages()->GetImageColor(_T("Toolbar"), _T("MenuBarText"));
m_arrColor[XPCOLOR_MENUBAR_FACE].SetStandardValue(RGB(246, 246, 246));
m_arrColor[XPCOLOR_MENUBAR_BORDER].SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("MenuPopupBorder")));
m_arrColor[XPCOLOR_TOOLBAR_GRIPPER].SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("ToolbarGripper")));
m_arrColor[XPCOLOR_MENUBAR_TEXT].SetStandardValue(0);
m_arrColor[XPCOLOR_HIGHLIGHT_TEXT].SetStandardValue(0);
m_arrColor[XPCOLOR_TOOLBAR_TEXT].SetStandardValue(0);
m_arrColor[XPCOLOR_TOOLBAR_GRAYTEXT].SetStandardValue(RGB(141, 141, 141));
m_arrColor[XPCOLOR_HIGHLIGHT_DISABLED_BORDER].SetStandardValue(RGB(141, 141, 141));
m_arrColor[XPCOLOR_MENUBAR_GRAYTEXT].SetStandardValue(RGB(141, 141, 141));
m_arrColor[XPCOLOR_FRAME].SetStandardValue(GetImages()->GetImageColor(_T("Window"), _T("WindowFrame")));
m_clrFloatingGripper.SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("FloatingBarGripper")));
m_clrFloatingGripperText.SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("FloatingBarGripperText")));
m_arrColor[XPCOLOR_FLOATBAR_BORDER].SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("FloatingBarBorder")));
m_arrColor[COLOR_APPWORKSPACE].SetStandardValue(GetImages()->GetImageColor(_T("Workspace"), _T("AppWorkspace")));
m_arrColor[XPCOLOR_3DFACE].SetStandardValue(GetImages()->GetImageColor(_T("Window"), _T("ButtonFace")));
m_arrColor[XPCOLOR_3DSHADOW].SetStandardValue(m_clrToolbarShadow);
m_arrColor[XPCOLOR_TOOLBAR_FACE].SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("ToolbarFace")));
m_arrColor[XPCOLOR_SEPARATOR].SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("ToolbarSeparator")));
m_arrColor[XPCOLOR_DISABLED].SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("ControlDisabledIcon")));
m_clrWorkspaceClientTop = GetImages()->GetImageColor(_T("Workspace"), _T("WorkspaceClientTop"));
m_clrWorkspaceClientMiddle = GetImages()->GetImageColor(_T("Workspace"), _T("WorkspaceClientMiddle"));
m_clrWorkspaceClientBottom = GetImages()->GetImageColor(_T("Workspace"), _T("WorkspaceClientBottom"));
m_arrColor[XPCOLOR_HIGHLIGHT].SetStandardValue(GetImages()->GetImageColor(_T("Window"), _T("HighlightSelected")));
m_arrColor[XPCOLOR_HIGHLIGHT_BORDER].SetStandardValue(GetImages()->GetImageColor(_T("Window"), _T("HighlightSelectedBorder")));
m_arrColor[XPCOLOR_HIGHLIGHT_PUSHED].SetStandardValue(GetImages()->GetImageColor(_T("Window"), _T("HighlightPressed")));
m_arrColor[XPCOLOR_HIGHLIGHT_PUSHED_BORDER].SetStandardValue(GetImages()->GetImageColor(_T("Window"), _T("HighlightPressedBorder")));
m_arrColor[XPCOLOR_HIGHLIGHT_CHECKED].SetStandardValue(GetImages()->GetImageColor(_T("Window"), _T("HighlightChecked")));
m_arrColor[XPCOLOR_HIGHLIGHT_CHECKED_BORDER].SetStandardValue(GetImages()->GetImageColor(_T("Window"), _T("HighlightCheckedBorder")));
m_arrColor[XPCOLOR_PUSHED_TEXT].SetStandardValue(0);
m_bLunaTheme = TRUE;
m_grcLunaSelected.SetStandardValue(GetImages()->GetImageColor(_T("Window"), _T("HighlightSelectedLight")),
GetImages()->GetImageColor(_T("Window"), _T("HighlightSelectedDark")));
m_grcLunaChecked.SetStandardValue(GetImages()->GetImageColor(_T("Window"), _T("HighlightCheckedLight")),
GetImages()->GetImageColor(_T("Window"), _T("HighlightCheckedDark")));
m_grcLunaPushed.SetStandardValue(GetImages()->GetImageColor(_T("Window"), _T("HighlightPressedLight")),
GetImages()->GetImageColor(_T("Window"), _T("HighlightPressedDark")));
m_arrColor[XPCOLOR_LABEL].SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("ControlLabel")));
m_arrColor[XPCOLOR_EDITCTRLBORDER].SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("ControlEditBorder")));
m_clrDisabledIcon.SetStandardValue(GetImages()->GetImageColor(_T("Toolbar"), _T("ControlDisabledIconLight")),
GetImages()->GetImageColor(_T("Toolbar"), _T("ControlDisabledIconDark")));
m_clrMessageBar.SetStandardValue(GetImages()->GetImageColor(_T("MessageBar"), _T("MessageBarLight")),
GetImages()->GetImageColor(_T("MessageBar"), _T("MessageBarDark")));
m_clrMessageBarFrame = GetImages()->GetImageColor(_T("MessageBar"), _T("MessageBarFrame"));
m_clrMessageBarText = GetImages()->GetImageColor(_T("MessageBar"), _T("MessageBarText"));
m_clrMessageBarFace = GetImages()->GetImageColor(_T("MessageBar"), _T("MessageBar"));
CreateGradientCircle();
}
void CXTPResourceTheme::FillWorkspace(CDC* pDC, CRect rc, CRect rcExclude)
{
CRgn rgn;
rgn.CreateRectRgnIndirect(rc);
pDC->SelectClipRgn(&rgn);
pDC->ExcludeClipRect(rcExclude);
CXTPResourceImage* pImage = LoadImage(_T("WORKSPACETOPLEFT"));
ASSERT(pImage);
if (!pImage)
return;
CRect rcSrc(pImage->GetSource());
CRect rcTopLeft(rc);
rcTopLeft.bottom = rcTopLeft.top + rcSrc.Height();
rcTopLeft.right = rcTopLeft.left + max(rcTopLeft.Width(), rcSrc.Width());
pImage->DrawImage(pDC, rcTopLeft, rcSrc, CRect(rcSrc.Width() - 1, 0, 0, 0));
CRect rcFill(rc.left, rc.top + rcSrc.Height(), rc.right, rc.bottom);
CRect rcFillTop(rcFill.left, rcFill.top, rcFill.right, rcFill.top + rcFill.Height() * 2 / 3);
CRect rcFillBottom(rcFill.left, rcFillTop.bottom, rcFill.right, rcFill.bottom);
XTPDrawHelpers()->GradientFill(pDC, rcFillTop, m_clrWorkspaceClientTop, m_clrWorkspaceClientMiddle, FALSE);
XTPDrawHelpers()->GradientFill(pDC, rcFillBottom, m_clrWorkspaceClientMiddle, m_clrWorkspaceClientBottom, FALSE);
pDC->SelectClipRgn(NULL);
}
void CXTPResourceTheme::FillStatusBar(CDC* pDC, CXTPStatusBar* pBar)
{
CXTPClientRect rc(pBar);
pDC->FillSolidRect(rc.left, rc.top, rc.Width(), 1, m_clrStatusBarShadow);
XTPDrawHelpers()->GradientFill(pDC, CRect(rc.left, rc.top + 1, rc.right, rc.top + 9),
m_clrStatusBarTop, FALSE);
XTPDrawHelpers()->GradientFill(pDC, CRect(rc.left, rc.top + 9, rc.right, rc.bottom),
m_clrStatusBarBottom, FALSE);
}
void CXTPResourceTheme::FillMessageBar(CDC* pDC, CXTPMessageBar* pBar)
{
CXTPClientRect rcClient(pBar);
pDC->FillSolidRect(rcClient, m_clrMessageBarFace);
CRect rcMessage = pBar->GetMessageRect();
pDC->Draw3dRect(rcMessage, m_clrMessageBarFrame, m_clrMessageBarFrame);
rcMessage.DeflateRect(1, 1);
XTPDrawHelpers()->GradientFill(pDC, rcMessage, m_clrMessageBar, FALSE);
}
void CXTPResourceTheme::DrawMessageBarButton(CDC* pDC, CXTPMessageBarButton* pButton)
{
BOOL bCloseButton = (pButton->m_nID == SC_CLOSE);
CRect rc(pButton->m_rcButton);
if (pButton->m_bPressed && bCloseButton)
{
pDC->FillSolidRect(rc, GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED));
pDC->Draw3dRect(rc, GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED_BORDER), GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED_BORDER));
}
else if (pButton->m_bHot)
{
pDC->FillSolidRect(rc, GetXtremeColor(XPCOLOR_HIGHLIGHT));
pDC->Draw3dRect(rc, GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER), GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER));
}
else if (!bCloseButton)
{
pDC->FillSolidRect(rc, 0xFFFFFF);
pDC->Draw3dRect(rc, m_clrMessageBarFrame, m_clrMessageBarFrame);
}
if (bCloseButton)
{
CXTPResourceImage* pImage = LoadImage(_T("FRAMECAPTIONCLOSE17"));
CRect rcSrc(pImage->GetSource(0, 5));
CRect rcGlyph(CPoint((rc.right + rc.left - rcSrc.Width()) / 2, (rc.top + rc.bottom - rcSrc.Height()) / 2), rcSrc.Size());
pImage->DrawImage(pDC, rcGlyph, rcSrc, CRect(0, 0, 0, 0), 0xFF00FF);
}
}
void CXTPResourceTheme::DrawStatusBarPaneBorder(CDC* pDC, CRect rc, CXTPStatusBarPane* /*pPane*/, BOOL bGripperPane)
{
if (!bGripperPane)
{
pDC->FillSolidRect(rc.right - 1, rc.top, 1, rc.Height() - 2, GetXtremeColor(XPCOLOR_SEPARATOR));
pDC->FillSolidRect(rc.right, rc.top, 1, rc.Height() - 2, RGB(255, 255, 255));
}
}
void CXTPResourceTheme::DrawStatusBarGripper(CDC* pDC, CRect rcClient)
{
CPoint pt(rcClient.right - 3, rcClient.bottom - 3);
for (int y = 0; y < 3; y++)
{
for (int x = 0; x < 3 - y; x++)
{
pDC->FillSolidRect(pt.x + 1 - x * 4, pt.y + 1 - y * 4, 2, 2, RGB(255, 255, 255));
pDC->FillSolidRect(pt.x + 0 - x * 4, pt.y + 0 - y * 4, 2, 2, GetXtremeColor(XPCOLOR_SEPARATOR));
}
}
}
//////////////////////////////////////////////////////////////////////////
// CXTPControlGalleryResourceTheme
CXTPControlGalleryResourceTheme::CXTPControlGalleryResourceTheme(CXTPPaintManager* pPaintManager)
: CXTPControlGalleryPaintManager(pPaintManager)
{
}
void CXTPControlGalleryResourceTheme::FillControl(CDC* pDC, CXTPControlGallery* pGallery, CRect rcControl)
{
if (!pGallery->IsTransparent())
{
pDC->FillSolidRect(rcControl,
pGallery->GetParent()->GetPosition() == xtpBarPopup && pGallery->GetParent()->GetType() == xtpBarTypePopup?
m_pPaintManager->GetXtremeColor(XPCOLOR_MENUBAR_FACE) :
pGallery->GetSelected() && pGallery->GetEnabled() ? m_clrControlGallerySelected : m_clrControlGalleryNormal);
}
if (pGallery->IsShowBorders())
{
pDC->Draw3dRect(rcControl, m_clrControlGalleryBorder, m_clrControlGalleryBorder);
}
if (pGallery->HasBottomSeparator())
{
pDC->FillSolidRect(rcControl.left, rcControl.bottom - 2, rcControl.Width(), 1, RGB(197, 197, 197));
}
}
void CXTPControlGalleryResourceTheme::RefreshMetrics()
{
CXTPControlGalleryPaintManager::RefreshMetrics();
m_cxHScroll = GetSystemMetrics(SM_CXHSCROLL);
m_cyHScroll = GetSystemMetrics(SM_CYHSCROLL);
m_cxVScroll = GetSystemMetrics(SM_CXVSCROLL);
m_cyVScroll = GetSystemMetrics(SM_CYVSCROLL);
m_cyPopupUp = 21;
m_cyPopupDown = 19;
CXTPResourceTheme* pPaintManager = (CXTPResourceTheme*)m_pPaintManager;
m_clrControlGallerySelected = pPaintManager->GetImages()->GetImageColor(_T("Toolbar"), _T("ControlGallerySelected"));
m_clrControlGalleryNormal = pPaintManager->GetImages()->GetImageColor(_T("Toolbar"), _T("ControlGalleryNormal"));
m_clrControlGalleryBorder = pPaintManager->GetImages()->GetImageColor(_T("Toolbar"), _T("ControlGalleryBorder"));
}
void CXTPControlGalleryResourceTheme::DrawLabel(CDC* pDC, CXTPControlGalleryItem* pLabel, CRect rcItem)
{
CXTPPaintManager* pPaintManager = m_pPaintManager;
pDC->FillSolidRect(rcItem, pPaintManager->GetXtremeColor(XPCOLOR_LABEL));
pDC->FillSolidRect(rcItem.left, rcItem.bottom - 1, rcItem.Width(), 1, RGB(197, 197, 197));
CXTPFontDC fnt(pDC, pPaintManager->GetRegularBoldFont());
CRect rcText(rcItem);
rcText.DeflateRect(10, 0);
pDC->SetTextColor(pPaintManager->GetXtremeColor(XPCOLOR_MENUBAR_TEXT));
pDC->DrawText(pLabel->GetCaption(), rcText, DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS);
}
void CXTPControlGalleryResourceTheme::DrawPopupScrollBar(CDC* pDC, CXTPControlGallery* pGallery)
{
#define GETPARTSTATE3(ht, bEnabled) \
(!bEnabled ? 4 : nPressetHt == ht ? 3 : nHotHt == ht ? 2 : nHotHt > 0 || nPressetHt > 0 ? 1 : 0)
CXTPControlGallery::SCROLLBARTRACKINFO* pSBTrack = pGallery->GetScrollBarTrackInfo();
CXTPControlGallery::SCROLLBARPOSINFO* pSBInfo = pGallery->GetScrollBarPosInfo();
CRect rcControl = pGallery->GetRect();
CRect rcScroll(rcControl.right - 15, rcControl.top, rcControl.right, rcControl.bottom);
CRect rcScrollUp(rcScroll.left, rcScroll.top, rcScroll.right, rcScroll.top + m_cyPopupUp);
CRect rcScrollDown(rcScroll.left, rcScrollUp.bottom, rcScroll.right, rcScrollUp.bottom + m_cyPopupDown);
CRect rcScrollPopup(rcScroll.left, rcScrollDown.bottom, rcScroll.right, rcScroll.bottom);
CXTPResourceTheme* pPaintManager = (CXTPResourceTheme*)m_pPaintManager;
CXTPResourceImage* pImage = pPaintManager->LoadImage(_T("CONTROLGALLERYUP"));
ASSERT(pImage);
if (!pImage)
return;
BOOL bControlEnabled = pGallery->GetEnabled();
BOOL nPressetHt = pSBTrack ? pSBInfo->ht : -1;
BOOL nHotHt = pSBTrack ? -1 : pSBInfo->ht;
if (nHotHt == HTNOWHERE && nPressetHt == -1 && bControlEnabled && IsKeyboardSelected(pGallery->GetSelected()) && pGallery->GetSelectedItem() == -1)
nHotHt = XTP_HTSCROLLPOPUP;
int nState = GETPARTSTATE3(XTP_HTSCROLLUP, (bControlEnabled && pGallery->IsScrollButtonEnabled(XTP_HTSCROLLUP)));
pImage->DrawImage(pDC, rcScrollUp, pImage->GetSource(nState, 5), CRect(3, 3, 3, 3), 0xFF00FF);
nState = GETPARTSTATE3(XTP_HTSCROLLDOWN, (bControlEnabled && pGallery->IsScrollButtonEnabled(XTP_HTSCROLLDOWN)));
pImage = pPaintManager->LoadImage(_T("CONTROLGALLERYDOWN"));
pImage->DrawImage(pDC, rcScrollDown, pImage->GetSource(nState, 5), CRect(3, 3, 3, 3), 0xFF00FF);
nState = GETPARTSTATE3(XTP_HTSCROLLPOPUP, bControlEnabled);
pImage = pPaintManager->LoadImage(_T("CONTROLGALLERYPOPUP"));
pImage->DrawImage(pDC, rcScrollPopup, pImage->GetSource(nState, 5), CRect(3, 3, 3, 3), 0xFF00FF);
}
AFX_INLINE CRect OffsetSourceRect(CRect rc, int nState)
{
rc.OffsetRect(0, (nState - 1) * rc.Height());
return rc;
}
void CXTPControlGalleryResourceTheme::DrawScrollBar(CDC* pDC, CXTPScrollBase* pGallery)
{
XTPScrollBarStyle barStyle = pGallery->GetScrollBarStyle();
if (barStyle != xtpScrollStyleOffice2007Light && barStyle != xtpScrollStyleOffice2007Dark)
{
CXTPControlGalleryPaintManager::DrawScrollBar(pDC, pGallery);
return;
}
BOOL bLight = (barStyle == xtpScrollStyleOffice2007Light);
#define GETPARTSTATE2(ht) \
(!bEnabled ? 0 : nPressetHt == ht ? 3 : nHotHt == ht ? 2 : nHotHt > 0 || nPressetHt > 0 ? 1 : 0)
CXTPControlGallery::SCROLLBARTRACKINFO* pSBTrack = pGallery->GetScrollBarTrackInfo();
CXTPControlGallery::SCROLLBARPOSINFO* pSBInfo = pGallery->GetScrollBarPosInfo();
BOOL nPressetHt = pSBTrack ? pSBInfo->ht : -1;
BOOL nHotHt = pSBTrack ? -1 : pSBInfo->ht;
int cWidth = (pSBInfo->pxRight - pSBInfo->pxLeft);
if (cWidth <= 0)
{
return;
}
BOOL bEnabled = (pSBInfo->posMax - pSBInfo->posMin - pSBInfo->page + 1 > 0) && pGallery->IsScrollBarEnabled();
int nBtnTrackSize = pSBInfo->pxThumbBottom - pSBInfo->pxThumbTop;
int nBtnTrackPos = pSBInfo->pxThumbTop - pSBInfo->pxUpArrow;
if (!bEnabled || pSBInfo->pxThumbBottom > pSBInfo->pxDownArrow)
nBtnTrackPos = nBtnTrackSize = 0;
CXTPResourceTheme* pPaintManager = (CXTPResourceTheme*)m_pPaintManager;
CXTPResourceImage* pImageArrowGlyphs = NULL;
if (!bLight)
{
pImageArrowGlyphs = pPaintManager->LoadImage(_T("CONTROLGALLERYSCROLLARROWGLYPHSDARK"));
}
if (!pImageArrowGlyphs) pImageArrowGlyphs = pPaintManager->LoadImage(_T("CONTROLGALLERYSCROLLARROWGLYPHS"));
ASSERT(pImageArrowGlyphs);
if (!pImageArrowGlyphs)
return;
CRect rcArrowGripperSrc(0, 0, 9, 9);
if (pSBInfo->fVert)
{
CXTPResourceImage* pImageBackground = pPaintManager->LoadImage(
bLight ? _T("CONTROLGALLERYSCROLLVERTICALLIGHT") : _T("CONTROLGALLERYSCROLLVERTICALDARK"));
ASSERT(pImageBackground);
if (!pImageBackground)
return;
pImageBackground->DrawImage(pDC, pSBInfo->rc, pImageBackground->GetSource(0, 2), CRect(1, 0, 1, 0));
CRect rcVScroll(pSBInfo->rc);
rcVScroll.DeflateRect(1, 0);
CRect rcArrowUp(rcVScroll.left, rcVScroll.top, rcVScroll.right, pSBInfo->pxUpArrow);
CRect rcArrowDown(rcVScroll.left, pSBInfo->pxDownArrow, rcVScroll.right, rcVScroll.bottom);
CXTPResourceImage* pImage = pPaintManager->LoadImage(
bLight ? _T("CONTROLGALLERYSCROLLARROWSVERTICALLIGHT") : _T("CONTROLGALLERYSCROLLARROWSVERTICALDARK"));
ASSERT(pImage);
if (!pImage)
return;
int nState = GETPARTSTATE2(XTP_HTSCROLLUP);
pImage->DrawImage(pDC, rcArrowUp, pImage->GetSource(nState, 4), CRect(3, 3, 3, 3), 0xFF00FF);
CRect rcArrowUpGripper(CPoint((rcArrowUp.left + rcArrowUp.right - 9) / 2, (rcArrowUp.top + rcArrowUp.bottom - 9) / 2), CSize(9, 9));
pImageArrowGlyphs->DrawImage(pDC, rcArrowUpGripper, OffsetSourceRect(rcArrowGripperSrc, !bEnabled ? ABS_UPDISABLED : nState != 0 ? ABS_UPHOT : ABS_UPNORMAL), CRect(0, 0, 0, 0), RGB(255, 0, 255));
nState = GETPARTSTATE2(XTP_HTSCROLLDOWN);
pImage->DrawImage(pDC, rcArrowDown, pImage->GetSource(nState, 4), CRect(3, 3, 3, 3), 0xFF00FF);
CRect rcArrowDownGripper(CPoint((rcArrowDown.left + rcArrowDown.right - 9) / 2, (rcArrowDown.top + rcArrowDown.bottom - 9) / 2), CSize(9, 9));
pImageArrowGlyphs->DrawImage(pDC, rcArrowDownGripper, OffsetSourceRect(rcArrowGripperSrc, !bEnabled ? ABS_DOWNDISABLED : nState != 0 ? ABS_DOWNHOT : ABS_DOWNNORMAL), CRect(0, 0, 0, 0), RGB(255, 0, 255));
CRect rcTrack(rcVScroll.left, rcArrowUp.bottom, rcVScroll.right, rcArrowDown.top);
if (!rcTrack.IsRectEmpty())
{
CRect rcLowerTrack(rcTrack.left - 1, rcTrack.top, rcTrack.right + 1, rcTrack.top + nBtnTrackPos);
CRect rcBtnTrack(rcTrack.left, rcLowerTrack.bottom, rcTrack.right, rcLowerTrack.bottom + nBtnTrackSize);
CRect rcUpperTrack(rcTrack.left - 1, rcBtnTrack.bottom, rcTrack.right + 1, rcTrack.bottom);
if (!rcLowerTrack.IsRectEmpty() && (GETPARTSTATE2(XTP_HTSCROLLUPPAGE) == 3))
{
pImageBackground->DrawImage(pDC, rcLowerTrack,
pImageBackground->GetSource(1, 2), CRect(1, 0, 1, 0));
}
if (!rcBtnTrack.IsRectEmpty())
{
nState = GETPARTSTATE2(XTP_HTSCROLLTHUMB);
if (nState > 0) nState--;
if (!bLight)
{
pImage = pPaintManager->LoadImage(_T("CONTROLGALLERYSCROLLTHUMBVERTICALDARK"));
if (!pImage) pImage = pPaintManager->LoadImage(_T("CONTROLGALLERYSCROLLTHUMBVERTICAL"));
}
else
{
pImage = pPaintManager->LoadImage(_T("CONTROLGALLERYSCROLLTHUMBVERTICAL"));
}
ASSERT(pImage);
if (!pImage)
return;
pImage->DrawImage(pDC, rcBtnTrack, pImage->GetSource(nState, 3), CRect(5, 5, 5, 5));
if (rcBtnTrack.Height() > 10)
{
pImage = pPaintManager->LoadImage(_T("CONTROLGALLERYSCROLLTHUMBGRIPPERVERTICAL"));
CRect rcGripper(CPoint(rcBtnTrack.CenterPoint().x - 4, rcBtnTrack.CenterPoint().y - 4), CSize(8, 8));
pImage->DrawImage(pDC, rcGripper, pImage->GetSource(nState, 3), CRect(0, 0, 0, 0));
}
}
if (!rcUpperTrack.IsRectEmpty() && (GETPARTSTATE2(XTP_HTSCROLLDOWNPAGE) == 3))
{
pImageBackground->DrawImage(pDC, rcUpperTrack,
pImageBackground->GetSource(1, 2), CRect(1, 0, 1, 0));
}
}
}
else
{
CXTPResourceImage* pImageBackground = pPaintManager->LoadImage(
bLight ? _T("CONTROLGALLERYSCROLLHORIZONTALLIGHT") : _T("CONTROLGALLERYSCROLLHORIZONTALDARK"));
if (!pImageBackground)
{
CXTPControlGalleryPaintManager::DrawScrollBar(pDC, pGallery);
return;
}
pImageBackground->DrawImage(pDC, pSBInfo->rc, pImageBackground->GetSource(0, 2), CRect(0, 1, 0, 1));
CRect rcHScroll(pSBInfo->rc);
rcHScroll.DeflateRect(0, 1);
CRect rcArrowLeft(rcHScroll.left, rcHScroll.top, pSBInfo->pxUpArrow, rcHScroll.bottom);
CRect rcArrowRight(pSBInfo->pxDownArrow, rcHScroll.top, rcHScroll.right, rcHScroll.bottom);
CXTPResourceImage* pImage = pPaintManager->LoadImage(
bLight ? _T("CONTROLGALLERYSCROLLARROWSHORIZONTALLIGHT") : _T("CONTROLGALLERYSCROLLARROWSHORIZONTALDARK"));
ASSERT(pImage);
if (!pImage)
return;
int nState = GETPARTSTATE2(XTP_HTSCROLLUP);
pImage->DrawImage(pDC, rcArrowLeft, pImage->GetSource(nState, 4), CRect(3, 3, 3, 3), 0xFF00FF);
CRect rcArrowLeftGripper(CPoint((rcArrowLeft.left + rcArrowLeft.right - 9) / 2, (rcArrowLeft.top + rcArrowLeft.bottom - 9) / 2), CSize(9, 9));
pImageArrowGlyphs->DrawImage(pDC, rcArrowLeftGripper, OffsetSourceRect(rcArrowGripperSrc, !bEnabled ? ABS_LEFTDISABLED : nState != 0 ? ABS_LEFTHOT : ABS_LEFTNORMAL), CRect(0, 0, 0, 0), RGB(255, 0, 255));
nState = GETPARTSTATE2(XTP_HTSCROLLDOWN);
pImage->DrawImage(pDC, rcArrowRight, pImage->GetSource(nState, 4), CRect(3, 3, 3, 3), 0xFF00FF);
CRect rcArrowRightGripper(CPoint((rcArrowRight.left + rcArrowRight.right - 9) / 2, (rcArrowRight.top + rcArrowRight.bottom - 9) / 2), CSize(9, 9));
pImageArrowGlyphs->DrawImage(pDC, rcArrowRightGripper, OffsetSourceRect(rcArrowGripperSrc, !bEnabled ? ABS_RIGHTDISABLED : nState != 0 ? ABS_RIGHTHOT : ABS_RIGHTNORMAL), CRect(0, 0, 0, 0), RGB(255, 0, 255));
CRect rcTrack(rcArrowLeft.right, rcHScroll.top, rcArrowRight.left, rcHScroll.bottom);
if (!rcTrack.IsRectEmpty())
{
CRect rcLowerTrack(rcTrack.left, rcTrack.top - 1, rcTrack.left + nBtnTrackPos, rcTrack.bottom + 1);
CRect rcBtnTrack(rcLowerTrack.right, rcTrack.top, rcLowerTrack.right + nBtnTrackSize, rcTrack.bottom);
CRect rcUpperTrack(rcBtnTrack.right, rcTrack.top - 1, rcTrack.right, rcTrack.bottom + 1);
if (!rcLowerTrack.IsRectEmpty() && (GETPARTSTATE2(XTP_HTSCROLLUPPAGE) == 3))
{
pImageBackground->DrawImage(pDC, rcLowerTrack,
pImageBackground->GetSource(1, 2), CRect(0, 1, 0, 1));
}
if (!rcBtnTrack.IsRectEmpty())
{
nState = GETPARTSTATE2(XTP_HTSCROLLTHUMB);
if (nState > 0) nState--;
if (!bLight)
{
pImage = pPaintManager->LoadImage(_T("CONTROLGALLERYSCROLLTHUMBHORIZONTALDARK"));
if (!pImage) pImage = pPaintManager->LoadImage(_T("CONTROLGALLERYSCROLLTHUMBHORIZONTAL"));
}
else
{
pImage = pPaintManager->LoadImage(_T("CONTROLGALLERYSCROLLTHUMBHORIZONTAL"));
}
ASSERT(pImage);
if (!pImage)
return;
pImage->DrawImage(pDC, rcBtnTrack, pImage->GetSource(nState, 3), CRect(5, 5, 5, 5));
if (rcBtnTrack.Width() > 10)
{
pImage = pPaintManager->LoadImage(_T("CONTROLGALLERYSCROLLTHUMBGRIPPERHORIZONTAL"));
CRect rcGripper(CPoint(rcBtnTrack.CenterPoint().x - 3, rcBtnTrack.CenterPoint().y - 4), CSize(8, 8));
pImage->DrawImage(pDC, rcGripper, pImage->GetSource(nState, 3), CRect(0, 0, 0, 0));
}
}
if (!rcUpperTrack.IsRectEmpty() && (GETPARTSTATE2(XTP_HTSCROLLDOWNPAGE) == 3))
{
pImageBackground->DrawImage(pDC, rcUpperTrack,
pImageBackground->GetSource(1, 2), CRect(0, 1, 0, 1));
}
}
}
}
//////////////////////////////////////////////////////////////////////////
// CXTPControlSliderResourceTheme
void CXTPSliderResourceTheme::RefreshMetrics()
{
CXTPSliderPaintManager::RefreshMetrics();
CXTPResourceImage* pImage = ((CXTPResourceTheme*)m_pPaintManager)->LoadImage(_T("SLIDERUP"));
if (pImage)
{
m_cyHScroll = pImage->GetSource(0, 3).Height();
m_cxHScroll = pImage->GetSource(0, 3).Width();
}
m_cThumb = 11;
}
void CXTPSliderResourceTheme::DrawScrollBar(CDC* pDC, CXTPScrollBase* pGallery)
{
#define GETPARTSTATE4(ht) (nPressetHt == ht ? 2 : nHotHt == ht ? 1 : 0)
CXTPScrollBase::SCROLLBARTRACKINFO* pSBTrack = pGallery->GetScrollBarTrackInfo();
CXTPScrollBase::SCROLLBARPOSINFO* pSBInfo = pGallery->GetScrollBarPosInfo();
BOOL nPressetHt = pSBTrack ? (pSBTrack->bTrackThumb || pSBTrack->fHitOld ? pSBInfo->ht : -1) : -1;
BOOL nHotHt = pSBTrack ? -1 : pSBInfo->ht;
int cWidth = (pSBInfo->pxRight - pSBInfo->pxLeft);
if (cWidth <= 0)
{
return;
}
BOOL bEnabled = (pSBInfo->posMax - pSBInfo->posMin - pSBInfo->page + 1 > 0) && pGallery->IsScrollBarEnabled();
int nBtnTrackSize = pSBInfo->pxThumbBottom - pSBInfo->pxThumbTop;
int nBtnTrackPos = pSBInfo->pxThumbTop - pSBInfo->pxUpArrow;
if (!bEnabled || pSBInfo->pxThumbBottom > pSBInfo->pxDownArrow)
nBtnTrackPos = nBtnTrackSize = 0;
CXTPResourceTheme* pPaintManager = (CXTPResourceTheme*)m_pPaintManager;
if (!pSBInfo->fVert)
{
CRect rcHScroll(pSBInfo->rc);
CRect rcArrowLeft(rcHScroll.left, rcHScroll.top, pSBInfo->pxUpArrow, rcHScroll.bottom);
CRect rcArrowRight(pSBInfo->pxDownArrow, rcHScroll.top, rcHScroll.right, rcHScroll.bottom);
CRect rcTrack(rcArrowLeft.right, rcHScroll.top, rcArrowRight.left, rcHScroll.bottom);
CRect rcBtnTrack(rcTrack.left + nBtnTrackPos, rcTrack.top, rcTrack.left + nBtnTrackPos + nBtnTrackSize, rcTrack.bottom);
CXTPResourceImage* pImage = pPaintManager->LoadImage(_T("SLIDERTRACK"));
ASSERT(pImage);
if (!pImage)
return;
CRect rcTrackDest(CPoint(rcTrack.left, (rcTrack.top + rcTrack.bottom - pImage->GetHeight()) / 2), CSize(rcTrack.Width(), pImage->GetHeight()));
pImage->DrawImage(pDC, rcTrackDest, pImage->GetSource());
pImage = pPaintManager->LoadImage(_T("SLIDERTICK"));
CXTPScrollBase::SLIDERTICKS* pTicks = pGallery->GetTicks();
if (!pTicks || (pSBInfo->posMax <= pSBInfo->posMin))
{
CRect rcTrackTickDest(CPoint((rcTrackDest.left + rcTrackDest.right - pImage->GetWidth()) / 2,
(rcTrackDest.top + rcTrackDest.bottom - pImage->GetHeight()) / 2), pImage->GetExtent());
pImage->DrawImage(pDC, rcTrackTickDest, pImage->GetSource(), CRect(0, 0, 0, 0), 0xFF00FF);
}
else
{
rcTrackDest.DeflateRect(6, 0);
for (int i = 0; i < pTicks->nCount; i++)
{
double dTick = pTicks->pTicks[i];
double dPos = (dTick - pSBInfo->posMin) * rcTrackDest.Width() / (pSBInfo->posMax - pSBInfo->posMin);
if (dPos >= 0 && dPos <= rcTrackDest.Width())
{
CRect rcTrackTickDest(CPoint(rcTrackDest.left + (int)dPos - pImage->GetWidth() / 2,
(rcTrackDest.top + rcTrackDest.bottom - pImage->GetHeight()) / 2), pImage->GetExtent());
pImage->DrawImage(pDC, rcTrackTickDest, pImage->GetSource(), CRect(0, 0, 0, 0), 0xFF00FF);
}
}
}
pImage = pPaintManager->LoadImage(_T("SLIDERUP"));
pImage->DrawImage(pDC, rcArrowLeft, pImage->GetSource(GETPARTSTATE4(XTP_HTSCROLLUP), 3));
pImage = pPaintManager->LoadImage(_T("SLIDERDOWN"));
pImage->DrawImage(pDC, rcArrowRight, pImage->GetSource(GETPARTSTATE4(XTP_HTSCROLLDOWN), 3));
if (bEnabled)
{
pImage = pPaintManager->LoadImage(_T("SLIDERTHUMB"));
CRect rcImgSrc = pImage->GetSource(
nPressetHt == XTP_HTSCROLLTHUMB ? 2 : nPressetHt == XTP_HTSCROLLUPPAGE || nPressetHt == XTP_HTSCROLLDOWNPAGE ||
nHotHt == XTP_HTSCROLLUPPAGE || nHotHt == XTP_HTSCROLLDOWNPAGE || nHotHt == XTP_HTSCROLLTHUMB ? 1 : 0, 3);
CRect rcBtnTrackDest(CPoint((rcBtnTrack.left + rcBtnTrack.right - rcImgSrc.Width()) / 2,
(rcBtnTrack.top + rcBtnTrack.bottom - rcImgSrc.Height()) / 2), rcImgSrc.Size());
pImage->DrawImage(pDC, rcBtnTrackDest, rcImgSrc);
}
}
}
//////////////////////////////////////////////////////////////////////////
// CXTPProgressResourceTheme
CXTPProgressResourceTheme::CXTPProgressResourceTheme(CXTPPaintManager* pPaintManager)
: CXTPProgressPaintManager(pPaintManager)
{
m_cyProgress = 12;
}
void CXTPProgressResourceTheme::DrawProgress(CDC* pDC, CXTPProgressBase* pProgressBar)
{
CXTPResourceTheme* pPaintManager = (CXTPResourceTheme*)m_pPaintManager;
CXTPResourceImage* pImage = pPaintManager->LoadImage(_T("PROGRESSTRACK"));
ASSERT(pImage);
if (!pImage)
return;
CRect rc = pProgressBar->GetProgressRect();
pImage->DrawImage(pDC, rc, pImage->GetSource(), CRect(2, 2, 2, 2), 0xFF00FF);
int nLower, nUpper, nPos;
pProgressBar->GetRange(nLower, nUpper);
nPos = pProgressBar->GetPos();
rc.DeflateRect(2, 2);
int nWidth = rc.Width();
int x = MulDiv(nWidth, nPos - nLower, nUpper - nLower);
pImage = pPaintManager->LoadImage(_T("PROGRESSCHUNK"));
ASSERT(pImage);
if (!pImage)
return;
CRect rcSrc(pImage->GetSource());
rcSrc.right -= 4;
CRect rcDest(rc.left, rc.top, rc.left + x, rc.bottom);
if (rcDest.Width() < rcSrc.Width())
rcSrc.left = rcSrc.right - rcDest.Width();
pImage->DrawImage(pDC, rcDest, rcSrc, CRect(2, 2, 2, 2), 0xFF00FF);
if (rc.left + x < rc.right - 1)
{
int nShadow = min(4, rc.right - rc.left - x);
rcSrc = CRect(rcSrc.right, rcSrc.top, rcSrc.right + nShadow, rcSrc.bottom);
rcDest = CRect(rcDest.right, rcDest.top, rcDest.right + nShadow, rcDest.bottom);
pImage->DrawImage(pDC, rcDest, rcSrc, CRect(0, 2, 0, 2), 0xFF00FF);
return;
}
}
//////////////////////////////////////////////////////////////////////////
// CXTPFramePaintManager
CXTPFramePaintManager::CXTPFramePaintManager(CXTPPaintManager* pPaintManager)
{
m_pPaintManager = pPaintManager;
m_bFrameStatusBar = FALSE;
m_bRoundedCornersAlways = FALSE;
}
CXTPFramePaintManager::~CXTPFramePaintManager()
{
}
HRGN CXTPFramePaintManager::CalcFrameRegion(CXTPCommandBarsFrameHook* pFrameHook, CSize sz)
{
if (pFrameHook->GetSite()->GetStyle() & WS_MAXIMIZE)
{
return NULL;
}
int cx = sz.cx, cy = sz.cy;
RECT rgnTopFrame[] =
{
{4, 0, cx - 4, 1}, {2, 1, cx - 2, 2}, {1, 2, cx - 1, 3}, {1, 3, cx - 1, 4}, {0, 4, cx, cy - 4}
};
RECT rgnRibbonBottomFrame[] =
{
{1, cy - 4, cx - 1, cy - 2}, {2, cy - 2, cx - 2, cy - 1}, {4, cy - 1, cx - 4, cy - 0}
};
RECT rgnSimpleBottomFrame[] =
{
{0, cy - 4, cx, cy}
};
BOOL bHasStatusBar = (m_bRoundedCornersAlways || pFrameHook->IsFrameHasStatusBar()) && pFrameHook->GetFrameBorder() > 3;
int nSizeTopRect = sizeof(rgnTopFrame);
int nSizeBottomRect = bHasStatusBar ? sizeof(rgnRibbonBottomFrame) : sizeof(rgnSimpleBottomFrame);
int nSizeData = sizeof(RGNDATAHEADER) + nSizeTopRect + nSizeBottomRect;
RGNDATA* pRgnData = (RGNDATA*)malloc(nSizeData);
if (!pRgnData)
return NULL;
memcpy(&pRgnData->Buffer, (void*)&rgnTopFrame, nSizeTopRect);
memcpy(&pRgnData->Buffer + nSizeTopRect, bHasStatusBar ? (void*)&rgnRibbonBottomFrame : (void*)&rgnSimpleBottomFrame, nSizeBottomRect);
pRgnData->rdh.dwSize = sizeof(RGNDATAHEADER);
pRgnData->rdh.iType = RDH_RECTANGLES;
pRgnData->rdh.nCount = (nSizeTopRect + nSizeBottomRect) / sizeof(RECT);
pRgnData->rdh.nRgnSize = 0;
pRgnData->rdh.rcBound = CRect(0, 0, cx, cy);
CRgn rgnResult;
VERIFY(rgnResult.CreateFromData(NULL, nSizeData, pRgnData));
free(pRgnData);
return (HRGN)rgnResult.Detach();
}
void CXTPFramePaintManager::DrawCaptionText(CDC* pDC, CRect rcCaptionText, CWnd* pSite, BOOL bActive)
{
CString strWindowText;
CXTPDrawHelpers::GetWindowCaption(pSite->GetSafeHwnd(), strWindowText);
pDC->SetBkMode(TRANSPARENT);
CXTPFontDC font(pDC, &m_fontFrameCaption);
pDC->SetTextColor(!bActive ? m_clrFrameCaptionTextInActive : m_clrFrameCaptionTextActive); //RGB(62, 106, 170));
if (pSite->GetStyle() & FWS_PREFIXTITLE)
{
#if _MSC_VER >= 1200
CFrameWnd* pFrame = pSite->IsFrameWnd() ? (CFrameWnd*)pSite : NULL;
CString strTitle = pFrame ? pFrame->GetTitle() : _T("");
if (!strTitle.IsEmpty() && strWindowText.Right(strTitle.GetLength()) == strTitle & ((pSite->GetExStyle() & WS_EX_LAYOUTRTL) == 0))
{
strWindowText.Delete(strWindowText.GetLength() - strTitle.GetLength(), strTitle.GetLength());
pDC->DrawText(strWindowText, rcCaptionText, DT_VCENTER | DT_LEFT| DT_END_ELLIPSIS | DT_SINGLELINE | DT_NOPREFIX);
int nExtent = pDC->GetTextExtent(strWindowText).cx;
rcCaptionText.left += nExtent + 2;
if (rcCaptionText.left < rcCaptionText.right - 5)
{
if (bActive) pDC->SetTextColor(m_clrFrameCaptionTextActiveTitle);
pDC->DrawText(strTitle, rcCaptionText, DT_VCENTER | DT_LEFT| DT_END_ELLIPSIS | DT_SINGLELINE | DT_NOPREFIX);
}
}
else
#endif
{
pDC->DrawText(strWindowText, rcCaptionText, DT_VCENTER | DT_LEFT| DT_END_ELLIPSIS | DT_SINGLELINE | DT_NOPREFIX);
}
}
else
{
pDC->DrawText(strWindowText, rcCaptionText, DT_VCENTER | DT_LEFT| DT_END_ELLIPSIS | DT_SINGLELINE | DT_NOPREFIX);
}
}
void CXTPFramePaintManager::RefreshMetrics()
{
GetImages()->AssertValid();
m_nFrameCaptionHeight = GetSystemMetrics(SM_CYCAPTION);
m_nFrameCaptionHeight = max(m_nFrameCaptionHeight, 17);
m_clrFrameBorderActive0 = GetImages()->GetImageColor(_T("Window"), _T("BorderActive0"));
m_clrFrameBorderActive1 = GetImages()->GetImageColor(_T("Window"), _T("BorderActive1"));
m_clrFrameBorderActive2 = GetImages()->GetImageColor(_T("Window"), _T("BorderActive2"));
m_clrFrameBorderActive3 = GetImages()->GetImageColor(_T("Window"), _T("BorderActive3"));
m_clrFrameBorderInactive0 = GetImages()->GetImageColor(_T("Window"), _T("BorderInactive0"));
m_clrFrameBorderInactive1 = GetImages()->GetImageColor(_T("Window"), _T("BorderInactive1"));
m_clrFrameBorderInactive2 = GetImages()->GetImageColor(_T("Window"), _T("BorderInactive2"));
m_clrFrameBorderInactive3 = GetImages()->GetImageColor(_T("Window"), _T("BorderInactive3"));
m_clrFrameCaptionTextActiveTitle = GetImages()->GetImageColor(_T("Window"), _T("CaptionTextActiveTitle"));
m_clrFrameCaptionTextInActive = GetImages()->GetImageColor(_T("Window"), _T("CaptionTextInActive"));
m_clrFrameCaptionTextActive = GetImages()->GetImageColor(_T("Window"), _T("CaptionTextActive"));
m_bFlatFrame = GetImages()->GetImageInt(_T("Window"), _T("FlatFrame"), 0);
CXTPPaintManager::CNonClientMetrics ncm;
ncm.lfSmCaptionFont.lfWeight = FW_NORMAL;
if (m_pPaintManager->m_bClearTypeTextQuality &&
XTPSystemVersion()->IsClearTypeTextQualitySupported())
{
ncm.lfCaptionFont.lfQuality = 5;
}
ncm.lfCaptionFont.lfWeight = FW_NORMAL;
if (m_pPaintManager->m_bUseOfficeFont && CXTPDrawHelpers::FontExists(m_pPaintManager->m_strOfficeFont))
STRCPY_S(ncm.lfCaptionFont.lfFaceName, LF_FACESIZE, m_pPaintManager->m_strOfficeFont);
if (ncm.lfCaptionFont.lfHeight < 0)
ncm.lfCaptionFont.lfHeight = min(-11, ncm.lfCaptionFont.lfHeight);
ncm.lfCaptionFont.lfCharSet = XTPResourceManager()->GetFontCharset();
m_fontFrameCaption.SetStandardFont(&ncm.lfCaptionFont);
}
CXTPResourceImages* CXTPFramePaintManager::GetImages() const
{
return XTPResourceImages();
}
CXTPResourceImage* CXTPFramePaintManager::LoadImage(LPCTSTR lpszFileName)
{
return GetImages()->LoadFile(lpszFileName);
}
void CXTPFramePaintManager::DrawFrame(CDC* pDC, CXTPCommandBarsFrameHook* pFrameHook)
{
CWnd* pSite = pFrameHook->GetSite();
BOOL bActive = pFrameHook->IsFrameActive();
CXTPClientRect rcBorders(pSite);
pSite->ClientToScreen(rcBorders);
CXTPWindowRect rc(pSite);
int nRightBorder = rcBorders.left - rc.left, nLeftBorder = rcBorders.left - rc.left, nBorder = pFrameHook->GetFrameBorder();
int nBottomBorder = rc.bottom - rcBorders.bottom;
rc.OffsetRect(-rc.TopLeft());
CRect rcFrame(rc);
int nCaptionHeight = pFrameHook->GetCaptionHeight();
rcFrame.top += nCaptionHeight;
int nStatusHeight = 0;
BOOL bHasStatusBar = pFrameHook->IsFrameHasStatusBar(&nStatusHeight);
int nBordersHeight = bHasStatusBar ? rcFrame.Height() - nStatusHeight - 1 : rcFrame.Height();
if (nLeftBorder > 0) pDC->FillSolidRect(rc.left + 0, rcFrame.top, 1, rcFrame.Height(), bActive ? m_clrFrameBorderActive0 : m_clrFrameBorderInactive0);
if (nLeftBorder > 1) pDC->FillSolidRect(rc.left + 1, rcFrame.top, 1, nBordersHeight, bActive ? m_clrFrameBorderActive1 : m_clrFrameBorderInactive1);
if (nRightBorder > 0) pDC->FillSolidRect(rc.right - 1, rcFrame.top, 1, rcFrame.Height(), bActive ? m_clrFrameBorderActive0 : m_clrFrameBorderInactive0);
if (nRightBorder > 1) pDC->FillSolidRect(rc.right - 2, rcFrame.top, 1, nBordersHeight, bActive ? m_clrFrameBorderActive1 : m_clrFrameBorderInactive1);
if (m_bFlatFrame)
{
if (nLeftBorder > 2) pDC->FillSolidRect(rc.left + 2, rcFrame.top, nLeftBorder - 3, nBordersHeight, bActive ? m_clrFrameBorderActive2 : m_clrFrameBorderInactive2);
if (nLeftBorder > 2) pDC->FillSolidRect(rc.left + nLeftBorder - 1, rcFrame.top, 1, nBordersHeight, bActive ? m_clrFrameBorderActive3 : m_clrFrameBorderInactive3);
if (nRightBorder > 2) pDC->FillSolidRect(rc.right - nRightBorder + 1, rcFrame.top, nRightBorder - 3, nBordersHeight, bActive ? m_clrFrameBorderActive2 : m_clrFrameBorderInactive2);
if (nRightBorder > 2) pDC->FillSolidRect(rc.right - nRightBorder, rcFrame.top, 1, nBordersHeight, bActive ? m_clrFrameBorderActive3 : m_clrFrameBorderInactive3);
}
else
{
if (nLeftBorder > 2) pDC->FillSolidRect(rc.left + 2, rcFrame.top, 1, nBordersHeight, bActive ? m_clrFrameBorderActive2 : m_clrFrameBorderInactive2);
if (nLeftBorder > 3) pDC->FillSolidRect(rc.left + 3, rcFrame.top, nLeftBorder - 3, nBordersHeight, bActive ? m_clrFrameBorderActive3 : m_clrFrameBorderInactive3);
if (nRightBorder > 2) pDC->FillSolidRect(rc.right - 3, rcFrame.top, 1, nBordersHeight, bActive ? m_clrFrameBorderActive2 : m_clrFrameBorderInactive2);
if (nRightBorder > 3) pDC->FillSolidRect(rc.right - nRightBorder, rcFrame.top, nRightBorder - 3, nBordersHeight, bActive ? m_clrFrameBorderActive3 : m_clrFrameBorderInactive3);
}
pDC->FillSolidRect(rc.left, rc.bottom - 1, rc.Width(), 1,
bActive ? pSite->GetStyle() & WS_MAXIMIZE ? m_clrFrameBorderActive3 : m_clrFrameBorderActive0 : m_clrFrameBorderInactive0);
if (nBottomBorder > 1)
{
if (m_bFlatFrame)
{
pDC->FillSolidRect(rc.left + nLeftBorder, rc.bottom - nBottomBorder, rc.Width() - nLeftBorder - nRightBorder, 1, bActive ? m_clrFrameBorderActive3 : m_clrFrameBorderInactive3);
pDC->FillSolidRect(rc.left + 1, rc.bottom - nBottomBorder + 1, rc.Width() - 2, nBottomBorder - 2, bActive ? m_clrFrameBorderActive2 : m_clrFrameBorderInactive2);
}
else
{
pDC->FillSolidRect(rc.left + 1, rc.bottom - nBottomBorder, rc.Width() - 2, nBottomBorder - 1, bActive ? m_clrFrameBorderActive3 : m_clrFrameBorderInactive3);
}
}
//////////////////////////////////////////////////////////////////////////
CRect rcCaption(rc.left, rc.top, rc.right, rc.top + nCaptionHeight);
if (pFrameHook->IsCaptionVisible())
{
CXTPBufferDC dc(*pDC, rcCaption);
CRect rcTopLeft, rcTopRight, rcTopCenter, rcSrcTopLeft, rcSrcTopRight;
rcTopLeft.SetRectEmpty();
rcTopRight.SetRectEmpty();
rcTopCenter.SetRectEmpty();
rcSrcTopLeft.SetRectEmpty();
rcSrcTopRight.SetRectEmpty();
CXTPResourceImage* pImage = LoadImage(_T("FRAMETOPLEFT"));
if (pImage)
{
rcSrcTopLeft = pImage->GetSource(bActive ? 0 : 1, 2);
rcTopLeft.SetRect(rc.left, rc.top, rc.left + rcSrcTopLeft.Width(), rcCaption.bottom);
pImage->DrawImage(&dc, rcTopLeft, rcSrcTopLeft, CRect(0, 5, 0, 3));
}
//
pImage = LoadImage(_T("FRAMETOPRIGHT"));
if (pImage)
{
rcSrcTopRight = pImage->GetSource(bActive ? 0 : 1, 2);
rcTopRight.SetRect(rc.right - rcSrcTopRight.Width(), rc.top, rc.right, rcCaption.bottom);
pImage->DrawImage(&dc, rcTopRight, rcSrcTopRight, CRect(0, 5, 0, 3));
}
pImage = LoadImage(_T("FRAMETOPCENTER"));
if (pImage)
{
rcTopCenter.SetRect(rc.left + rcTopLeft.Width(), rc.top, rc.right - rcSrcTopRight.Width(), rcCaption.bottom);
pImage->DrawImage(&dc, rcTopCenter, pImage->GetSource(bActive ? 0 : 1, 2), CRect(0, 5, 0, 3));
}
CRect rcCaptionText(rcCaption);
rcCaptionText.left = 7;
rcCaptionText.DeflateRect(0, nBorder, 0, 3);
HICON hIcon = GetFrameSmallIcon(pSite);
if (hIcon)
{
CSize szIcon(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON));
int cBorders = nBorder - 1;
int cxySlot = rcCaption.Height() - cBorders;
int nTop = cBorders + (cxySlot - szIcon.cy - 1)/2;
DWORD dwLayout = XTPDrawHelpers()->IsContextRTL(&dc);
if (dwLayout & LAYOUT_RTL)
XTPDrawHelpers()->SetContextRTL(&dc, dwLayout | LAYOUT_BITMAPORIENTATIONPRESERVED);
DrawIconEx(dc.m_hDC, rcCaptionText.left, nTop, hIcon,
szIcon.cx, szIcon.cy, 0, NULL, DI_NORMAL);
if (dwLayout & LAYOUT_RTL)
XTPDrawHelpers()->SetContextRTL(&dc, dwLayout);
rcCaptionText.left = 7 + szIcon.cx + 5;
}
CXTPControls* pCaptionButtons = pFrameHook->GetCaptionButtons();
for (int i = 0; i < pCaptionButtons->GetCount(); i++)
{
CXTPControl* pControl = pCaptionButtons->GetAt(i);
if (!pControl->IsVisible())
continue;
DrawFrameCaptionButton(&dc, pControl->GetRect(), pControl->GetID(), pControl->GetSelected(), pControl->GetPressed(), pControl->GetEnabled() && bActive);
rcCaptionText.right = min(rcCaptionText.right, pControl->GetRect().left);
}
rcCaptionText.right -= nRightBorder;
DrawCaptionText(&dc, rcCaptionText, pSite, bActive);
if (m_bFlatFrame)
{
dc.FillSolidRect(rcCaption.left + nLeftBorder, rcCaption.bottom - 1, rcCaption.Width() -
nLeftBorder - nRightBorder, 1, bActive ? m_clrFrameBorderActive3 : m_clrFrameBorderInactive3);
}
}
else
{
CRect rcSrc;
rcSrc.SetRectEmpty();
CXTPResourceImage* pImage = LoadImage(_T("FRAMETOPLEFT"));
if (pImage)
{
rcSrc = pImage->GetSource(bActive ? 0 : 1, 2);
rcSrc.right = nLeftBorder;
CRect rcTopLeft(rc.left, rcCaption.top, rc.left + nLeftBorder, rcCaption.bottom);
pImage->DrawImage(pDC, rcTopLeft, rcSrc, CRect(0, 5, 0, 3));
}
pImage = LoadImage(_T("FRAMETOPRIGHT"));
if (pImage)
{
rcSrc = pImage->GetSource(bActive ? 0 : 1, 2);
rcSrc.left = rcSrc.right - nRightBorder;
CRect rcTopRight(rc.right - nRightBorder, rcCaption.top, rc.right, rcCaption.bottom);
pImage->DrawImage(pDC, rcTopRight, rcSrc, CRect(0, 5, 0, 3));
}
pImage = LoadImage(_T("FRAMETOPCENTER"));
if (pImage)
{
rcSrc = pImage->GetSource(bActive ? 0 : 1, 2);
rcSrc.bottom = rcSrc.top + nBorder;
CRect rcTopCenter(rc.left + nLeftBorder, rc.top, rc.right - nRightBorder, rc.top + nBorder);
pImage->DrawImage(pDC, rcTopCenter, rcSrc, CRect(0, 0, 0, 0));
}
pFrameHook->DrawRibbonFramePart(pDC);
}
if (bHasStatusBar)
{
CRect rcSrc;
rcSrc.SetRectEmpty();
CXTPResourceImage* pImage;
if (!m_bFlatFrame)
{
pImage = LoadImage(_T("STATUSBARLIGHT"));
if (pImage)
{
rcSrc.SetRect(0, 0, nLeftBorder - 1, pImage->GetHeight());
CRect rcLight(rc.left + 1, rc.bottom - nStatusHeight - nBottomBorder, rc.left + nLeftBorder, rc.bottom - nBottomBorder);
pImage->DrawImage(pDC, rcLight, rcSrc, CRect(0, 0, 0, 0));
}
pImage = LoadImage(_T("STATUSBARDARK"));
if (pImage)
{
rcSrc.SetRect(0, 0, nRightBorder - 1, pImage->GetHeight());
CRect rcDark(rc.right - nRightBorder, rc.bottom - nStatusHeight - nBottomBorder, rc.right - 1, rc.bottom - nBottomBorder);
pImage->DrawImage(pDC, rcDark, rcSrc, CRect(0, 0, 0, 0));
}
}
else
{
CRect rcLight(rc.left + 1, rc.bottom - nStatusHeight - nBottomBorder, rc.left + nLeftBorder, rc.bottom - nBottomBorder + 1);
pDC->FillSolidRect(rcLight, bActive ? m_clrFrameBorderActive2 : m_clrFrameBorderInactive2);
CRect rcDark(rc.right - nRightBorder, rc.bottom - nStatusHeight - nBottomBorder, rc.right - 1, rc.bottom - nBottomBorder + 1);
pDC->FillSolidRect(rcDark, bActive ? m_clrFrameBorderActive2 : m_clrFrameBorderInactive2);
if (nBottomBorder > 1)
{
pDC->FillSolidRect(rc.left + nLeftBorder - 1, rc.bottom - nStatusHeight - nBottomBorder, 1, nStatusHeight,
bActive ? m_clrFrameBorderActive3 : m_clrFrameBorderInactive3);
pDC->FillSolidRect(rc.right - nRightBorder, rc.bottom - nStatusHeight - nBottomBorder, 1, nStatusHeight,
bActive ? m_clrFrameBorderActive3 : m_clrFrameBorderInactive3);
}
}
}
if (bHasStatusBar || m_bRoundedCornersAlways)
{
CXTPResourceImage* pImage;
CRect rcSrc;
if (nLeftBorder > 3)
{
pImage = LoadImage(_T("FRAMEBOTTOMLEFT"));
if (pImage)
{
rcSrc = pImage->GetSource(bActive ? 0 : 1, 2);
CRect rcBottomLeft(rc.left, rc.bottom - rcSrc.Height(), rc.left + rcSrc.Width(), rc.bottom);
pImage->DrawImage(pDC, rcBottomLeft, rcSrc, CRect(0, 0, 0, 0), 0xFF00FF);
}
}
if (nRightBorder > 3)
{
pImage = LoadImage(_T("FRAMEBOTTOMRIGHT"));
if (pImage)
{
rcSrc = pImage->GetSource(bActive ? 0 : 1, 2);
CRect rcBottomRight(rc.right - rcSrc.Width(), rc.bottom - rcSrc.Height(), rc.right, rc.bottom);
pImage->DrawImage(pDC, rcBottomRight, rcSrc, CRect(0, 0, 0, 0), 0xFF00FF);
}
}
}
}
void CXTPFramePaintManager::DrawFrameCaptionButton(CDC* pDC, CRect rc, int nId, BOOL bSelected, BOOL bPressed, BOOL bActive)
{
int nState = !bActive ? 3 : bPressed && bSelected ? 2 : bSelected || bPressed ? 1 : 0;
int nGlyphSize = 23;
if (rc.Width() < 27) nGlyphSize = 17;
if (rc.Width() < 15) nGlyphSize = 13;
LPCTSTR lpszButton = nId == SC_CLOSE ? _T("CLOSE") : nId == SC_MINIMIZE ? _T("MINIMIZE") :
nId == SC_MAXIMIZE ? _T("MAXIMIZE") : _T("RESTORE");
if (bSelected || bPressed)
{
CString strImage;
strImage.Format(_T("FRAMECAPTION%sBUTTON"), lpszButton);
CXTPResourceImage* pImage = LoadImage(strImage);
if (!pImage) pImage = LoadImage(_T("FRAMECAPTIONBUTTON"));
pImage->DrawImage(pDC, rc, pImage->GetSource(bPressed && bSelected ? 1 : 0, 2), CRect(3, 3, 3, 3), 0xFF00FF);
}
CString strImage;
strImage.Format(_T("FRAMECAPTION%s%i"), lpszButton, nGlyphSize);
CXTPResourceImage* pImage = LoadImage(strImage);
CRect rcSrc(pImage->GetSource(nState, 5));
CRect rcGlyph(CPoint((rc.right + rc.left - rcSrc.Width()) / 2, (rc.top + rc.bottom - rcSrc.Height()) / 2), rcSrc.Size());
pImage->DrawImage(pDC, rcGlyph, rcSrc, CRect(0, 0, 0, 0), 0xFF00FF);
}
HICON CXTPFramePaintManager::GetFrameSmallIcon(CWnd* pFrame)
{
if (!pFrame)
return NULL;
DWORD dwStyle = pFrame->GetStyle();
DWORD dwExStyle = pFrame->GetExStyle();
if (dwExStyle & WS_EX_TOOLWINDOW)
return NULL;
if ((dwStyle & WS_SYSMENU) == 0)
return NULL;
HICON hIcon = (HICON)(DWORD_PTR)::SendMessage(pFrame->m_hWnd, WM_GETICON, ICON_SMALL, 0);
if (hIcon)
return hIcon;
hIcon = (HICON)(DWORD_PTR)::GetClassLongPtr(pFrame->m_hWnd, GCLP_HICONSM);
if (hIcon)
return hIcon;
if (((dwStyle & (WS_BORDER | WS_DLGFRAME)) != WS_DLGFRAME) && ((dwExStyle & WS_EX_DLGMODALFRAME) == 0))
{
ULONG_PTR dwResult;
if (SendMessageTimeout(pFrame->GetSafeHwnd(),
WM_QUERYDRAGICON,
0,
0,
SMTO_NORMAL,
100,
&dwResult))
{
hIcon = (HICON)dwResult;
}
if (hIcon == NULL)
{
hIcon = AfxGetApp()->LoadOEMIcon(OIC_WINLOGO);
}
}
return hIcon;
}
HICON CXTPFramePaintManager::GetFrameLargeIcon(CWnd* pFrame)
{
if (!pFrame)
return NULL;
HICON hIcon = (HICON)(DWORD_PTR)::SendMessage(pFrame->m_hWnd, WM_GETICON, ICON_BIG, 0);
if (hIcon)
return hIcon;
hIcon = (HICON)(DWORD_PTR)::GetClassLongPtr(pFrame->m_hWnd, GCLP_HICON);
if (hIcon)
return hIcon;
return hIcon;
}
///
//
//////////////////////////////////////////////////////////////////////////
// CXTPRibbonSystemFrameTheme
CXTPRibbonSystemFrameTheme::CXTPRibbonSystemFrameTheme(CXTPPaintManager* pPaintManager)
: CXTPFramePaintManager(pPaintManager)
{
m_pMarkupContext = XTPMarkupCreateContext(0);
}
CXTPRibbonSystemFrameTheme::~CXTPRibbonSystemFrameTheme()
{
XTPMarkupReleaseContext(m_pMarkupContext);
}
void CXTPRibbonSystemFrameTheme::RefreshMetrics()
{
CXTPFramePaintManager::RefreshMetrics();
m_clrFrameBorderActive0 = GetXtremeColor(COLOR_ACTIVECAPTION);
m_clrFrameBorderActive1 = GetXtremeColor(COLOR_GRADIENTACTIVECAPTION);
m_clrFrameBorderActive2 = GetXtremeColor(COLOR_GRADIENTACTIVECAPTION);
m_clrFrameBorderActive3 = GetXtremeColor(COLOR_GRADIENTACTIVECAPTION);
m_clrFrameBorderInactive0 = GetXtremeColor(COLOR_INACTIVECAPTION);
m_clrFrameBorderInactive1 = GetXtremeColor(COLOR_GRADIENTINACTIVECAPTION);
m_clrFrameBorderInactive2 = GetXtremeColor(COLOR_GRADIENTINACTIVECAPTION);
m_clrFrameBorderInactive3 = GetXtremeColor(COLOR_GRADIENTINACTIVECAPTION);
m_clrFrameCaptionTextActiveTitle = GetXtremeColor(COLOR_CAPTIONTEXT);
m_clrFrameCaptionTextInActive = GetXtremeColor(COLOR_INACTIVECAPTIONTEXT);
m_clrFrameCaptionTextActive = GetXtremeColor(COLOR_CAPTIONTEXT);
m_bFlatFrame = FALSE;
}
void CXTPRibbonSystemFrameTheme::RenderMarkup(CDC* pDC, CRect rc, LPCTSTR lpszMarkupText)
{
CXTPMarkupUIElement* pMarkupUIElement = XTPMarkupParseText(m_pMarkupContext, lpszMarkupText);
XTPMarkupRenderElement(pMarkupUIElement, pDC->GetSafeHdc(), rc);
XTPMarkupReleaseElement(pMarkupUIElement);
}
void CXTPRibbonSystemFrameTheme::DrawFrame(CDC* pDC, CXTPCommandBarsFrameHook* pFrameHook)
{
CWnd* pSite = pFrameHook->GetSite();
BOOL bActive = pFrameHook->IsFrameActive();
CXTPClientRect rcBorders(pSite);
pSite->ClientToScreen(rcBorders);
CXTPWindowRect rc(pSite);
int nRightBorder = rcBorders.left - rc.left, nLeftBorder = rcBorders.left - rc.left, nBorder = pFrameHook->GetFrameBorder();
int nBottomBorder = rc.bottom - rcBorders.bottom;
int nTopBorder = rcBorders.top - rc.top;
rc.OffsetRect(-rc.TopLeft());
CRect rcFrame(rc);
int nCaptionHeight = pFrameHook->GetCaptionHeight();
rcFrame.top += nCaptionHeight;
int nStatusHeight = 0;
BOOL bHasStatusBar = pFrameHook->IsFrameHasStatusBar(&nStatusHeight);
int nBordersHeight = bHasStatusBar ? rcFrame.Height() - nStatusHeight - 1 : rcFrame.Height();
if (nLeftBorder > 0) pDC->FillSolidRect(rc.left + 0, rcFrame.top, 1, rcFrame.Height(), bActive ? m_clrFrameBorderActive0 : m_clrFrameBorderInactive0);
if (nLeftBorder > 1) pDC->FillSolidRect(rc.left + 1, rcFrame.top, 1, nBordersHeight, bActive ? m_clrFrameBorderActive1 : m_clrFrameBorderInactive1);
if (nLeftBorder > 2) pDC->FillSolidRect(rc.left + 2, rcFrame.top, 1, nBordersHeight, bActive ? m_clrFrameBorderActive2 : m_clrFrameBorderInactive2);
if (nLeftBorder > 3) pDC->FillSolidRect(rc.left + 3, rcFrame.top, nLeftBorder - 3, nBordersHeight, bActive ? m_clrFrameBorderActive3 : m_clrFrameBorderInactive3);
if (nRightBorder > 0) pDC->FillSolidRect(rc.right - 1, rcFrame.top, 1, rcFrame.Height(), bActive ? m_clrFrameBorderActive0 : m_clrFrameBorderInactive0);
if (nRightBorder > 1) pDC->FillSolidRect(rc.right - 2, rcFrame.top, 1, nBordersHeight, bActive ? m_clrFrameBorderActive1 : m_clrFrameBorderInactive1);
if (nRightBorder > 2) pDC->FillSolidRect(rc.right - 3, rcFrame.top, 1, nBordersHeight, bActive ? m_clrFrameBorderActive2 : m_clrFrameBorderInactive2);
if (nRightBorder > 3) pDC->FillSolidRect(rc.right - nRightBorder, rcFrame.top, nRightBorder - 3, nBordersHeight, bActive ? m_clrFrameBorderActive3 : m_clrFrameBorderInactive3);
pDC->FillSolidRect(rc.left, rc.bottom - 1, rc.Width(), 1,
bActive ? pSite->GetStyle() & WS_MAXIMIZE ? m_clrFrameBorderActive3 : m_clrFrameBorderActive0 : m_clrFrameBorderInactive0);
if (nBottomBorder > 1)
{
pDC->FillSolidRect(rc.left + 1, rc.bottom - nBottomBorder, rc.Width() - 2, nBottomBorder - 1, bActive ? m_clrFrameBorderActive3 : m_clrFrameBorderInactive3);
}
//////////////////////////////////////////////////////////////////////////
CRect rcCaption(rc.left, rc.top, rc.right, rc.top + nCaptionHeight);
if (pFrameHook->IsCaptionVisible())
{
CXTPBufferDC dc(*pDC, rcCaption);
LPCTSTR lpszMarkupText = bActive ?
_T("")
_T(" ")
_T("")
_T(" ")
_T(" ")
_T(" ")
_T("")
_T("")
_T("") :
_T("")
_T(" ")
_T("")
_T(" ")
_T(" ")
_T(" ")
_T("")
_T("")
_T("");
RenderMarkup(&dc, rcCaption, lpszMarkupText);
CRect rcCaptionText(rcCaption);
rcCaptionText.left = 7;
rcCaptionText.DeflateRect(0, nBorder, 0, 3);
HICON hIcon = GetFrameSmallIcon(pSite);
if (hIcon)
{
CSize szIcon(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON));
int cBorders = nBorder - 1;
int cxySlot = rcCaption.Height() - cBorders;
int nTop = cBorders + (cxySlot - szIcon.cy - 1)/2;
DWORD dwLayout = XTPDrawHelpers()->IsContextRTL(&dc);
if (dwLayout & LAYOUT_RTL)
XTPDrawHelpers()->SetContextRTL(&dc, dwLayout | LAYOUT_BITMAPORIENTATIONPRESERVED);
DrawIconEx(dc.m_hDC, rcCaptionText.left, nTop, hIcon,
szIcon.cx, szIcon.cy, 0, NULL, DI_NORMAL);
if (dwLayout & LAYOUT_RTL)
XTPDrawHelpers()->SetContextRTL(&dc, dwLayout);
rcCaptionText.left = 7 + szIcon.cx + 5;
}
CXTPControls* pCaptionButtons = pFrameHook->GetCaptionButtons();
for (int i = 0; i < pCaptionButtons->GetCount(); i++)
{
CXTPControl* pControl = pCaptionButtons->GetAt(i);
if (!pControl->IsVisible())
continue;
DrawFrameCaptionButton(&dc, pControl->GetRect(), pControl->GetID(), pControl->GetSelected(), pControl->GetPressed(), pControl->GetEnabled() && bActive);
rcCaptionText.right = min(rcCaptionText.right, pControl->GetRect().left);
}
rcCaptionText.right -= nRightBorder;
DrawCaptionText(&dc, rcCaptionText, pSite, bActive);
}
else
{
LPCTSTR lpszMarkupText = bActive ?
_T("")
_T(" ")
_T("")
_T(" ")
_T(" ")
_T(" ")
_T("")
_T("")
_T("") :
_T("")
_T(" ")
_T("")
_T(" ")
_T(" ")
_T(" ")
_T("")
_T("")
_T("");
CRect rcClient(rcCaption.left + nLeftBorder, rcCaption.top + nTopBorder, rcCaption.right - nRightBorder, rcCaption.bottom);
pDC->ExcludeClipRect(rcClient);
RenderMarkup(pDC, rcCaption, lpszMarkupText);
}
}
void CXTPRibbonSystemFrameTheme::DrawFrameCaptionButton(CDC* pDC, CRect rc, int nId, BOOL bSelected, BOOL bPressed, BOOL /*bActive*/)
{
LPCTSTR lpszMarkupText = NULL;
if (bPressed && bSelected)
{
lpszMarkupText =
_T("")
_T(" ")
_T("")
_T(" ")
_T(" ")
_T("")
_T("");
}
else if (bSelected || bPressed)
{
lpszMarkupText =
_T("")
_T(" ")
_T("")
_T(" ")
_T(" ")
_T(" ")
_T("")
_T("");
}
if (lpszMarkupText)
{
RenderMarkup(pDC, rc, lpszMarkupText);
}
lpszMarkupText = NULL;
int nGlyphSize = rc.Width() >= 21 ? 11 : 9;
CRect rcGlyph(CPoint((rc.left + rc.right - nGlyphSize) / 2, (rc.top + rc.bottom - nGlyphSize) / 2),
CSize(nGlyphSize, nGlyphSize));
if (nId == SC_CLOSE)
{
lpszMarkupText =
nGlyphSize == 11 ?
_T("") :
_T("");
}
if (nId == SC_MINIMIZE)
{
lpszMarkupText =
nGlyphSize == 11 ?
_T("") :
_T("");
}
if (nId == SC_MAXIMIZE)
{
lpszMarkupText =
nGlyphSize == 11 ?
_T("") :
_T("");
}
if (nId == SC_RESTORE)
{
lpszMarkupText =
nGlyphSize == 11 ?
_T(""):
_T("");
}
if (lpszMarkupText)
{
RenderMarkup(pDC, rcGlyph, lpszMarkupText);
}
}