📄 bcgpwinxpvisualmanager.cpp
字号:
//*******************************************************************************
// COPYRIGHT NOTES
// ---------------
// This is a part of the BCGControlBar Library
// Copyright (C) 1998-2000 BCGSoft Ltd.
// All rights reserved.
//
// This source code can be used, distributed or modified
// only under terms and conditions
// of the accompanying license agreement.
//*******************************************************************************
//
// BCGWinXPVisualManager.cpp: implementation of the CBCGPWinXPVisualManager class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "BCGPWinXPVisualManager.h"
#include "BCGPPopupMenuBar.h"
#include "BCGPButton.h"
#include "BCGPDrawManager.h"
#include "BCGPBaseTabWnd.h"
#include "BCGPDockingControlBar.h"
#include "BCGPTasksPane.h"
#include "BCGPToolbarMenuButton.h"
#include "BCGPOutlookButton.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#if (defined(SCHEMA_STRINGS)) || (! defined(TMSCHEMA_H))
#define RP_GRIPPER 1
#define RP_GRIPPERVERT 2
#define RP_BAND 3
#define TP_BUTTON 1
#define TP_SEPARATOR 5
#define TP_SEPARATORVERT 6
#define WP_MINCAPTION 3
#define WP_MDIMINBUTTON 16
#define WP_MDICLOSEBUTTON 20
#define WP_MDIRESTOREBUTTON 22
#define BP_PUSHBUTTON 1
#define BP_RADIOBUTTON 2
#define BP_CHECKBOX 3
#define BP_GROUPBOX 4
#define SP_PANE 1
#define CP_DROPDOWNBUTTON 1
#define HP_HEADERITEM 1
#define HP_HEADERSORTARROW 4
#define SBP_SIZEBOX 10
#define TS_NORMAL 1
#define TS_HOT 2
#define TS_PRESSED 3
#define TS_DISABLED 4
#define TS_CHECKED 5
#define TS_HOTCHECKED 6
#define PBS_NORMAL 1
#define PBS_HOT 2
#define PBS_PRESSED 3
#define PBS_DISABLED 4
#define PBS_DEFAULTED 5
#define CBS_NORMAL 1
#define CBS_HOT 2
#define CBS_PUSHED 3
#define CBS_DISABLED 4
#define CBXS_NORMAL 1
#define CBXS_HOT 2
#define CBXS_PRESSED 3
#define CBXS_DISABLED 4
#define CBS_UNCHECKEDNORMAL 1
#define CBS_UNCHECKEDHOT 2
#define CBS_UNCHECKEDPRESSED 3
#define CBS_UNCHECKEDDISABLED 4
#define CBS_CHECKEDNORMAL 5
#define CBS_CHECKEDHOT 6
#define CBS_CHECKEDPRESSED 7
#define CBS_CHECKEDDISABLED 8
#define CBS_MIXEDNORMAL 9
#define CBS_MIXEDHOT 10
#define CBS_MIXEDPRESSED 11
#define CBS_MIXEDDISABLED 12
#define MNCS_ACTIVE 1
#define MNCS_INACTIVE 2
#define TIBES_NORMAL 1
#define TIBES_HOT 2
#define TIBES_SELECTED 3
#define TIBES_DISABLED 4
#define TIBES_FOCUSED 5
#define HIS_NORMAL 1
#define HIS_HOT 2
#define HIS_PRESSED 3
#define HILS_NORMAL 1
#define HILS_HOT 2
#define HILS_PRESSED 3
#define HIRS_NORMAL 1
#define HIRS_HOT 2
#define HIRS_PRESSED 3
#define HSAS_SORTEDUP 1
#define HSAS_SORTEDDOWN 2
#define SZB_RIGHTALIGN 1
#define SZB_LEFTALIGN 2
#define EBP_HEADERBACKGROUND 1
#define EBP_NORMALGROUPBACKGROUND 5
#define EBP_NORMALGROUPCOLLAPSE 6
#define EBP_NORMALGROUPEXPAND 7
#define EBP_NORMALGROUPHEAD 8
#define EBP_SPECIALGROUPBACKGROUND 9
#define EBP_SPECIALGROUPCOLLAPSE 10
#define EBP_SPECIALGROUPEXPAND 11
#define EBP_SPECIALGROUPHEAD 12
#define EBNGC_NORMAL 1
#define EBNGC_HOT 2
#define EBNGC_PRESSED 3
#define EBNGE_NORMAL 1
#define EBNGE_HOT 2
#define EBNGE_PRESSED 3
#define EBSGC_NORMAL 1
#define EBSGC_HOT 2
#define EBSGC_PRESSED 3
#define EBSGE_NORMAL 1
#define EBSGE_HOT 2
#define EBSGE_PRESSED 3
#define TVP_GLYPH 2
#define GLPS_CLOSED 1
#define GLPS_OPENED 2
#endif
IMPLEMENT_DYNCREATE(CBCGPWinXPVisualManager, CBCGPVisualManagerXP)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBCGPWinXPVisualManager::CBCGPWinXPVisualManager(BOOL bIsTemporary) :
CBCGPVisualManagerXP (bIsTemporary)
{
m_bShadowHighlightedImage = FALSE;
m_bOfficeStyleMenus = FALSE;
m_nVertMargin = 12;
m_nHorzMargin = 12;
m_nGroupVertOffset = 15;
m_nGroupCaptionHeight = 25;
m_nGroupCaptionHorzOffset = 13;
m_nGroupCaptionVertOffset = 7;
m_nTasksHorzOffset = 12;
m_nTasksIconHorzOffset = 5;
m_nTasksIconVertOffset = 4;
m_bActiveCaptions = TRUE;
globalData.UpdateSysColors ();
OnUpdateSystemColors ();
}
CBCGPWinXPVisualManager::~CBCGPWinXPVisualManager()
{
}
BOOL CBCGPWinXPVisualManager::IsWinXPThemeAvailible ()
{
CBCGPWinXPVisualManager* pWinXPManager =
DYNAMIC_DOWNCAST (CBCGPWinXPVisualManager, m_pVisManager);
if (pWinXPManager != NULL)
{
return pWinXPManager->m_hThemeWindow != NULL;
}
// Create a temporary manager and check it:
CBCGPWinXPVisualManager winXPManager (TRUE /* Temporary */);
return winXPManager.m_hThemeWindow != NULL;
}
void CBCGPWinXPVisualManager::SetOfficeStyleMenus (BOOL bOn)
{
m_bOfficeStyleMenus = bOn;
}
void CBCGPWinXPVisualManager::OnUpdateSystemColors ()
{
CBCGPVisualManagerXP::OnUpdateSystemColors ();
m_bShadowHighlightedImage = TRUE;
CBCGPWinXPThemeManager::UpdateSystemColors ();
if (m_hThemeWindow != NULL)
{
m_bShadowHighlightedImage = FALSE;
}
}
void CBCGPWinXPVisualManager::OnDrawBarGripper (CDC* pDC, CRect rectGripper, BOOL bHorz,
CBCGPBaseControlBar* pBar)
{
ASSERT_VALID (pDC);
if (m_hThemeRebar == NULL)
{
CBCGPVisualManagerXP::OnDrawBarGripper (pDC, rectGripper, bHorz, pBar);
return;
}
BOOL bSideBar = pBar != NULL && pBar->IsKindOf (RUNTIME_CLASS (CBCGPDockingControlBar));
CRect rectFill = rectGripper;
if (bSideBar)
{
bHorz = !bHorz;
}
COLORREF clrTextOld = pDC->SetTextColor (globalData.clrBtnShadow);
COLORREF clrBkOld = pDC->SetBkColor (globalData.clrBtnFace);
(*m_pfDrawThemeBackground) (m_hThemeRebar, pDC->GetSafeHdc(),
bHorz ? RP_GRIPPER : RP_GRIPPERVERT, 0, &rectGripper, 0);
if (bSideBar)
{
//------------------
// Draw bar caption:
//------------------
int nOldBkMode = pDC->SetBkMode (OPAQUE);
pDC->SetTextColor (globalData.clrBtnText);
const CFont& font = CBCGPMenuBar::GetMenuFont (bHorz);
CFont* pOldFont = pDC->SelectObject ((CFont*) &font);
CString strCaption;
pBar->GetWindowText (strCaption);
strCaption = _T(" ") + strCaption + _T(" ");
CRect rectText = rectGripper;
UINT uiTextFormat = 0;
TEXTMETRIC tm;
pDC->GetTextMetrics (&tm);
CPoint ptTextOffset (0, 0);
if (bHorz)
{
ptTextOffset.y = (rectGripper.Height () - tm.tmHeight - 1) / 2;
}
else
{
ptTextOffset.x = (rectGripper.Width () - tm.tmHeight + 1) / 2;
}
if (bHorz)
{
rectText.top += ptTextOffset.y;
pDC->DrawText (strCaption, &rectText, uiTextFormat);
}
else
{
rectText.left = rectText.right - ptTextOffset.x;
rectText.top = rectGripper.top + ptTextOffset.y;
rectText.bottom = rectGripper.top + 3 * ptTextOffset.y;
uiTextFormat |= DT_NOCLIP;
pDC->DrawText (strCaption, &rectText, uiTextFormat);
}
pDC->SelectObject(pOldFont);
pDC->SetBkMode(nOldBkMode);
}
pDC->SetTextColor (clrTextOld);
pDC->SetBkColor (clrBkOld);
}
//*************************************************************************************
void CBCGPWinXPVisualManager::OnFillBarBackground (CDC* pDC, CBCGPBaseControlBar* pBar,
CRect rectClient, CRect rectClip,
BOOL bNCArea)
{
ASSERT_VALID (pBar);
ASSERT_VALID (pDC);
if (m_hThemeWindow == NULL ||
pBar->IsDialogControl ())
{
CBCGPVisualManagerXP::OnFillBarBackground (pDC, pBar,rectClient, rectClip, bNCArea);
return;
}
if (!m_bOfficeStyleMenus && pBar->IsKindOf (RUNTIME_CLASS (CBCGPPopupMenuBar)))
{
::FillRect (pDC->GetSafeHdc (), rectClient, ::GetSysColorBrush (COLOR_MENU));
return;
}
CBCGPVisualManagerXP::OnFillBarBackground (pDC, pBar,rectClient, rectClip, bNCArea);
}
//*************************************************************************************
void CBCGPWinXPVisualManager::OnFillButtonInterior (CDC* pDC,
CBCGPToolbarButton* pButton, CRect rect,
CBCGPVisualManager::BCGBUTTON_STATE state)
{
if (m_hThemeToolBar == NULL)
{
CBCGPVisualManagerXP::OnFillButtonInterior (pDC, pButton, rect, state);
return;
}
if (m_bOfficeStyleMenus)
{
CBCGPToolbarMenuButton* pMenuButton =
DYNAMIC_DOWNCAST (CBCGPToolbarMenuButton, pButton);
if (pMenuButton != NULL)
{
BOOL bIsMenuBar = pMenuButton->GetParentWnd () != NULL &&
pMenuButton->GetParentWnd ()->IsKindOf (RUNTIME_CLASS (CBCGPMenuBar));
BOOL bIsPopupMenu = pMenuButton->GetParentWnd () != NULL &&
pMenuButton->GetParentWnd ()->IsKindOf (RUNTIME_CLASS (CBCGPPopupMenuBar));
if (bIsPopupMenu || bIsMenuBar)
{
CBCGPVisualManagerXP::OnFillButtonInterior (pDC, pButton, rect, state);
return;
}
}
}
int nState = TS_NORMAL;
if (state == ButtonsIsPressed)
{
nState = TS_PRESSED;
}
else if (state == ButtonsIsHighlighted)
{
nState = TS_HOT;
}
if (pButton->m_nStyle & TBBS_CHECKED)
{
nState = (state == ButtonsIsHighlighted) ? TS_HOTCHECKED : TS_CHECKED;
}
if (pButton->m_nStyle & TBBS_DISABLED)
{
nState = TS_DISABLED;
}
(*m_pfDrawThemeBackground) (m_hThemeToolBar, pDC->GetSafeHdc(), TP_BUTTON, nState, &rect, 0);
}
//**************************************************************************************
COLORREF CBCGPWinXPVisualManager::GetToolbarButtonTextColor (CBCGPToolbarButton* pButton,
CBCGPVisualManager::BCGBUTTON_STATE state)
{
ASSERT_VALID (pButton);
if (m_hThemeToolBar == NULL ||
pButton->IsKindOf (RUNTIME_CLASS (CBCGPOutlookButton)))
{
return CBCGPVisualManagerXP::GetToolbarButtonTextColor (pButton, state);
}
return CBCGPVisualManager::GetToolbarButtonTextColor (pButton, state);
}
//************************************************************************************
void CBCGPWinXPVisualManager::OnHighlightMenuItem (CDC*pDC, CBCGPToolbarMenuButton* pButton,
CRect rect, COLORREF& clrText)
{
if (m_hThemeWindow == NULL || m_bOfficeStyleMenus)
{
CBCGPVisualManagerXP::OnHighlightMenuItem (pDC, pButton, rect, clrText);
}
else
{
CBCGPVisualManager::OnHighlightMenuItem (pDC, pButton, rect, clrText);
}
}
//************************************************************************************
void CBCGPWinXPVisualManager::OnHighlightRarelyUsedMenuItems (CDC* pDC, CRect rectRarelyUsed)
{
if (m_hThemeWindow == NULL || m_bOfficeStyleMenus)
{
CBCGPVisualManagerXP::OnHighlightRarelyUsedMenuItems (pDC, rectRarelyUsed);
return;
}
ASSERT_VALID (pDC);
CBCGPDrawManager dm (*pDC);
rectRarelyUsed.left --;
rectRarelyUsed.right = rectRarelyUsed.left + CBCGPToolBar::GetMenuImageSize ().cx +
2 * GetMenuImageMargin () + 2;
dm.HighlightRect (rectRarelyUsed, 94);
}
//************************************************************************************
void CBCGPWinXPVisualManager::OnDrawButtonBorder (CDC* pDC,
CBCGPToolbarButton* pButton, CRect rect, BCGBUTTON_STATE state)
{
if (m_hThemeToolBar == NULL)
{
CBCGPVisualManagerXP::OnDrawButtonBorder (pDC, pButton, rect, state);
return;
}
if (m_bOfficeStyleMenus)
{
CBCGPToolbarMenuButton* pMenuButton =
DYNAMIC_DOWNCAST (CBCGPToolbarMenuButton, pButton);
if (pMenuButton != NULL)
{
BOOL bIsMenuBar = pMenuButton->GetParentWnd () != NULL &&
pMenuButton->GetParentWnd ()->IsKindOf (RUNTIME_CLASS (CBCGPMenuBar));
BOOL bIsPopupMenu = pMenuButton->GetParentWnd () != NULL &&
pMenuButton->GetParentWnd ()->IsKindOf (RUNTIME_CLASS (CBCGPPopupMenuBar));
if (bIsPopupMenu || bIsMenuBar)
{
CBCGPVisualManagerXP::OnDrawButtonBorder (pDC, pButton, rect, state);
return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -