SPColorManager.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. #if !defined(__SPCOLORMANAGER_H__)
  2. #define __SPCOLORMANAGER_H__
  3. #if _MSC_VER > 1000
  4. #pragma once
  5. #endif
  6. //功能:当前XP风格的类型。
  7. enum SPCurrentSystemTheme
  8. {
  9. SPSystemThemeUnknown ,
  10. SPSystemThemeBlue ,
  11. SPSystemThemeOlive ,
  12. SPSystemThemeSilver ,
  13. SPSystemThemeAuto ,
  14. SPSystemThemeDefault
  15. };
  16. #ifndef COLOR_GRADIENTACTIVECAPTION
  17. #define COLOR_GRADIENTACTIVECAPTION 27
  18. #endif
  19. #ifndef COLOR_GRADIENTINACTIVECAPTION
  20. #define COLOR_GRADIENTINACTIVECAPTION 28
  21. #endif
  22. const UINT XPCOLOR_BASE = 30;
  23. const UINT XPCOLOR_TOOLBAR_FACE = XPCOLOR_BASE;
  24. const UINT XPCOLOR_HIGHLIGHT = 31;
  25. const UINT XPCOLOR_HIGHLIGHT_BORDER = 32;
  26. const UINT XPCOLOR_HIGHLIGHT_PUSHED = 33;
  27. const UINT XPCOLOR_HIGHLIGHT_CHECKED = 36;
  28. const UINT XPCOLOR_HIGHLIGHT_CHECKED_BORDER = 37;
  29. const UINT XPCOLOR_ICONSHADDOW = 34;
  30. const UINT XPCOLOR_GRAYTEXT = 35;
  31. const UINT XPCOLOR_TOOLBAR_GRIPPER = 38;
  32. const UINT XPCOLOR_SEPARATOR = 39;
  33. const UINT XPCOLOR_DISABLED = 40;
  34. const UINT XPCOLOR_MENUBAR_FACE = 41;
  35. const UINT XPCOLOR_MENUBAR_EXPANDED = 42;
  36. const UINT XPCOLOR_MENUBAR_BORDER = 43;
  37. const UINT XPCOLOR_MENUBAR_TEXT = 44;
  38. const UINT XPCOLOR_HIGHLIGHT_TEXT = 45;
  39. const UINT XPCOLOR_TOOLBAR_TEXT = 46;
  40. const UINT XPCOLOR_PUSHED_TEXT = 47;
  41. const UINT XPCOLOR_TAB_INACTIVE_BACK = 48;
  42. const UINT XPCOLOR_TAB_INACTIVE_TEXT = 49;
  43. const UINT XPCOLOR_HIGHLIGHT_PUSHED_BORDER = 50;
  44. const UINT XPCOLOR_CHECKED_TEXT = XPCOLOR_HIGHLIGHT_TEXT;
  45. const UINT XPCOLOR_3DFACE = 51;
  46. const UINT XPCOLOR_3DSHADOW = 52;
  47. const UINT XPCOLOR_EDITCTRLBORDER = 53;
  48. const UINT XPCOLOR_FRAME = 54;
  49. const UINT XPCOLOR_SPLITTER_FACE = 55;
  50. const UINT XPCOLOR_LABEL = 56;
  51. const UINT XPCOLOR_STATICFRAME = 57;
  52. const UINT XPCOLOR_LAST = 57;
  53. //功能:绘制颜色封装。
  54. class CSPPaintManagerColor
  55. {
  56. public:
  57. CSPPaintManagerColor()
  58. {
  59. m_clrStandardValue = m_clrCustomValue = ( COLORREF ) - 1;
  60. }
  61. BOOL IsDefaultValue()
  62. {
  63. return ( m_clrCustomValue == ( COLORREF ) - 1 ) && ( m_clrStandardValue == ( COLORREF ) - 1 );
  64. }
  65. COLORREF GetStandardColor()
  66. {
  67. return m_clrStandardValue;
  68. }
  69. void SetCustomValue( COLORREF clr )
  70. {
  71. m_clrCustomValue = clr;
  72. }
  73. void SetStandardValue( COLORREF clr )
  74. {
  75. m_clrStandardValue = clr;
  76. }
  77. void SetDefaultValue()
  78. {
  79. m_clrCustomValue = ( COLORREF ) - 1;
  80. }
  81. operator COLORREF()
  82. {
  83. return ( m_clrCustomValue == ( COLORREF ) - 1 ) ? m_clrStandardValue : m_clrCustomValue;
  84. }
  85. const CSPPaintManagerColor & operator=( COLORREF clr )
  86. {
  87. SetCustomValue( clr );
  88. return *this;
  89. }
  90. protected:
  91. COLORREF m_clrStandardValue;
  92. COLORREF m_clrCustomValue;
  93. };
  94. //功能:辅助类,用来绘制渐变色。
  95. class CSPPaintManagerColorGradient
  96. {
  97. public:
  98. void SetStandardValue( COLORREF clrLight , COLORREF clrDark );
  99. void SetCustomValue( COLORREF clrLight , COLORREF clrDark );
  100. void SetStandardValue( const COLORREF & clr );
  101. public:
  102. CSPPaintManagerColor clrLight; //亮色
  103. CSPPaintManagerColor clrDark; //暗色
  104. };
  105. //功能:用来管理系统颜色。
  106. class CSPColorManager : public CCmdTarget
  107. {
  108. public:
  109. typedef DWORD ( __stdcall *PFNGETSYSCOLOR )( int nIndex );
  110. public:
  111. //功能:
  112. // 用来更新颜色值。
  113. void RefreshColors( BOOL bInit = FALSE );
  114. //功能:
  115. //获取窗口指定部分的颜色
  116. //参数:
  117. // nIndex - 指定要获取颜色的部分
  118. //
  119. //<b>常量</b> <b>数值</b> <b>描述</b>
  120. //-------------------------------- ============ ------------------------------------------------------------
  121. //COLOR_SCROLLBAR 0 滚动条颜色
  122. //COLOR_BACKGROUND 1 桌面颜色
  123. //COLOR_ACTIVECAPTION 2 活动标题栏颜色
  124. //COLOR_INACTIVECAPTION 3 非活动标题栏颜色
  125. //COLOR_MENU 4 菜单背景色
  126. //COLOR_WINDOW 5 窗口背景色
  127. //COLOR_WINDOWFRAME 6 窗口框架色
  128. //COLOR_MENUTEXT 7 菜单文本颜色
  129. //COLOR_WINDOWTEXT 8 窗口文本颜色
  130. //COLOR_CAPTIONTEXT 9 标题栏文本颜色
  131. //COLOR_ACTIVEBORDER 10 活动窗口边框颜色
  132. //COLOR_INACTIVEBORDER 11 非活动窗口边框颜色
  133. //COLOR_APPWORKSPACE 12 背景色MDI程序
  134. //COLOR_HIGHLIGHT 13 被选项颜色
  135. //COLOR_HIGHLIGHTTEXT 14 被选项文本颜色
  136. //COLOR_BTNFACE 15 三维显示色活对话框背景色
  137. //COLOR_BTNSHADOW 16 命令按钮边阴影颜色
  138. //COLOR_GRAYTEXT 17 灰色文本色
  139. //COLOR_BTNTEXT 18 按钮文本色
  140. //COLOR_INACTIVECAPTIONTEXT 19 非活动标题栏颜色
  141. //COLOR_BTNHIGHLIGHT 20 三维显示高亮颜色
  142. //COLOR_3DDKSHADOW 21 三维显示暗阴影色
  143. //COLOR_3DLIGHT 22 三位亮色
  144. //COLOR_INFOTEXT 23 提示栏文本色
  145. //COLOR_INFOBK 24 提示栏背景色
  146. //COLOR_HOTLIGHT 26 热点颜色
  147. //COLOR_GRADIENTACTIVECAPTION 27 窗口标题栏右边渐变颜色
  148. //COLOR_GRADIENTINACTIVECAPTION 28 非窗口标题栏右边渐变颜色
  149. //XPCOLOR_TOOLBAR_FACE 30 XP工具栏背景色
  150. //XPCOLOR_HIGHLIGHT 31 XP被选菜单项颜色
  151. //XPCOLOR_HIGHLIGHT_BORDER 32 XP被选菜单项边框色
  152. //XPCOLOR_HIGHLIGHT_PUSHED 33 XP菜单项弹出色
  153. //XPCOLOR_HIGHLIGHT_CHECKED 36 XP菜单项被选色
  154. //XPCOLOR_HIGHLIGHT_CHECKED_BORDER 37 被选菜单项边框色
  155. //XPCOLOR_ICONSHADDOW 34 XP菜单项图标阴影色
  156. //XPCOLOR_GRAYTEXT 35 XP禁止菜单项文本色
  157. //XPCOLOR_TOOLBAR_GRIPPER 38 XP工具栏gripper色
  158. //XPCOLOR_SEPARATOR 39 XP工具栏分隔符颜色
  159. //XPCOLOR_DISABLED 40 XP菜单图标禁止颜色
  160. //XPCOLOR_MENUBAR_FACE 41 XP菜单项文本背景颜色
  161. //XPCOLOR_MENUBAR_EXPANDED 42 XP隐藏菜单背景色
  162. //XPCOLOR_MENUBAR_BORDER 43 XP菜单边框色
  163. //XPCOLOR_MENUBAR_TEXT 44 XP菜单项文本色
  164. //XPCOLOR_HIGHLIGHT_TEXT 45 XP选择菜单项文本色
  165. //XPCOLOR_TOOLBAR_TEXT 46 XP工具栏文本色
  166. //XPCOLOR_PUSHED_TEXT 47 XP工具栏选择文本色
  167. //XPCOLOR_TAB_INACTIVE_BACK 48 XP 非活动tab背景色
  168. //XPCOLOR_TAB_INACTIVE_TEXT 49 XP 非活动tab文本颜色
  169. //XPCOLOR_HIGHLIGHT_PUSHED_BORDER 50 三维项边框颜色
  170. //XPCOLOR_CHECKED_TEXT 45 被选按钮文本颜色
  171. //XPCOLOR_3DFACE 51 三维外观颜色
  172. //XPCOLOR_3DSHADOW 52 三维外观阴影颜色
  173. //XPCOLOR_EDITCTRLBORDER 53 EDIT控件边框颜色
  174. //XPCOLOR_FRAME 54 Office 2003 框架颜色
  175. //XPCOLOR_SPLITTER_FACE 55 XP splitter颜色
  176. //XPCOLOR_LABEL 56 标签颜色
  177. //XPCOLOR_STATICFRAME 57 WinXP静态控件颜色
  178. //</TABLE>
  179. COLORREF GetColor( int nIndex );
  180. //功能:渲染亮色和暗色。
  181. COLORREF LightColor( COLORREF clrLight , COLORREF clrDark , int nDelta );
  182. //功能:禁用luna (Blue, Olive and Green)颜色
  183. void DisableLunaColors( BOOL bDisable = TRUE );
  184. //功能:是否禁用luna (Blue, Olive and Green)颜色
  185. BOOL IsLunaColorsDisabled();
  186. //功能:自定义指定的颜色。
  187. void SetColor( int nIndex , COLORREF clrValue );
  188. //功能:自定义颜色。
  189. void SetColors( int cElements , const int * lpaElements , const COLORREF * lpaRgbValues );
  190. //功能:判断当前使用的风格。
  191. SPCurrentSystemTheme GetCurrentSystemTheme();
  192. //功能:获取当前在使用的Windows XP风格。
  193. SPCurrentSystemTheme GetWinThemeWrapperTheme();
  194. //功能:设置当前风格。
  195. void SetLunaTheme( SPCurrentSystemTheme systemTheme );
  196. //功能: 替换系统定义的颜色获取函数。
  197. void SetGetSysColorPtr( PFNGETSYSCOLOR pfnGetSysColor );
  198. private:
  199. CSPColorManager();
  200. void RefreshSysColors();
  201. void RefreshXPColors();
  202. void RefreshGradientColors();
  203. float ColorWidth( int nLength , int nWidth );
  204. float ColorDelta( COLORREF clrA , COLORREF clrB );
  205. float Length( COLORREF clrA , COLORREF clrB );
  206. BOOL LongColor( COLORREF clrMain , COLORREF clrSub , BOOL bCalcLength , float fDistance );
  207. COLORREF MixColor( COLORREF clrMain , COLORREF clrSub , float fDistance );
  208. COLORREF AdjustColor( COLORREF clrMain , COLORREF clrSub , float fDistance );
  209. double GetRDelta( COLORREF clr );
  210. double GetGDelta( COLORREF clr );
  211. double GetBDelta( COLORREF clr );
  212. //singleton, instantiate on demand.
  213. static CSPColorManager& AFX_CDECL Instance();
  214. public:
  215. CSPPaintManagerColorGradient grcCaption; //Caption gradient color.
  216. CSPPaintManagerColorGradient grcDockBar; //Dockbar gradient color.
  217. CSPPaintManagerColorGradient grcShortcutBarGripper; //Shortcut bar gripper.
  218. CSPPaintManagerColorGradient grcToolBar; //ToolBar gradient color.
  219. private:
  220. BOOL m_bInit;
  221. BOOL m_bDisableLunaColors;
  222. COLORREF m_arrStandardColor[XPCOLOR_LAST + 1];
  223. COLORREF m_arrCustomColor[XPCOLOR_LAST + 1];
  224. PFNGETSYSCOLOR m_pfnGetSysColor;
  225. SPCurrentSystemTheme m_systemTheme;
  226. friend CSPColorManager * SPColorManager();
  227. };
  228. CSPColorManager * SPColorManager();
  229. //功能:获取指定的颜色。
  230. COLORREF GetXtremeColor( UINT nIndex );
  231. AFX_INLINE COLORREF GetXtremeColor( UINT nIndex )
  232. {
  233. return SPColorManager()->GetColor( nIndex );
  234. }
  235. AFX_INLINE CSPColorManager * SPColorManager()
  236. {
  237. return &CSPColorManager::Instance();
  238. }
  239. #endif