/******************************************** ** 工作室:S&P工作室 ** 作者 :张东斌 ** 日期 :2006年3月 *********************************************/ #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