#if !defined(__SPCOLORMANAGER_H__)
#define __SPCOLORMANAGER_H__
#if _MSC_VER > 1000
#pragma once
#endif
//功能:当前XP风格的类型。
enum SPCurrentSystemTheme
{
SPSystemThemeUnknown ,
SPSystemThemeBlue ,
SPSystemThemeOlive ,
SPSystemThemeSilver ,
SPSystemThemeAuto ,
SPSystemThemeDefault
};
#ifndef COLOR_GRADIENTACTIVECAPTION
#define COLOR_GRADIENTACTIVECAPTION 27
#endif
#ifndef COLOR_GRADIENTINACTIVECAPTION
#define COLOR_GRADIENTINACTIVECAPTION 28
#endif
const UINT XPCOLOR_BASE = 30;
const UINT XPCOLOR_TOOLBAR_FACE = XPCOLOR_BASE;
const UINT XPCOLOR_HIGHLIGHT = 31;
const UINT XPCOLOR_HIGHLIGHT_BORDER = 32;
const UINT XPCOLOR_HIGHLIGHT_PUSHED = 33;
const UINT XPCOLOR_HIGHLIGHT_CHECKED = 36;
const UINT XPCOLOR_HIGHLIGHT_CHECKED_BORDER = 37;
const UINT XPCOLOR_ICONSHADDOW = 34;
const UINT XPCOLOR_GRAYTEXT = 35;
const UINT XPCOLOR_TOOLBAR_GRIPPER = 38;
const UINT XPCOLOR_SEPARATOR = 39;
const UINT XPCOLOR_DISABLED = 40;
const UINT XPCOLOR_MENUBAR_FACE = 41;
const UINT XPCOLOR_MENUBAR_EXPANDED = 42;
const UINT XPCOLOR_MENUBAR_BORDER = 43;
const UINT XPCOLOR_MENUBAR_TEXT = 44;
const UINT XPCOLOR_HIGHLIGHT_TEXT = 45;
const UINT XPCOLOR_TOOLBAR_TEXT = 46;
const UINT XPCOLOR_PUSHED_TEXT = 47;
const UINT XPCOLOR_TAB_INACTIVE_BACK = 48;
const UINT XPCOLOR_TAB_INACTIVE_TEXT = 49;
const UINT XPCOLOR_HIGHLIGHT_PUSHED_BORDER = 50;
const UINT XPCOLOR_CHECKED_TEXT = XPCOLOR_HIGHLIGHT_TEXT;
const UINT XPCOLOR_3DFACE = 51;
const UINT XPCOLOR_3DSHADOW = 52;
const UINT XPCOLOR_EDITCTRLBORDER = 53;
const UINT XPCOLOR_FRAME = 54;
const UINT XPCOLOR_SPLITTER_FACE = 55;
const UINT XPCOLOR_LABEL = 56;
const UINT XPCOLOR_STATICFRAME = 57;
const UINT XPCOLOR_LAST = 57;
//功能:绘制颜色封装。
class CSPPaintManagerColor
{
public:
CSPPaintManagerColor()
{
m_clrStandardValue = m_clrCustomValue = ( COLORREF ) - 1;
}
BOOL IsDefaultValue()
{
return ( m_clrCustomValue == ( COLORREF ) - 1 ) && ( m_clrStandardValue == ( COLORREF ) - 1 );
}
COLORREF GetStandardColor()
{
return m_clrStandardValue;
}
void SetCustomValue( COLORREF clr )
{
m_clrCustomValue = clr;
}
void SetStandardValue( COLORREF clr )
{
m_clrStandardValue = clr;
}
void SetDefaultValue()
{
m_clrCustomValue = ( COLORREF ) - 1;
}
operator COLORREF()
{
return ( m_clrCustomValue == ( COLORREF ) - 1 ) ? m_clrStandardValue : m_clrCustomValue;
}
const CSPPaintManagerColor & operator=( COLORREF clr )
{
SetCustomValue( clr );
return *this;
}
protected:
COLORREF m_clrStandardValue;
COLORREF m_clrCustomValue;
};
//功能:辅助类,用来绘制渐变色。
class CSPPaintManagerColorGradient
{
public:
void SetStandardValue( COLORREF clrLight , COLORREF clrDark );
void SetCustomValue( COLORREF clrLight , COLORREF clrDark );
void SetStandardValue( const COLORREF & clr );
public:
CSPPaintManagerColor clrLight; //亮色
CSPPaintManagerColor clrDark; //暗色
};
//功能:用来管理系统颜色。
class CSPColorManager : public CCmdTarget
{
public:
typedef DWORD ( __stdcall *PFNGETSYSCOLOR )( int nIndex );
public:
//功能:
// 用来更新颜色值。
void RefreshColors( BOOL bInit = FALSE );
//功能:
//获取窗口指定部分的颜色
//参数:
// nIndex - 指定要获取颜色的部分
//
//常量 数值 描述
//-------------------------------- ============ ------------------------------------------------------------
//COLOR_SCROLLBAR 0 滚动条颜色
//COLOR_BACKGROUND 1 桌面颜色
//COLOR_ACTIVECAPTION 2 活动标题栏颜色
//COLOR_INACTIVECAPTION 3 非活动标题栏颜色
//COLOR_MENU 4 菜单背景色
//COLOR_WINDOW 5 窗口背景色
//COLOR_WINDOWFRAME 6 窗口框架色
//COLOR_MENUTEXT 7 菜单文本颜色
//COLOR_WINDOWTEXT 8 窗口文本颜色
//COLOR_CAPTIONTEXT 9 标题栏文本颜色
//COLOR_ACTIVEBORDER 10 活动窗口边框颜色
//COLOR_INACTIVEBORDER 11 非活动窗口边框颜色
//COLOR_APPWORKSPACE 12 背景色MDI程序
//COLOR_HIGHLIGHT 13 被选项颜色
//COLOR_HIGHLIGHTTEXT 14 被选项文本颜色
//COLOR_BTNFACE 15 三维显示色活对话框背景色
//COLOR_BTNSHADOW 16 命令按钮边阴影颜色
//COLOR_GRAYTEXT 17 灰色文本色
//COLOR_BTNTEXT 18 按钮文本色
//COLOR_INACTIVECAPTIONTEXT 19 非活动标题栏颜色
//COLOR_BTNHIGHLIGHT 20 三维显示高亮颜色
//COLOR_3DDKSHADOW 21 三维显示暗阴影色
//COLOR_3DLIGHT 22 三位亮色
//COLOR_INFOTEXT 23 提示栏文本色
//COLOR_INFOBK 24 提示栏背景色
//COLOR_HOTLIGHT 26 热点颜色
//COLOR_GRADIENTACTIVECAPTION 27 窗口标题栏右边渐变颜色
//COLOR_GRADIENTINACTIVECAPTION 28 非窗口标题栏右边渐变颜色
//XPCOLOR_TOOLBAR_FACE 30 XP工具栏背景色
//XPCOLOR_HIGHLIGHT 31 XP被选菜单项颜色
//XPCOLOR_HIGHLIGHT_BORDER 32 XP被选菜单项边框色
//XPCOLOR_HIGHLIGHT_PUSHED 33 XP菜单项弹出色
//XPCOLOR_HIGHLIGHT_CHECKED 36 XP菜单项被选色
//XPCOLOR_HIGHLIGHT_CHECKED_BORDER 37 被选菜单项边框色
//XPCOLOR_ICONSHADDOW 34 XP菜单项图标阴影色
//XPCOLOR_GRAYTEXT 35 XP禁止菜单项文本色
//XPCOLOR_TOOLBAR_GRIPPER 38 XP工具栏gripper色
//XPCOLOR_SEPARATOR 39 XP工具栏分隔符颜色
//XPCOLOR_DISABLED 40 XP菜单图标禁止颜色
//XPCOLOR_MENUBAR_FACE 41 XP菜单项文本背景颜色
//XPCOLOR_MENUBAR_EXPANDED 42 XP隐藏菜单背景色
//XPCOLOR_MENUBAR_BORDER 43 XP菜单边框色
//XPCOLOR_MENUBAR_TEXT 44 XP菜单项文本色
//XPCOLOR_HIGHLIGHT_TEXT 45 XP选择菜单项文本色
//XPCOLOR_TOOLBAR_TEXT 46 XP工具栏文本色
//XPCOLOR_PUSHED_TEXT 47 XP工具栏选择文本色
//XPCOLOR_TAB_INACTIVE_BACK 48 XP 非活动tab背景色
//XPCOLOR_TAB_INACTIVE_TEXT 49 XP 非活动tab文本颜色
//XPCOLOR_HIGHLIGHT_PUSHED_BORDER 50 三维项边框颜色
//XPCOLOR_CHECKED_TEXT 45 被选按钮文本颜色
//XPCOLOR_3DFACE 51 三维外观颜色
//XPCOLOR_3DSHADOW 52 三维外观阴影颜色
//XPCOLOR_EDITCTRLBORDER 53 EDIT控件边框颜色
//XPCOLOR_FRAME 54 Office 2003 框架颜色
//XPCOLOR_SPLITTER_FACE 55 XP splitter颜色
//XPCOLOR_LABEL 56 标签颜色
//XPCOLOR_STATICFRAME 57 WinXP静态控件颜色
//
COLORREF GetColor( int nIndex );
//功能:渲染亮色和暗色。
COLORREF LightColor( COLORREF clrLight , COLORREF clrDark , int nDelta );
//功能:禁用luna (Blue, Olive and Green)颜色
void DisableLunaColors( BOOL bDisable = TRUE );
//功能:是否禁用luna (Blue, Olive and Green)颜色
BOOL IsLunaColorsDisabled();
//功能:自定义指定的颜色。
void SetColor( int nIndex , COLORREF clrValue );
//功能:自定义颜色。
void SetColors( int cElements , const int * lpaElements , const COLORREF * lpaRgbValues );
//功能:判断当前使用的风格。
SPCurrentSystemTheme GetCurrentSystemTheme();
//功能:获取当前在使用的Windows XP风格。
SPCurrentSystemTheme GetWinThemeWrapperTheme();
//功能:设置当前风格。
void SetLunaTheme( SPCurrentSystemTheme systemTheme );
//功能: 替换系统定义的颜色获取函数。
void SetGetSysColorPtr( PFNGETSYSCOLOR pfnGetSysColor );
private:
CSPColorManager();
void RefreshSysColors();
void RefreshXPColors();
void RefreshGradientColors();
float ColorWidth( int nLength , int nWidth );
float ColorDelta( COLORREF clrA , COLORREF clrB );
float Length( COLORREF clrA , COLORREF clrB );
BOOL LongColor( COLORREF clrMain , COLORREF clrSub , BOOL bCalcLength , float fDistance );
COLORREF MixColor( COLORREF clrMain , COLORREF clrSub , float fDistance );
COLORREF AdjustColor( COLORREF clrMain , COLORREF clrSub , float fDistance );
double GetRDelta( COLORREF clr );
double GetGDelta( COLORREF clr );
double GetBDelta( COLORREF clr );
//singleton, instantiate on demand.
static CSPColorManager& AFX_CDECL Instance();
public:
CSPPaintManagerColorGradient grcCaption; //Caption gradient color.
CSPPaintManagerColorGradient grcDockBar; //Dockbar gradient color.
CSPPaintManagerColorGradient grcShortcutBarGripper; //Shortcut bar gripper.
CSPPaintManagerColorGradient grcToolBar; //ToolBar gradient color.
private:
BOOL m_bInit;
BOOL m_bDisableLunaColors;
COLORREF m_arrStandardColor[XPCOLOR_LAST + 1];
COLORREF m_arrCustomColor[XPCOLOR_LAST + 1];
PFNGETSYSCOLOR m_pfnGetSysColor;
SPCurrentSystemTheme m_systemTheme;
friend CSPColorManager * SPColorManager();
};
CSPColorManager * SPColorManager();
//功能:获取指定的颜色。
COLORREF GetXtremeColor( UINT nIndex );
AFX_INLINE COLORREF GetXtremeColor( UINT nIndex )
{
return SPColorManager()->GetColor( nIndex );
}
AFX_INLINE CSPColorManager * SPColorManager()
{
return &CSPColorManager::Instance();
}
#endif