📄 bcgpvisualmanagerxp.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.
//*******************************************************************************
// BCGPVisualManagerXP.cpp: implementation of the CBCGPVisualManagerXP class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "BCGPVisualManagerXP.h"
#include "BCGPDrawManager.h"
#include "BCGPMenuBar.h"
#include "BCGPPopupMenu.h"
#include "BCGPToolbarMenuButton.h"
#include "BCGPOutlookBarPane.h"
#include "BCGPColorBar.h"
#include "BCGPBaseTabWnd.h"
#include "BCGPDockingControlBar.h"
#include "BCGPAutoHideDockBar.h"
#include "BCGGlobals.h"
#include "BCGPOutlookButton.h"
#include "BCGPMiniFrameWnd.h"
#include "BCGPTaskPaneMiniFrameWnd.h"
#include "BCGPToolbarEditBoxButton.h"
#include "BCGPTasksPane.h"
#include "BCGPCalendarBar.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
IMPLEMENT_DYNCREATE(CBCGPVisualManagerXP, CBCGPVisualManager)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBCGPVisualManagerXP::CBCGPVisualManagerXP(BOOL bIsTemporary) :
CBCGPVisualManager (bIsTemporary)
{
m_bConnectMenuToParent = TRUE;
m_nVertMargin = 4;
m_nHorzMargin = 4;
m_nGroupVertOffset = 4;
m_nGroupCaptionHeight = 0;
m_nGroupCaptionHorzOffset = 0;
m_nGroupCaptionVertOffset = 0;
m_nTasksHorzOffset = 12;
m_nTasksIconHorzOffset = 5;
m_nTasksIconVertOffset = 4;
m_bActiveCaptions = FALSE;
m_bMenuFlatLook = TRUE;
m_bShadowHighlightedImage = TRUE;
m_bEmbossDisabledImage = FALSE;
m_bFadeInactiveImage = TRUE;
m_bLook2000 = TRUE;
m_nMenuShadowDepth = 4;
m_nMenuBorderSize = 1;
m_bOfficeXPStyleMenus = TRUE;
globalData.UpdateSysColors ();
OnUpdateSystemColors ();
}
//**********************************************************************************
CBCGPVisualManagerXP::~CBCGPVisualManagerXP()
{
}
//****************************************************************************************
void CBCGPVisualManagerXP::OnUpdateSystemColors ()
{
m_brBarBkgnd.DeleteObject ();
m_brMenuLight.DeleteObject ();
m_brHighlight.DeleteObject ();
m_brHighlightDn.DeleteObject ();
m_brHighlightChecked.DeleteObject ();
m_brFloatToolBarBorder.DeleteObject ();
m_penSeparator.DeleteObject ();
m_brTabBack.DeleteObject ();
COLORREF clrTabBack;
COLORREF clrSeparator;
COLORREF clrFloatToolBarBorder;
if (globalData.m_nBitsPerPixel > 8)
{
COLORREF clrWindow = globalData.clrBarWindow;
COLORREF clrFace = globalData.clrBarFace;
m_clrMenuLight = CBCGPDrawManager::PixelAlpha (
clrWindow, .976, .973, .969);
double H, S, L;
CBCGPDrawManager::RGBtoHSL (clrFace, &H, &S, &L);
double S1;
double L1;
if (S < 0.1)
{
L1 = min (1., L + (1. - L) * .5);
S1 = S == 0 ? 0 : min (1., S + .1);
}
else
{
L1 = min (1., 0.5 * L + 0.5);
S1 = min (1., S * 2);
}
clrTabBack = CBCGPDrawManager::HLStoRGB_ONE (H, L1, S1);
if (L > .9)
{
m_clrBarBkgnd = clrFace;
}
else
{
m_clrBarBkgnd = CBCGPDrawManager::HLStoRGB_ONE (H, L * 1.03, S);
}
m_clrInactiveTabText = CBCGPDrawManager::HLStoRGB_ONE (H, L * .4, S);
COLORREF clrHL = globalData.clrHilite;
m_clrHighlight = CBCGPDrawManager::PixelAlpha (RGB (
(GetRValue (clrHL) + 2 * GetRValue (m_clrMenuLight)) / 3,
(GetGValue (clrHL) + 2 * GetGValue (m_clrMenuLight)) / 3,
(GetBValue (clrHL) + 2 * GetBValue (m_clrMenuLight)) / 3),
105);
m_clrHighlightDn = CBCGPDrawManager::PixelAlpha (
m_clrHighlight, .87, .87, .87);
m_clrHighlightChecked = CBCGPDrawManager::PixelAlpha (RGB (
(GetRValue (clrHL) + 5 * GetRValue (m_clrMenuLight)) / 6,
(GetGValue (clrHL) + 5 * GetGValue (m_clrMenuLight)) / 6,
(GetBValue (clrHL) + 5 * GetBValue (m_clrMenuLight)) / 6),
100);
clrSeparator = CBCGPDrawManager::PixelAlpha (
globalData.clrBarFace, .86, .86, .86);
m_clrPaneBorder = globalData.clrBarShadow;
m_clrMenuBorder = CBCGPDrawManager::PixelAlpha (
clrFace, 55);
clrFloatToolBarBorder = CBCGPDrawManager::PixelAlpha (
globalData.clrBarShadow, .85, .85, .85);
m_clrGripper = CBCGPDrawManager::PixelAlpha (
globalData.clrBarShadow, 110);
}
else
{
m_clrMenuLight = globalData.clrWindow;
m_clrBarBkgnd = globalData.clrBtnFace;
m_clrHighlight = globalData.clrBtnFace;
m_clrHighlightDn = globalData.clrBtnFace;
m_clrHighlightChecked = globalData.clrWindow;
clrTabBack = globalData.clrBtnFace;
m_clrInactiveTabText = globalData.clrBtnDkShadow;
clrSeparator = globalData.clrBtnShadow;
m_clrGripper = globalData.clrBtnShadow;
m_clrPaneBorder = globalData.clrBtnShadow;
m_clrMenuBorder = globalData.clrBtnDkShadow;
clrFloatToolBarBorder = globalData.clrBtnShadow;
}
m_brBarBkgnd.CreateSolidBrush (m_clrBarBkgnd);
m_brMenuLight.CreateSolidBrush (m_clrMenuLight);
m_brHighlight.CreateSolidBrush (m_clrHighlight);
m_brHighlightDn.CreateSolidBrush (m_clrHighlightDn);
m_brHighlightChecked.CreateSolidBrush (m_clrHighlightChecked);
m_brTabBack.CreateSolidBrush (clrTabBack);
m_penSeparator.CreatePen (PS_SOLID, 1, clrSeparator);
m_clrMenuItemBorder = globalData.clrHilite;
m_brFloatToolBarBorder.CreateSolidBrush (clrFloatToolBarBorder);
m_clrMenuShadowBase = (COLORREF)-1; // Used in derived classes
}
//***************************************************************************************
void CBCGPVisualManagerXP::OnDrawBarGripper (CDC* pDC, CRect rectGripper, BOOL bHorz,
CBCGPBaseControlBar* pBar)
{
ASSERT_VALID (pDC);
if (pBar != NULL && pBar->IsDialogControl ())
{
CBCGPVisualManager::OnDrawBarGripper (pDC, rectGripper, bHorz, pBar);
return;
}
if (m_brGripperHorz.GetSafeHandle () == NULL)
{
CreateGripperBrush ();
}
BOOL bSideBar = pBar->IsKindOf (RUNTIME_CLASS (CBCGPDockingControlBar));
BOOL bMenuBar = pBar->IsKindOf (RUNTIME_CLASS (CBCGPMenuBar));
CRect rectFill = rectGripper;
if (!bSideBar)
{
if (bHorz)
{
int xCenter = rectFill.CenterPoint ().x;
rectFill.left = xCenter - 1;
rectFill.right = xCenter + 2;
rectFill.DeflateRect (0, 5);
}
else
{
int yCenter = rectFill.CenterPoint ().y;
rectFill.top = yCenter - 1;
rectFill.bottom = yCenter + 2;
rectFill.DeflateRect (5, 0);
}
}
else
{
if (bHorz)
{
rectFill.DeflateRect (4, 0);
}
else
{
rectFill.DeflateRect (4, 0);
}
bHorz = !bHorz;
}
COLORREF clrTextOld = pDC->SetTextColor (m_clrGripper);
COLORREF clrBkOld = pDC->SetBkColor (bSideBar || bMenuBar ?
globalData.clrBarFace : m_clrBarBkgnd);
pDC->FillRect (rectFill, bHorz ? &m_brGripperHorz : &m_brGripperVert);
if (bSideBar)
{
//------------------
// Draw bar caption:
//------------------
int nOldBkMode = pDC->SetBkMode (OPAQUE);
pDC->SetTextColor (globalData.clrBarText);
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 CBCGPVisualManagerXP::OnDrawMenuBorder (CDC* pDC, CBCGPPopupMenu* pMenu, CRect rect)
{
ASSERT_VALID (pDC);
ASSERT_VALID (pMenu);
pDC->Draw3dRect (rect, m_clrMenuBorder, m_clrMenuBorder);
rect.DeflateRect (1, 1);
pDC->Draw3dRect (rect, m_clrMenuLight, m_clrMenuLight);
CRect rectLeft (1, 1, 2, rect.bottom - 1);
pDC->FillRect (rectLeft, &m_brBarBkgnd);
//------------------------------------------------
// Quick Customize Office XP like draw popup menu
//------------------------------------------------
CBCGPPopupMenu* pParentPopup = pMenu->GetParentPopupMenu();
if (pParentPopup != NULL)
{
if (pParentPopup->IsQuickCustomize())
{
CBCGPToolbarMenuButton* pParentBtn = pMenu->GetParentButton();
if ((pParentBtn != NULL) && (pParentBtn->IsQuickMode()))
{
CBCGPPopupMenu* pParent = (CBCGPPopupMenu*)pMenu->GetParentPopupMenu();
CRect rcParent;
pParent->GetWindowRect(rcParent);
CRect rcCurrent;
pMenu->GetWindowRect(rcCurrent);
CBCGPToolbarMenuButton* pBtn = pMenu->GetMenuItem(0);
CRect rcButton = pBtn->Rect();
CRect rectBorder;
rectBorder.SetRectEmpty();
if (rcParent.left > rcCurrent.left)
{
rectBorder.SetRect(rect.right-1 , rect.top, rect.right+ 1, rcButton.bottom - 4);
}
else
{
rectBorder.SetRect(rect.left - 1 , rect.top, rect.left + 1 , rcButton.bottom - 4);
}
pDC->FillRect (rectBorder, &m_brBarBkgnd);
}
}
}
if (!CBCGPToolBar::IsCustomizeMode ())
{
//-------------------------------------
// "Connect" menu to the parent button:
//-------------------------------------
CBCGPToolbarMenuButton* pParentMenuBtn = pMenu->GetParentButton ();
if (m_bConnectMenuToParent &&
pParentMenuBtn != NULL && pMenu->GetParentPopupMenu () == NULL &&
pParentMenuBtn->IsBorder ())
{
CRect rectConnect;
rectConnect.SetRectEmpty ();
CRect rectParent = pParentMenuBtn->Rect ();
CWnd* pWnd = pParentMenuBtn->GetParentWnd();
pWnd->ClientToScreen(rectParent);
pMenu->ScreenToClient(&rectParent);
switch (pMenu->GetDropDirection ())
{
case CBCGPPopupMenu::DROP_DIRECTION_BOTTOM:
rectConnect = CRect (rectParent.left + 1, rect.top - 1, rectParent.right - 2, rect.top);
if (rectConnect.Width () > rect.Width () + 2)
{
return;
}
break;
case CBCGPPopupMenu::DROP_DIRECTION_TOP:
rectConnect = CRect (rectParent.left + 1, rect.bottom, rectParent.right - 2, rect.bottom + 1);
if (rectConnect.Width () > rect.Width () + 2)
{
return;
}
break;
case CBCGPPopupMenu::DROP_DIRECTION_RIGHT:
rectConnect = CRect (rect.left - 1, rectParent.top + 1, rect.left, rectParent.bottom - 2);
if (rectConnect.Height () > rect.Height () + 2)
{
return;
}
break;
case CBCGPPopupMenu::DROP_DIRECTION_LEFT:
rectConnect = CRect (rect.right, rectParent.top + 1, rect.right + 1, rectParent.bottom - 2);
if (rectConnect.Height () > rect.Height () + 2)
{
return;
}
break;
}
CRect rectBorder = rect;
rectBorder.InflateRect (1, 1);
rectConnect.IntersectRect (&rectConnect, &rectBorder);
rectParent.InflateRect (1, 1);
rectConnect.IntersectRect (&rectConnect, &rectParent);
pDC->FillRect (rectConnect, &m_brBarBkgnd);
}
}
}
//****************************************************************************************
void CBCGPVisualManagerXP::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);
if (rectExclude.IsRectNull())
{
//------------------------
// Simple draw the shadow:
//------------------------
CBCGPDrawManager dm (*pPaintDC);
dm.DrawShadow (rectClient, nDepth, iMinBrightness, iMaxBrightness,
pBmpSaveBottom, pBmpSaveRight, m_clrMenuShadowBase);
}
else
{
//--------------------------------------------
// Copy screen content into the memory bitmap:
//--------------------------------------------
CDC dcMem;
if (!dcMem.CreateCompatibleDC (pPaintDC))
{
ASSERT (FALSE);
return;
}
//--------------------------------------------
// Gets the whole menu and changes the shadow.
//--------------------------------------------
CRect rectBmp (0, 0, rectClient.Width(), rectClient.Height());
int cx = rectBmp.Width() + nDepth;
int cy = rectBmp.Height() + nDepth;
CBitmap bmpMem;
if (!bmpMem.CreateCompatibleBitmap (pPaintDC, cx, cy))
{
ASSERT (FALSE);
return;
}
CBitmap* pOldBmp = dcMem.SelectObject(&bmpMem);
ASSERT (pOldBmp != NULL);
dcMem.BitBlt (0, 0, cx, cy, pPaintDC, rectClient.left, rectClient.top, SRCCOPY);
//-----------------
// Draw the shadow:
//-----------------
CBCGPDrawManager dm (dcMem);
dm.DrawShadow (rectBmp, nDepth, iMinBrightness, iMaxBrightness,
pBmpSaveBottom, pBmpSaveRight, m_clrMenuShadowBase);
//------------------------------------------
// Do not cover rectExclude with the shadow:
//------------------------------------------
dcMem.BitBlt (rectExclude.left - rectClient.left, rectExclude.top - rectClient.top,
rectExclude.Width(), rectExclude.Height(),
pPaintDC, rectExclude.left, rectExclude.top, SRCCOPY);
//-----------------------------------------
// Copy shadowed bitmap back to the screen:
//-----------------------------------------
pPaintDC->BitBlt (rectClient.left, rectClient.top, cx, cy, &dcMem, 0, 0, SRCCOPY);
dcMem.SelectObject(pOldBmp);
}
}
//****************************************************************************************
void CBCGPVisualManagerXP::OnDrawBarBorder (CDC* pDC, CBCGPBaseControlBar* pBar, CRect& rect)
{
ASSERT_VALID(pBar);
ASSERT_VALID(pDC);
if (pBar->IsDialogControl ())
{
CBCGPVisualManager::OnDrawBarBorder (pDC, pBar, rect);
return;
}
DWORD dwBarStyle = pBar->GetBarStyle ();
if (!(dwBarStyle & CBRS_BORDER_ANY))
{
return;
}
COLORREF clrBckOld = pDC->GetBkColor (); // FillSolidRect changes it
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -