📄 bcgpvisualmanager.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.
//*******************************************************************************
// BCGPVisualManager.cpp: implementation of the CBCGPPVisualManager class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "BCGPVisualManager.h"
#include "BCGPToolbarButton.h"
#include "BCGPOutlookBarPane.h"
#include "BCGPOutlookButton.h"
#include "BCGGlobals.h"
#include "BCGPDockingControlBar.h"
#include "BCGPBaseControlBar.h"
#include "BCGPToolBar.h"
#include "BCGPTabWnd.h"
#include "BCGPDrawManager.h"
#include "BCGPShowAllButton.h"
#include "BCGPButton.h"
#include "BCGPMiniFrameWnd.h"
#include "BCGPCaptionBar.h"
#include "BCGPOutlookButton.h"
#include "BCGPTasksPane.h"
#include "BCGPSlider.h"
#include "BCGPCalendarBar.h"
#include "MenuImages.h"
#include "BCGPHeaderCtrl.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
IMPLEMENT_DYNCREATE (CBCGPVisualManager, CObject)
extern CObList gAllToolbars;
CBCGPVisualManager* CBCGPVisualManager::m_pVisManager = NULL;
CRuntimeClass* CBCGPVisualManager::m_pRTIDefault = NULL;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBCGPVisualManager::CBCGPVisualManager(BOOL bIsTemporary)
{
m_bAutoDestroy = FALSE;
m_bIsTemporary = bIsTemporary;
if (!bIsTemporary)
{
if (m_pVisManager != NULL)
{
ASSERT (FALSE);
}
else
{
m_pVisManager = this;
}
}
m_bLook2000 = FALSE;
m_bMenuFlatLook = FALSE;
m_nMenuShadowDepth = 6;
m_bShadowHighlightedImage = FALSE;
m_bEmbossDisabledImage = TRUE;
m_bFadeInactiveImage = FALSE;
m_bEnableToolbarButtonFill = TRUE;
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;
m_bOfficeXPStyleMenus = FALSE;
m_nMenuBorderSize = 2;
globalData.UpdateSysColors ();
}
//*************************************************************************************
CBCGPVisualManager::~CBCGPVisualManager()
{
if (!m_bIsTemporary)
{
m_pVisManager = NULL;
}
}
//*************************************************************************************
void CBCGPVisualManager::SetDefaultManager (CRuntimeClass* pRTI)
{
if (pRTI != NULL &&
!pRTI->IsDerivedFrom (RUNTIME_CLASS (CBCGPVisualManager)))
{
ASSERT (FALSE);
return;
}
m_pRTIDefault = pRTI;
if (m_pVisManager != NULL)
{
ASSERT_VALID (m_pVisManager);
delete m_pVisManager;
m_pVisManager = NULL;
}
globalData.UpdateSysColors ();
RedrawAll ();
}
//*************************************************************************************
void CBCGPVisualManager::RedrawAll ()
{
if (AfxGetMainWnd () != NULL)
{
AfxGetMainWnd ()->RedrawWindow (NULL, NULL,
RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN);
}
for (POSITION posTlb = gAllToolbars.GetHeadPosition (); posTlb != NULL;)
{
CBCGPBaseControlBar* pToolBar = (CBCGPBaseControlBar*) gAllToolbars.GetNext (posTlb);
ASSERT (pToolBar != NULL);
if (CWnd::FromHandlePermanent (pToolBar->m_hWnd) != NULL)
{
ASSERT_VALID (pToolBar);
pToolBar->RedrawWindow (NULL, NULL,
RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_ALLCHILDREN);
}
}
CBCGPMiniFrameWnd::RedrawAll ();
}
//*************************************************************************************
void CBCGPVisualManager::OnDrawBarGripper (CDC* pDC, CRect rectGripper, BOOL bHorz,
CBCGPBaseControlBar* pBar)
{
ASSERT_VALID (pDC);
const COLORREF clrHilite = pBar != NULL && pBar->IsDialogControl () ?
globalData.clrBtnHilite : globalData.clrBarHilite;
const COLORREF clrShadow = pBar != NULL && pBar->IsDialogControl () ?
globalData.clrBtnShadow : globalData.clrBarShadow;
const BOOL bSingleGripper = m_bLook2000;
const int iGripperSize = 3;
const int iGripperOffset = bSingleGripper ? 0 : 1;
const int iLinesNum = bSingleGripper ? 1 : 2;
if (bHorz)
{
//-----------------
// Gripper at left:
//-----------------
rectGripper.DeflateRect (0, bSingleGripper ? 3 : 2);
// ET: Center the grippers
rectGripper.left = iGripperOffset + rectGripper.CenterPoint().x -
( iLinesNum*iGripperSize + (iLinesNum-1)*iGripperOffset) / 2;
rectGripper.right = rectGripper.left + iGripperSize;
for (int i = 0; i < iLinesNum; i ++)
{
pDC->Draw3dRect (rectGripper,
clrHilite,
clrShadow);
// ET: not used for NewFlat look
if(! bSingleGripper ) {
//-----------------------------------
// To look same as MS Office Gripper!
//-----------------------------------
pDC->SetPixel (CPoint (rectGripper.left, rectGripper.bottom - 1),
clrHilite);
}
rectGripper.OffsetRect (iGripperSize+1, 0);
}
}
else
{
//----------------
// Gripper at top:
//----------------
rectGripper.top += iGripperOffset;
rectGripper.DeflateRect (bSingleGripper ? 3 : 2, 0);
// ET: Center the grippers
rectGripper.top = iGripperOffset + rectGripper.CenterPoint().y -
( iLinesNum*iGripperSize + (iLinesNum-1)) / 2;
rectGripper.bottom = rectGripper.top + iGripperSize;
for (int i = 0; i < iLinesNum; i ++)
{
pDC->Draw3dRect (rectGripper,
clrHilite,
clrShadow);
// ET: not used for NewFlat look
if(! bSingleGripper ) {
//-----------------------------------
// To look same as MS Office Gripper!
//-----------------------------------
pDC->SetPixel (CPoint (rectGripper.right - 1, rectGripper.top),
clrHilite);
}
rectGripper.OffsetRect (0, iGripperSize+1);
}
}
}
//*************************************************************************************
void CBCGPVisualManager::SetLook2000 (BOOL bLook2000)
{
m_bLook2000 = bLook2000;
if (AfxGetMainWnd () != NULL)
{
AfxGetMainWnd()->RedrawWindow (NULL, NULL,
RDW_INVALIDATE | RDW_ERASENOW | RDW_ALLCHILDREN | RDW_UPDATENOW | RDW_FRAME);
}
RedrawAll ();
}
//*************************************************************************************
void CBCGPVisualManager::OnFillBarBackground (CDC* pDC, CBCGPBaseControlBar* pBar,
CRect rectClient, CRect rectClip,
BOOL /*bNCArea*/)
{
ASSERT_VALID(pDC);
ASSERT_VALID(pBar);
if (pBar->IsKindOf (RUNTIME_CLASS (CBCGPOutlookBarPane)))
{
((CBCGPOutlookBarPane*) pBar)->OnEraseWorkArea (pDC, rectClient);
return;
}
if (pBar->IsKindOf (RUNTIME_CLASS (CBCGPCaptionBar)))
{
CBCGPCaptionBar* pCaptionBar = (CBCGPCaptionBar*) pBar;
pDC->FillSolidRect (rectClip, pCaptionBar->m_clrBarBackground == -1 ?
globalData.clrBarShadow : pCaptionBar->m_clrBarBackground);
return;
}
// By default, control bar background is filled by
// the system 3d background color
pDC->FillRect (rectClip.IsRectEmpty () ? rectClient : rectClip,
pBar->IsDialogControl () ?
&globalData.brBtnFace : &globalData.brBarFace);
}
//*************************************************************************************
void CBCGPVisualManager::OnDrawBarBorder (CDC* pDC, CBCGPBaseControlBar* pBar, CRect& rect)
{
ASSERT_VALID(pBar);
ASSERT_VALID(pDC);
if (pBar->IsFloating ())
{
return;
}
DWORD dwStyle = pBar->GetBarStyle ();
if (!(dwStyle & CBRS_BORDER_ANY))
return;
COLORREF clrBckOld = pDC->GetBkColor (); // FillSolidRect changes it
// Copyright (C) 1997,'98 by Joerg Koenig
// All rights reserved
//
const COLORREF clrHilite = pBar->IsDialogControl () ?
globalData.clrBtnHilite : globalData.clrBarHilite;
const COLORREF clrShadow = pBar->IsDialogControl () ?
globalData.clrBtnShadow : globalData.clrBarShadow;
COLORREF clr = clrHilite;
if(dwStyle & CBRS_BORDER_LEFT)
pDC->FillSolidRect(0, 0, 1, rect.Height() - 1, clr);
if(dwStyle & CBRS_BORDER_TOP)
pDC->FillSolidRect(0, 0, rect.Width()-1 , 1, clr);
if(dwStyle & CBRS_BORDER_RIGHT)
pDC->FillSolidRect(rect.right, 0/*RGL~:1*/, -1,
rect.Height()/*RGL-: - 1*/, clrShadow);
if(dwStyle & CBRS_BORDER_BOTTOM)
pDC->FillSolidRect(0, rect.bottom, rect.Width()-1, -1, clrShadow);
// if undockable toolbar at top of frame, apply special formatting to mesh
// properly with frame menu
if(!pBar->CanFloat ())
{
pDC->FillSolidRect(0,0,rect.Width(),1,clrShadow);
pDC->FillSolidRect(0,1,rect.Width(),1,clrHilite);
}
if (dwStyle & CBRS_BORDER_LEFT)
++rect.left;
if (dwStyle & CBRS_BORDER_TOP)
++rect.top;
if (dwStyle & CBRS_BORDER_RIGHT)
--rect.right;
if (dwStyle & CBRS_BORDER_BOTTOM)
--rect.bottom;
// Restore Bk color:
pDC->SetBkColor (clrBckOld);
}
//************************************************************************************
void CBCGPVisualManager::OnDrawMenuBorder (CDC* pDC, CBCGPPopupMenu* /*pMenu*/, CRect rect)
{
ASSERT_VALID (pDC);
pDC->Draw3dRect (rect, globalData.clrBarLight, globalData.clrBarDkShadow);
rect.DeflateRect (1, 1);
pDC->Draw3dRect (rect, globalData.clrBarHilite, globalData.clrBarShadow);
}
//************************************************************************************
void CBCGPVisualManager::OnDrawMenuShadow (CDC* pPaintDC, const CRect& rectClient, const CRect& /*rectExclude*/,
int nDepth, int iMinBrightness, int iMaxBrightness,
CBitmap* pBmpSaveBottom, CBitmap* pBmpSaveRight)
{
ASSERT_VALID (pPaintDC);
ASSERT_VALID (pBmpSaveBottom);
ASSERT_VALID (pBmpSaveRight);
//------------------------------------------------------
// Simple draw the shadow, ignore rectExclude parameter:
//------------------------------------------------------
CBCGPDrawManager dm (*pPaintDC);
dm.DrawShadow (rectClient, nDepth, iMinBrightness, iMaxBrightness,
pBmpSaveBottom, pBmpSaveRight);
}
//************************************************************************************
void CBCGPVisualManager::OnFillButtonInterior (CDC* pDC,
CBCGPToolbarButton* pButton, CRect rect,
CBCGPVisualManager::BCGBUTTON_STATE state)
{
ASSERT_VALID (pDC);
ASSERT_VALID (pButton);
if (pButton->IsKindOf (RUNTIME_CLASS (CBCGPShowAllButton)))
{
if (state == ButtonsIsHighlighted)
{
CBCGPDrawManager dm (*pDC);
dm.HighlightRect (rect);
}
return;
}
if (!m_bEnableToolbarButtonFill)
{
BOOL bIsPopupMenu = FALSE;
CBCGPToolbarMenuButton* pMenuButton =
DYNAMIC_DOWNCAST (CBCGPToolbarMenuButton, pButton);
if (pMenuButton != NULL)
{
bIsPopupMenu = pMenuButton->GetParentWnd () != NULL &&
pMenuButton->GetParentWnd ()->IsKindOf (RUNTIME_CLASS (CBCGPPopupMenuBar));
}
if (!bIsPopupMenu)
{
return;
}
}
if (!pButton->IsKindOf (RUNTIME_CLASS (CBCGPOutlookButton)) &&
!CBCGPToolBar::IsCustomizeMode () && state != ButtonsIsHighlighted &&
(pButton->m_nStyle & (TBBS_CHECKED | TBBS_INDETERMINATE)))
{
CRect rectDither = rect;
rectDither.InflateRect (-afxData.cxBorder2, -afxData.cyBorder2);
CBCGPToolBarImages::FillDitheredRect (pDC, rectDither);
}
}
//************************************************************************************
void CBCGPVisualManager::OnHighlightMenuItem (CDC*pDC, CBCGPToolbarMenuButton* /*pButton*/,
CRect rect, COLORREF& /*clrText*/)
{
ASSERT_VALID (pDC);
pDC->FillRect (rect, &globalData.brHilite);
}
//************************************************************************************
void CBCGPVisualManager::OnHighlightRarelyUsedMenuItems (CDC* pDC, CRect rectRarelyUsed)
{
ASSERT_VALID (pDC);
CBCGPDrawManager dm (*pDC);
dm.HighlightRect (rectRarelyUsed);
pDC->Draw3dRect (rectRarelyUsed, globalData.clrBarShadow, globalData.clrBarHilite);
}
//************************************************************************************
void CBCGPVisualManager::OnDrawButtonBorder (CDC* pDC,
CBCGPToolbarButton* pButton, CRect rect, BCGBUTTON_STATE state)
{
ASSERT_VALID (pDC);
ASSERT_VALID (pButton);
BOOL bIsOutlookButton = pButton->IsKindOf (RUNTIME_CLASS (CBCGPOutlookButton));
COLORREF clrDark = bIsOutlookButton ?
globalData.clrBarDkShadow : globalData.clrBarShadow;
switch (state)
{
case ButtonsIsPressed:
pDC->Draw3dRect (&rect, clrDark, globalData.clrBarHilite);
return;
case ButtonsIsHighlighted:
pDC->Draw3dRect (&rect, globalData.clrBarHilite, clrDark);
return;
}
}
//*************************************************************************************
void CBCGPVisualManager::OnDrawButtonSeparator (CDC* pDC,
CBCGPToolbarButton* pButton, CRect rect, CBCGPVisualManager::BCGBUTTON_STATE state,
BOOL /*bHorz*/)
{
ASSERT_VALID (pButton);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -