XTPColorManager.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:29k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPColorManager.cpp: implementation of the CXTPColorManager class.
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include <math.h>
  22. #include "XTPVC80Helpers.h"
  23. #include "XTPWinThemeWrapper.h"
  24. #include "XTPColorManager.h"
  25. #ifdef _DEBUG
  26. #define new DEBUG_NEW
  27. #undef THIS_FILE
  28. static char THIS_FILE[] = __FILE__;
  29. #endif
  30. //===========================================================================
  31. // CXTPPaintManagerColor class
  32. //===========================================================================
  33. CXTPPaintManagerColor::CXTPPaintManagerColor()
  34. : m_clrStandardValue(COLORREF_NULL)
  35. , m_clrCustomValue(COLORREF_NULL)
  36. {
  37. }
  38. CXTPPaintManagerColor::CXTPPaintManagerColor(COLORREF clr)
  39. : m_clrStandardValue(clr)
  40. , m_clrCustomValue(COLORREF_NULL)
  41. {
  42. }
  43. void CXTPPaintManagerColor::Serialize(CArchive& ar)
  44. {
  45. if (ar.IsStoring())
  46. {
  47. ar << (DWORD)m_clrStandardValue;
  48. ar << (DWORD)m_clrCustomValue;
  49. }
  50. else
  51. {
  52. ar >> (DWORD)m_clrStandardValue;
  53. ar >> (DWORD)m_clrCustomValue;
  54. }
  55. }
  56. //===========================================================================
  57. // CXTPPaintManagerColorGradient class
  58. //===========================================================================
  59. CXTPPaintManagerColorGradient::CXTPPaintManagerColorGradient()
  60. {
  61. fGradientFactor = 0.5f;
  62. }
  63. CXTPPaintManagerColorGradient::CXTPPaintManagerColorGradient(const CXTPPaintManagerColor clr)
  64. {
  65. clrLight = clr;
  66. clrDark = clr;
  67. fGradientFactor = 0.5f;
  68. }
  69. CXTPPaintManagerColorGradient::CXTPPaintManagerColorGradient(const COLORREF clr)
  70. {
  71. fGradientFactor = 0.5f;
  72. SetStandardValue(clr);
  73. }
  74. CXTPPaintManagerColorGradient::CXTPPaintManagerColorGradient(COLORREF clrLight, COLORREF clrDark)
  75. {
  76. fGradientFactor = 0.5f;
  77. SetStandardValue(clrLight, clrDark);
  78. }
  79. //---------------------------------------------------------------------------
  80. // Settings for standard values
  81. //---------------------------------------------------------------------------
  82. void CXTPPaintManagerColorGradient::SetStandardValue(const COLORREF clr)
  83. {
  84. SetStandardValue(clr, clr);
  85. }
  86. void CXTPPaintManagerColorGradient::SetStandardValue(COLORREF _clrLight, COLORREF _clrDark, float _fGradientFactor)
  87. {
  88. clrLight.SetStandardValue(_clrLight);
  89. clrDark.SetStandardValue(_clrDark);
  90. fGradientFactor = _fGradientFactor;
  91. }
  92. void CXTPPaintManagerColorGradient::SetStandardValue(CXTPPaintManagerColorGradient& clr)
  93. {
  94. clrLight.SetStandardValue(clr.clrLight);
  95. clrDark.SetStandardValue(clr.clrDark);
  96. fGradientFactor = clr.fGradientFactor;
  97. }
  98. //---------------------------------------------------------------------------
  99. // Settings for custom values
  100. //---------------------------------------------------------------------------
  101. void CXTPPaintManagerColorGradient::SetCustomValue(const COLORREF clr)
  102. {
  103. SetCustomValue(clr, clr);
  104. }
  105. void CXTPPaintManagerColorGradient::SetCustomValue(CXTPPaintManagerColorGradient& clr)
  106. {
  107. clrLight.SetCustomValue(clr.clrLight);
  108. clrDark.SetCustomValue(clr.clrDark);
  109. fGradientFactor = clr.fGradientFactor;
  110. }
  111. void CXTPPaintManagerColorGradient::SetCustomValue(COLORREF _clrLight, COLORREF _clrDark)
  112. {
  113. clrLight.SetCustomValue(_clrLight);
  114. clrDark.SetCustomValue(_clrDark);
  115. }
  116. void CXTPPaintManagerColorGradient::Serialize(CArchive& ar)
  117. {
  118. clrLight.Serialize(ar);
  119. clrDark.Serialize(ar);
  120. if (ar.IsStoring())
  121. {
  122. ar << fGradientFactor;
  123. }
  124. else
  125. {
  126. ar >> fGradientFactor;
  127. }
  128. }
  129. //===========================================================================
  130. // CXTPColorManager class
  131. //===========================================================================
  132. #pragma warning(disable  : 4244)
  133. #define clrToolBar GetColor(XPCOLOR_TOOLBAR_FACE)
  134. #define clrWindow GetColor(COLOR_WINDOW)
  135. #define clrHighlight GetColor(COLOR_HIGHLIGHT)
  136. #define pow2(x) pow(x, 2)
  137. #define NORMVALUE(a, b) a = (a < 0) ? 0 : (a > b) ? b : a
  138. CXTPColorManager::CXTPColorManager()
  139. {
  140. m_bDisableLunaColors = FALSE;
  141. m_systemTheme = xtpSystemThemeAuto;
  142. m_winThemeWrapperTheme = xtpSystemThemeUnknown;
  143. m_pfnGetSysColor = 0;
  144. m_bEnableLunaBlueForRoyaleTheme = TRUE;
  145. m_bEnableLunaBlueForAeroTheme = TRUE;
  146. for (int i = 0; i <= XPCOLOR_LAST; i++)
  147. m_arrCustomColor[i] = m_arrLunaColor[i] = COLORREF_NULL;
  148. RefreshColors();
  149. grcLunaChecked.SetStandardValue(RGB(255, 213, 140), RGB(255, 173, 85));
  150. grcLunaPushed.SetStandardValue(RGB(254, 142, 75), RGB(255, 207, 139));
  151. grcLunaSelected.SetStandardValue(RGB(255, 242, 200), RGB(255, 212, 151));
  152. }
  153. CXTPColorManager& AFX_CDECL CXTPColorManager::Instance()
  154. {
  155. static CXTPColorManager instance;
  156. return instance;
  157. }
  158. float CXTPColorManager::ColorWidth(int nLength, int nWidth)
  159. {
  160. if (nLength > 220) nLength = 220;
  161. return (2.0 - (float)nLength / 220) * nWidth;
  162. }
  163. float CXTPColorManager::ColorDelta(COLORREF clrA, COLORREF clrB)
  164. {
  165. return pow2(GetRDelta(clrA) - GetRDelta(clrB)) +
  166. pow2(GetGDelta(clrA) - GetGDelta(clrB)) +
  167. pow2(GetBDelta(clrA) - GetBDelta(clrB));
  168. }
  169. float CXTPColorManager::Length(COLORREF clrA, COLORREF clrB)
  170. {
  171. return sqrt(ColorDelta(clrA, clrB));
  172. }
  173. BOOL CXTPColorManager::LongColor(COLORREF clrMain, COLORREF clrSub, BOOL bCalcLength, float fDistance)
  174. {
  175. if (bCalcLength)
  176. fDistance = ColorWidth(Length(clrMain, 0), fDistance);
  177. return pow2(fDistance) < ColorDelta(clrMain, clrSub);
  178. }
  179. COLORREF CXTPColorManager::MixColor(COLORREF clrMain, COLORREF clrSub, float fDistance)
  180. {
  181. float fMainLength = Length(clrMain, 0);
  182. float fGate = ColorWidth(fMainLength, fDistance);
  183. BOOL bReverse = TRUE;
  184. if (Length(clrSub, 0) > fMainLength)
  185. {
  186. if (fMainLength > 442 - fGate)
  187. bReverse = FALSE;
  188. }
  189. else
  190. {
  191. if (fMainLength > fGate)
  192. bReverse = FALSE;
  193. }
  194. float fSubRed = GetRDelta(clrSub);
  195. float fSubGreen = GetGDelta(clrSub);
  196. float fSubBlue = GetBDelta(clrSub);
  197. float fMainRed = GetRDelta(clrMain);
  198. float fMainGreen = GetGDelta(clrMain);
  199. float fMainBlue = GetBDelta(clrMain);
  200. if (bReverse)
  201. {
  202. fSubRed = 195.0 - fSubRed;
  203. fSubGreen = 390.0 - fSubGreen;
  204. fSubBlue = 65.0 - fSubBlue;
  205. fMainRed = 195.0 - fMainRed;
  206. fMainGreen = 390.0 - fMainGreen;
  207. fMainBlue = 65.0 - fMainBlue;
  208. }
  209. float A = __max(0.001, sqrt(pow2(fSubRed) + pow2(fSubGreen) + pow2(fSubBlue)));
  210. float B = fMainRed * fSubRed + fMainGreen * fSubGreen + fMainBlue * fSubBlue;
  211. float X = B / pow2(A);
  212. float fR = X * fSubRed - fMainRed;
  213. float fG = X * fSubGreen - fMainGreen;
  214. float fB = X * fSubBlue - fMainBlue;
  215. float Y = sqrt(pow2(fGate) - (pow2(fR) + pow2(fG) + pow2(fB)));
  216. float Z = (B / A - Y);
  217. fR = Z * fSubRed / A;
  218. fG = Z * fSubGreen / A;
  219. fB = Z * fSubBlue / A;
  220. if (bReverse)
  221. {
  222. fR = 195.0 - fR;
  223. fG = 390.0 - fG;
  224. fB = 65.0 - fB;
  225. }
  226. NORMVALUE(fR, 195.0);
  227. NORMVALUE(fG, 390.0);
  228. NORMVALUE(fB, 65.0);
  229. int nR = int(.5 + fR * (255.0/195.0));
  230. int nG = int(.5 + fG * (255.0/390.0));
  231. int nB = int(.5 + fB * (255.0/65.0));
  232. return RGB(NORMVALUE(nR, 255), NORMVALUE(nG, 255), NORMVALUE(nB, 255));
  233. }
  234. COLORREF CXTPColorManager::AdjustColor(COLORREF clrMain, COLORREF clrSub, float fDistance)
  235. {
  236. float Z = sqrt(
  237. pow2(GetRDelta(clrMain) - GetRDelta(clrSub)) +
  238. pow2(GetGDelta(clrMain) - GetGDelta(clrSub)) +
  239. pow2(GetBDelta(clrMain) - GetBDelta(clrSub)));
  240. float Q = (Z - ColorWidth(Length(0, clrMain), fDistance)) / Z;
  241. float fR = Q * (GetRDelta(clrMain) - GetRDelta(clrSub)) + GetRDelta(clrSub);
  242. float fG = Q * (GetGDelta(clrMain) - GetGDelta(clrSub)) + GetGDelta(clrSub);
  243. float fB = Q * (GetBDelta(clrMain) - GetBDelta(clrSub)) + GetBDelta(clrSub);
  244. NORMVALUE(fR, 195.0);
  245. NORMVALUE(fG, 390.0);
  246. NORMVALUE(fB, 65.0);
  247. int nR = int(.5 + fR * (255.0/195.0));
  248. int nG = int(.5 + fG * (255.0/390.0));
  249. int nB = int(.5 + fB * (255.0/65.0));
  250. return RGB(NORMVALUE(nR, 255), NORMVALUE(nG, 255), NORMVALUE(nB, 255));
  251. }
  252. COLORREF CXTPColorManager::LightColor(COLORREF clrLight, COLORREF clrDark, int nDelta) const
  253. {
  254. int nParam = (nDelta < 100 ? 100 : 1000);
  255. int nR = (GetRValue(clrDark) * (nParam - nDelta) + nParam / 2 +  GetRValue(clrLight) * nDelta) / nParam;
  256. int nG = (GetGValue(clrDark) * (nParam - nDelta) + nParam / 2 +  GetGValue(clrLight) * nDelta) / nParam;
  257. int nB = (GetBValue(clrDark) * (nParam - nDelta) + nParam / 2 +  GetBValue(clrLight) * nDelta) / nParam;
  258. return RGB(nR, nG, nB);
  259. }
  260. COLORREF CXTPColorManager::GetColor(int nIndex) const
  261. {
  262. if (nIndex > XPCOLOR_LAST) return nIndex;
  263. return m_arrCustomColor[nIndex] == COLORREF_NULL ? m_arrStandardColor[nIndex]: m_arrCustomColor[nIndex];
  264. }
  265. void CXTPColorManager::RefreshSysColors()
  266. {
  267. m_arrStandardColor[0] = 0;
  268. for (int i = 1; i < 30; i++) m_arrStandardColor[i] = (m_pfnGetSysColor != 0 ? (*m_pfnGetSysColor)(i) : GetSysColor(i));
  269. }
  270. void CXTPColorManager::SetGetSysColorPtr(PFNGETSYSCOLOR pfnGetSysColor)
  271. {
  272. m_pfnGetSysColor = pfnGetSysColor;
  273. RefreshColors();
  274. }
  275. void CXTPColorManager::RefreshXPColors()
  276. {
  277. COLORREF clr3DFace = GetColor(COLOR_3DFACE);
  278. COLORREF clr3DShadow = GetColor(COLOR_3DSHADOW);
  279. m_arrStandardColor[XPCOLOR_TOOLBAR_FACE] = clr3DFace;
  280. m_arrStandardColor[XPCOLOR_HIGHLIGHT] = GetColor(COLOR_WINDOW);
  281. m_arrStandardColor[XPCOLOR_HIGHLIGHT_PUSHED] = GetColor(COLOR_HIGHLIGHT);
  282. m_arrStandardColor[XPCOLOR_MENUBAR_FACE] = GetColor(COLOR_WINDOW);
  283. m_arrStandardColor[XPCOLOR_MENUBAR_GRAYTEXT] = GetColor(COLOR_GRAYTEXT);
  284. m_arrStandardColor[XPCOLOR_TOOLBAR_GRIPPER] = clr3DShadow;
  285. m_arrStandardColor[XPCOLOR_SEPARATOR] = clr3DShadow;
  286. m_arrStandardColor[XPCOLOR_MENUBAR_BORDER] = clr3DShadow;
  287. m_arrStandardColor[XPCOLOR_FLOATBAR_BORDER] = clr3DShadow;
  288. m_arrStandardColor[XPCOLOR_DISABLED] = clr3DShadow;
  289. m_arrStandardColor[XPCOLOR_HIGHLIGHT_CHECKED] = GetColor(COLOR_WINDOW);
  290. m_arrStandardColor[XPCOLOR_HIGHLIGHT_BORDER] = GetColor(COLOR_HIGHLIGHT);
  291. m_arrStandardColor[XPCOLOR_HIGHLIGHT_CHECKED_BORDER] = GetColor(COLOR_HIGHLIGHT);
  292. m_arrStandardColor[XPCOLOR_MENUBAR_TEXT] = GetColor(COLOR_WINDOWTEXT);
  293. m_arrStandardColor[XPCOLOR_HIGHLIGHT_TEXT] = GetColor(COLOR_MENUTEXT);
  294. m_arrStandardColor[XPCOLOR_TOOLBAR_TEXT] = GetColor(COLOR_BTNTEXT);
  295. m_arrStandardColor[XPCOLOR_PUSHED_TEXT] = GetColor(COLOR_HIGHLIGHTTEXT);
  296. m_arrStandardColor[XPCOLOR_TAB_INACTIVE_BACK] = clr3DShadow;
  297. m_arrStandardColor[XPCOLOR_TAB_INACTIVE_TEXT] = GetColor(COLOR_HIGHLIGHTTEXT);
  298. m_arrStandardColor[XPCOLOR_MENUBAR_EXPANDED] = clr3DShadow;
  299. m_arrStandardColor[XPCOLOR_HIGHLIGHT_PUSHED_BORDER] = GetColor(COLOR_HIGHLIGHT);
  300. m_arrStandardColor[XPCOLOR_ICONSHADDOW] = clr3DShadow;
  301. m_arrStandardColor[XPCOLOR_3DFACE] = clr3DFace;
  302. m_arrStandardColor[XPCOLOR_3DSHADOW] = clr3DShadow;
  303. m_arrStandardColor[XPCOLOR_EDITCTRLBORDER] = clr3DFace;
  304. m_arrStandardColor[XPCOLOR_FRAME] = clr3DShadow;
  305. m_arrStandardColor[XPCOLOR_SPLITTER_FACE] = clr3DFace;
  306. m_arrStandardColor[XPCOLOR_LABEL] = clr3DFace;
  307. m_arrStandardColor[XPCOLOR_STATICFRAME] = clr3DShadow;
  308. m_arrStandardColor[XPCOLOR_HIGHLIGHT_DISABLED_BORDER] = GetColor(COLOR_GRAYTEXT);
  309. m_arrStandardColor[XPCOLOR_SHADOW_FACTOR] = 0;
  310. m_arrStandardColor[XPCOLOR_TOOLBAR_GRAYTEXT] = clr3DShadow;
  311. }
  312. void CXTPColorManager::RefreshGradientColors()
  313. {
  314. XTPCurrentSystemTheme systemTheme = GetCurrentSystemTheme();
  315. if (m_bDisableLunaColors)
  316. systemTheme = xtpSystemThemeUnknown;
  317. switch (systemTheme)
  318. {
  319. case xtpSystemThemeBlue:
  320. case xtpSystemThemeRoyale:
  321. case xtpSystemThemeAero:
  322. {
  323. m_arrStandardColor[XPCOLOR_FRAME] = RGB(0, 45, 150);
  324. grcCaption.SetStandardValue(RGB(89, 135, 214), RGB(0, 45, 150));
  325. grcDockBar.SetStandardValue(RGB(158, 190, 245), RGB(196, 218, 250));
  326. grcShortcutBarGripper.SetStandardValue(RGB(89, 135, 214), RGB(0, 45, 150));
  327. // Toolbar gradients.
  328. grcToolBar.SetStandardValue(RGB(221, 236, 254), RGB(129, 169, 226), 0.75f);
  329. // Menu gradients.
  330. grcMenu.SetStandardValue(RGB(227, 239, 255), RGB(135, 173, 228));
  331. grcMenuExpanded.SetStandardValue(RGB(203, 221, 246), RGB(121, 161, 220));
  332. grcMenuItemPopup.SetStandardValue(RGB(227, 239, 255), RGB(147, 181, 231));
  333. }
  334. break;
  335. case xtpSystemThemeOlive:
  336. {
  337. m_arrStandardColor[XPCOLOR_FRAME] = RGB(96, 128, 88);
  338. grcCaption.SetStandardValue(RGB(175, 192, 130), RGB(99, 122, 68));
  339. grcDockBar.SetStandardValue(RGB(217, 217, 167), RGB(242, 241, 228));
  340. grcShortcutBarGripper.SetStandardValue(RGB(120, 142, 111), RGB(73, 91, 67));
  341. // Toolbar gradients.
  342. grcToolBar.SetStandardValue(RGB(244, 247, 222), RGB(183, 198, 145), 0.3f);
  343. // Menu gradients.
  344. grcMenu.SetStandardValue(RGB(255, 255, 237), RGB(184, 199, 146), 0.3f);
  345. grcMenuExpanded.SetStandardValue(RGB(230, 230, 209), RGB(164, 180, 120), 0.3f);
  346. grcMenuItemPopup.SetStandardValue(RGB(236, 240, 213), RGB(194, 206, 159));
  347. }
  348. break;
  349. case xtpSystemThemeSilver:
  350. {
  351. m_arrStandardColor[XPCOLOR_FRAME] = RGB(124, 124, 148);
  352. grcCaption.SetStandardValue(RGB(168, 167, 191), RGB(112, 111, 145));
  353. grcDockBar.SetStandardValue(RGB(215, 215, 229), RGB(243, 243, 247));
  354. grcShortcutBarGripper.SetStandardValue(RGB(168, 167, 191), RGB(119, 118, 151));
  355. // Toolbar gradients.
  356. grcToolBar.SetStandardValue(RGB(249, 249, 255), RGB(156, 155, 183), 0.75f);
  357. // Menu gradients.
  358. grcMenu.SetStandardValue(RGB(249, 249, 255), RGB(159, 157, 185), 0.75f);
  359. grcMenuExpanded.SetStandardValue(RGB(215, 215, 226), RGB(128, 126, 158), 0.75f);
  360. grcMenuItemPopup.SetStandardValue(RGB(233, 231, 241), RGB(186, 185, 205));
  361. }
  362. break;
  363. default:
  364. {
  365. grcCaption.SetStandardValue(GetColor(COLOR_3DSHADOW), GetColor(COLOR_3DSHADOW));
  366. grcDockBar.SetStandardValue(GetColor(COLOR_3DFACE), LightColor(GetColor(COLOR_3DFACE), GetColor(COLOR_WINDOW), 0xd7));
  367. grcShortcutBarGripper.SetStandardValue(GetColor(COLOR_3DFACE), GetColor(COLOR_3DSHADOW));
  368. // Toolbar gradients.
  369. grcToolBar.SetStandardValue(LightColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 0xcd), GetXtremeColor(COLOR_3DFACE));
  370. // Menu gradients.
  371. grcMenu.SetStandardValue(LightColor(GetColor(COLOR_3DFACE), GetColor(COLOR_WINDOW), 0x91), LightColor(GetColor(COLOR_3DFACE), GetColor(COLOR_WINDOW), 0x5d));
  372. grcMenuExpanded.SetStandardValue(LightColor(GetColor(COLOR_3DFACE), GetColor(COLOR_WINDOW), 0x28), LightColor(GetColor(COLOR_3DFACE), GetColor(COLOR_3DSHADOW), 0x5f));
  373. grcMenuItemPopup.SetStandardValue(LightColor(GetColor(COLOR_3DFACE), GetColor(COLOR_WINDOW), 0xa5), LightColor(GetColor(COLOR_3DFACE), GetColor(COLOR_WINDOW), 0x2a));
  374. }
  375. break;
  376. }
  377. if (IsLowResolution())
  378. {
  379. grcToolBar.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
  380. grcDockBar.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
  381. }
  382. }
  383. _XTP_EXT_CLASS void AFX_CDECL RefreshXtremeColors()
  384. {
  385. #if 1
  386. XTPColorManager()->RefreshColors();
  387. #else
  388. static DWORD dwLastRefresh = 0;
  389. if (GetTickCount() - dwLastRefresh > 500)
  390. {
  391. XTPColorManager()->RefreshColors();
  392. if (AfxGetMainWnd() != NULL)
  393. {
  394. dwLastRefresh = GetTickCount();
  395. }
  396. }
  397. #endif
  398. }
  399. BOOL CXTPColorManager::IsLowResolution(HDC hDC/* = 0*/)
  400. {
  401. if (hDC)
  402. {
  403. int nColors = ::GetDeviceCaps(hDC, BITSPIXEL);
  404. return (nColors > 0 && nColors <= 8);
  405. }
  406. hDC = ::GetDC(::GetDesktopWindow());
  407. if (hDC)
  408. {
  409. int nColors = ::GetDeviceCaps(hDC, BITSPIXEL);
  410. ::ReleaseDC(::GetDesktopWindow(), hDC);
  411. return (nColors > 0 && nColors <= 8);
  412. }
  413. return FALSE;
  414. }
  415. void CXTPColorManager::RefreshColors()
  416. {
  417. m_winThemeWrapperTheme = _GetWinThemeWrapperTheme();
  418. BOOL bSimpleColors = IsLowResolution();
  419. RefreshSysColors();
  420. RefreshXPColors();
  421. RefreshLunaColors();
  422. if (bSimpleColors)
  423. {
  424. RefreshGradientColors();
  425. return;
  426. }
  427. BOOL bHighContrast = FALSE;
  428. if ((GetColor(COLOR_3DFACE) == 0 && GetColor(COLOR_BTNTEXT) == 0xFFFFFF) ||
  429. (GetColor(COLOR_3DFACE) == 0xFFFFFF && GetColor(COLOR_BTNTEXT) == 0)) // High Contrast;
  430. {
  431. bHighContrast = TRUE;
  432. m_arrStandardColor[XPCOLOR_HIGHLIGHT] = GetColor(COLOR_HIGHLIGHT);
  433. m_arrStandardColor[XPCOLOR_HIGHLIGHT_CHECKED] = GetColor(COLOR_HIGHLIGHT);
  434. m_arrStandardColor[XPCOLOR_HIGHLIGHT_TEXT] = GetColor(COLOR_HIGHLIGHTTEXT);
  435. m_arrStandardColor[XPCOLOR_HIGHLIGHT_BORDER] = GetColor(COLOR_BTNTEXT);
  436. m_arrStandardColor[XPCOLOR_HIGHLIGHT_CHECKED_BORDER] = GetColor(COLOR_BTNTEXT);
  437. m_arrStandardColor[XPCOLOR_HIGHLIGHT_PUSHED_BORDER] = GetColor(COLOR_HIGHLIGHT);
  438. m_arrStandardColor[XPCOLOR_MENUBAR_BORDER] = GetColor(COLOR_BTNTEXT);
  439. m_arrStandardColor[XPCOLOR_TOOLBAR_GRIPPER] = GetColor(COLOR_BTNTEXT);
  440. }
  441. struct MUTECOLOR
  442. {
  443. int nIndex;
  444. int clrMain;
  445. int clrSub;
  446. int nDistance;
  447. };
  448. const MUTECOLOR IndexTable[] =
  449. {
  450. { XPCOLOR_TOOLBAR_FACE, COLOR_WINDOW, COLOR_3DFACE, 165 },
  451. { XPCOLOR_HIGHLIGHT, COLOR_HIGHLIGHT, COLOR_WINDOW, 0x1E },
  452. { XPCOLOR_HIGHLIGHT_PUSHED, COLOR_HIGHLIGHT, COLOR_WINDOW, 0x32 },
  453. { XPCOLOR_MENUBAR_FACE, COLOR_3DFACE, COLOR_WINDOW, 0x8f },
  454. { XPCOLOR_MENUBAR_GRAYTEXT, COLOR_GRAYTEXT, COLOR_WINDOW, 0x46 },
  455. { XPCOLOR_TOOLBAR_GRIPPER, COLOR_3DSHADOW, COLOR_WINDOW, 0x4b },
  456. { XPCOLOR_SEPARATOR, COLOR_3DSHADOW, COLOR_WINDOW, 0x46 },
  457. { XPCOLOR_MENUBAR_BORDER, XPCOLOR_TOOLBAR_TEXT, COLOR_BTNSHADOW, 0x14 },
  458. { XPCOLOR_FLOATBAR_BORDER, XPCOLOR_TOOLBAR_TEXT, COLOR_BTNSHADOW, 0xF },
  459. { XPCOLOR_DISABLED, COLOR_3DSHADOW, COLOR_WINDOW, 0x5A },
  460. { XPCOLOR_MENUBAR_EXPANDED, COLOR_3DFACE, COLOR_3DSHADOW, 90 }
  461. };
  462. int i;
  463. if (!bHighContrast) for (i = 0; i < sizeof(IndexTable) / sizeof(IndexTable[0]); i++)
  464. {
  465. m_arrStandardColor[IndexTable[i].nIndex] = LightColor(GetColor(IndexTable[i].clrMain),
  466. GetColor(IndexTable[i].clrSub), IndexTable[i].nDistance);
  467. }
  468. const MUTECOLOR LongTable[] =
  469. {
  470. { XPCOLOR_HIGHLIGHT, XPCOLOR_TOOLBAR_FACE, XPCOLOR_HIGHLIGHT, 50 },
  471. { XPCOLOR_HIGHLIGHT_BORDER, XPCOLOR_TOOLBAR_FACE, COLOR_HIGHLIGHT, 100 },
  472. { XPCOLOR_HIGHLIGHT_PUSHED, XPCOLOR_TOOLBAR_FACE, XPCOLOR_HIGHLIGHT_PUSHED, 30  },
  473. { XPCOLOR_MENUBAR_GRAYTEXT, XPCOLOR_MENUBAR_FACE, XPCOLOR_MENUBAR_GRAYTEXT, 80 },
  474. { XPCOLOR_HIGHLIGHT_CHECKED_BORDER, XPCOLOR_HIGHLIGHT_PUSHED, XPCOLOR_HIGHLIGHT_CHECKED_BORDER, 100 },
  475. { XPCOLOR_TOOLBAR_GRIPPER, XPCOLOR_TOOLBAR_FACE, XPCOLOR_TOOLBAR_GRIPPER, 85  },
  476. { XPCOLOR_SEPARATOR, XPCOLOR_TOOLBAR_FACE, XPCOLOR_SEPARATOR, 50 },
  477. { XPCOLOR_MENUBAR_BORDER, XPCOLOR_MENUBAR_FACE, XPCOLOR_MENUBAR_BORDER, 100 },
  478. { XPCOLOR_FLOATBAR_BORDER, XPCOLOR_TOOLBAR_FACE, XPCOLOR_FLOATBAR_BORDER, 100 },
  479. { XPCOLOR_DISABLED, XPCOLOR_TOOLBAR_FACE, XPCOLOR_DISABLED, 80 },
  480. { XPCOLOR_MENUBAR_TEXT, XPCOLOR_MENUBAR_FACE, XPCOLOR_MENUBAR_TEXT, 180 },
  481. { XPCOLOR_HIGHLIGHT_TEXT, XPCOLOR_HIGHLIGHT, XPCOLOR_HIGHLIGHT_TEXT, 180 },
  482. { XPCOLOR_TOOLBAR_TEXT, XPCOLOR_TOOLBAR_FACE, XPCOLOR_TOOLBAR_TEXT, 180 },
  483. { XPCOLOR_PUSHED_TEXT, XPCOLOR_HIGHLIGHT_PUSHED, XPCOLOR_PUSHED_TEXT, 180 }
  484. };
  485. if (LongColor(GetColor(COLOR_3DFACE), GetColor(XPCOLOR_TOOLBAR_FACE), 1, 35))
  486. {
  487. m_arrStandardColor[XPCOLOR_TOOLBAR_FACE] = AdjustColor(GetColor(COLOR_3DFACE), GetColor(XPCOLOR_TOOLBAR_FACE), 35);
  488. }
  489. for (i = 0; i < sizeof(LongTable) / sizeof(LongTable[0]); i++)
  490. {
  491. if (!LongColor(GetColor(LongTable[i].clrMain), GetColor(LongTable[i].clrSub) , 1, LongTable[i].nDistance))
  492. {
  493. m_arrStandardColor[LongTable[i].nIndex] = MixColor(GetColor(LongTable[i].clrMain), GetColor(LongTable[i].clrSub), LongTable[i].nDistance);
  494. }
  495. }
  496. if (LongColor(GetColor(XPCOLOR_MENUBAR_FACE), GetColor(XPCOLOR_MENUBAR_GRAYTEXT), 1, 145))
  497. {
  498. m_arrStandardColor[XPCOLOR_MENUBAR_GRAYTEXT] = AdjustColor(GetColor(XPCOLOR_MENUBAR_FACE), GetColor(XPCOLOR_MENUBAR_GRAYTEXT), 145);
  499. }
  500. if (!bHighContrast)
  501. {
  502. m_arrStandardColor[XPCOLOR_HIGHLIGHT_CHECKED] =
  503. RGB(GetRValue(clrWindow) * 40 / 100 + GetRValue(clrHighlight) * 10 / 100 + GetRValue(clrToolBar) * 50 / 100,
  504. GetGValue(clrWindow) * 40 / 100 + GetGValue(clrHighlight) * 10 / 100 + GetGValue(clrToolBar) * 50 / 100,
  505. GetBValue(clrWindow) * 40 / 100 + GetBValue(clrHighlight) * 10 / 100 + GetBValue(clrToolBar) * 50 / 100);
  506. }
  507. COLORREF clrBtn = GetColor(COLOR_3DFACE);
  508. int r = GetRValue(clrBtn), g = GetGValue(clrBtn), b = GetBValue(clrBtn);
  509. int nMax = __max(__max(r, g), b);
  510. if (nMax == 0)
  511. m_arrStandardColor[XPCOLOR_TAB_INACTIVE_BACK] = RGB(35, 35, 35); else
  512. {
  513. int nDelta = __min(35, 255 - nMax) + nMax;
  514. m_arrStandardColor[XPCOLOR_TAB_INACTIVE_BACK] = RGB(r * nDelta / nMax, g * nDelta / nMax, b * nDelta / nMax);
  515. }
  516. COLORREF clrShadow = GetColor(COLOR_3DSHADOW);
  517. r = GetRValue(clrShadow);
  518. g = GetGValue(clrShadow);
  519. b = GetBValue(clrShadow);
  520. nMax = __max(__max(r, g), b);
  521. if (clrBtn == 0) m_arrStandardColor[XPCOLOR_TAB_INACTIVE_TEXT] = RGB(0x7f, 0x7f, 0x7f);
  522. else if (nMax == 0) m_arrStandardColor[XPCOLOR_TAB_INACTIVE_TEXT] = RGB(0, 0, 0);
  523. else
  524. {
  525. int nDelta = __max(0, nMax - 43);
  526. m_arrStandardColor[XPCOLOR_TAB_INACTIVE_TEXT] = RGB(r * nDelta / nMax, g * nDelta / nMax, b * nDelta / nMax);
  527. }
  528. COLORREF clrBackground = m_arrStandardColor[XPCOLOR_HIGHLIGHT];
  529. m_arrStandardColor[XPCOLOR_ICONSHADDOW] = RGB(GetRValue(clrBackground) * .75, GetGValue(clrBackground) * .75, GetBValue(clrBackground) * .75);
  530. m_arrStandardColor[COLOR_3DLIGHT] = RGB(min(GetRValue(clrBtn) + 15, 255), min(GetGValue(clrBtn) + 15, 255), min(GetBValue(clrBtn) + 15, 255));
  531. m_arrStandardColor[XPCOLOR_EDITCTRLBORDER] = GetColor(XPCOLOR_TOOLBAR_FACE);
  532. m_arrStandardColor[XPCOLOR_HIGHLIGHT_DISABLED_BORDER] = GetColor(XPCOLOR_DISABLED);
  533. m_arrStandardColor[XPCOLOR_TOOLBAR_GRAYTEXT] = m_arrStandardColor[XPCOLOR_DISABLED];
  534. RefreshGradientColors();
  535. CXTPWinThemeWrapper wrpTreeView;
  536. wrpTreeView.OpenTheme(0, L"TREEVIEW");
  537. if (wrpTreeView.IsAppThemed())
  538. {
  539. wrpTreeView.GetThemeColor(0, 0, TMT_BORDERCOLOR, &m_arrStandardColor[XPCOLOR_STATICFRAME]);
  540. }
  541. }
  542. COLORREF CXTPColorManager::GetLunaColor(int nIndex) const
  543. {
  544. // index out of range try standard colors
  545. if (nIndex < XPCOLOR_BASE || nIndex > XPCOLOR_LAST)
  546. return GetColor(nIndex);
  547. return (m_arrLunaColor[nIndex] == COLORREF_NULL) ? GetColor(nIndex) : m_arrLunaColor[nIndex];
  548. }
  549. void CXTPColorManager::RefreshLunaColors()
  550. {
  551. XTPCurrentSystemTheme systemTheme = GetCurrentSystemTheme();
  552. if (m_bDisableLunaColors)
  553. systemTheme = xtpSystemThemeUnknown;
  554. int nLunaElements[] =
  555. {
  556. XPCOLOR_TOOLBAR_GRIPPER,
  557. XPCOLOR_SEPARATOR,
  558. XPCOLOR_DISABLED,
  559. XPCOLOR_MENUBAR_FACE,
  560. XPCOLOR_MENUBAR_BORDER,
  561. XPCOLOR_HIGHLIGHT,
  562. XPCOLOR_HIGHLIGHT_BORDER,
  563. XPCOLOR_HIGHLIGHT_PUSHED_BORDER,
  564. XPCOLOR_HIGHLIGHT_CHECKED_BORDER,
  565. XPCOLOR_HIGHLIGHT_PUSHED,
  566. XPCOLOR_HIGHLIGHT_CHECKED,
  567. XPCOLOR_TOOLBAR_FACE,
  568. XPCOLOR_PUSHED_TEXT,
  569. XPCOLOR_SHADOW_FACTOR
  570. };
  571. switch (systemTheme)
  572. {
  573. case xtpSystemThemeBlue:
  574. case xtpSystemThemeRoyale:
  575. case xtpSystemThemeAero:
  576. {
  577. COLORREF clrValues[] =
  578. {
  579. RGB(0x27, 0x41, 0x76), // XPCOLOR_TOOLBAR_GRIPPER
  580. RGB(0x6a, 0x8c, 0xcb), // XPCOLOR_SEPARATOR
  581. RGB(0x6d, 0x96, 0xd0), // XPCOLOR_DISABLED
  582. RGB(0xf6, 0xf6, 0xf6), // XPCOLOR_MENUBAR_FACE
  583. RGB(0x00, 0x2d, 0x96), // XPCOLOR_MENUBAR_BORDER
  584. RGB(0xff, 0xee, 0xc2), // XPCOLOR_HIGHLIGHT
  585. RGB(0x00, 0x00, 0x80), // XPCOLOR_HIGHLIGHT_BORDER
  586. RGB(0x00, 0x00, 0x80), // XPCOLOR_HIGHLIGHT_PUSHED_BORDER
  587. RGB(0x00, 0x00, 0x80), // XPCOLOR_HIGHLIGHT_CHECKED_BORDER
  588. RGB(0xfe, 0x80, 0x3e), // XPCOLOR_HIGHLIGHT_PUSHED
  589. RGB(0xff, 0xc0, 0x6f), // XPCOLOR_HIGHLIGHT_CHECKED
  590. RGB(0x9e, 0xbe, 0xf5), // XPCOLOR_TOOLBAR_FACE
  591. RGB(0x00, 0x00, 0x00), // XPCOLOR_PUSHED_TEXT
  592. RGB(0x16, 0x1E, 0x36), // XPCOLOR_SHADOW_FACTOR
  593. LightColor(GetColor(COLOR_APPWORKSPACE), GetColor(COLOR_WINDOW), 0x5a)
  594. };
  595. for (int i = 0; i < _countof(nLunaElements); i++)
  596. m_arrLunaColor[nLunaElements[i]] = clrValues[i];
  597. }
  598. break;
  599. case xtpSystemThemeOlive:
  600. {
  601. COLORREF clrValues[] =
  602. {
  603. RGB(0x51, 0x5e, 0x33), // XPCOLOR_TOOLBAR_GRIPPER
  604. RGB(0x60, 0x80, 0x58), // XPCOLOR_SEPARATOR
  605. RGB(0x9f, 0xae, 0x7a), // XPCOLOR_DISABLED
  606. RGB(0xf4, 0xf4, 0xee), // XPCOLOR_MENUBAR_FACE
  607. RGB(0x75, 0x8d, 0x5e), // XPCOLOR_MENUBAR_BORDER
  608. RGB(0xff, 0xee, 0xc2), // XPCOLOR_HIGHLIGHT
  609. RGB(0x3f, 0x5d, 0x38), // XPCOLOR_HIGHLIGHT_BORDER
  610. RGB(0x3f, 0x5d, 0x38), // XPCOLOR_HIGHLIGHT_PUSHED_BORDER
  611. RGB(0x3f, 0x5d, 0x38), // XPCOLOR_HIGHLIGHT_CHECKED_BORDER
  612. RGB(0xfe, 0x80, 0x3e), // XPCOLOR_HIGHLIGHT_PUSHED
  613. RGB(0xff, 0xc0, 0x6f), // XPCOLOR_HIGHLIGHT_CHECKED
  614. RGB(0xd9, 0xd9, 0xa7), // XPCOLOR_TOOLBAR_FACE
  615. RGB(0x00, 0x00, 0x00), // XPCOLOR_PUSHED_TEXT
  616. RGB(0x1F, 0x22, 0x19), // XPCOLOR_SHADOW_FACTOR
  617. LightColor(GetColor(COLOR_APPWORKSPACE), GetColor(COLOR_WINDOW), 0x5a)
  618. };
  619. for (int i = 0; i < _countof(nLunaElements); i++)
  620. m_arrLunaColor[nLunaElements[i]] = clrValues[i];
  621. }
  622. break;
  623. case xtpSystemThemeSilver:
  624. {
  625. COLORREF clrValues[] =
  626. {
  627. RGB(0x54, 0x54, 0x75), // XPCOLOR_TOOLBAR_GRIPPER
  628. RGB(0x6e, 0x6d, 0x8f), // XPCOLOR_SEPARATOR
  629. RGB(0xa8, 0xa7, 0xbe), // XPCOLOR_DISABLED
  630. RGB(0xfd, 0xfa, 0xff), // XPCOLOR_MENUBAR_FACE
  631. RGB(0x7c, 0x7c, 0x94), // XPCOLOR_MENUBAR_BORDER
  632. RGB(0xff, 0xee, 0xc2), // XPCOLOR_HIGHLIGHT
  633. RGB(0x4b, 0x4b, 0x6f), // XPCOLOR_HIGHLIGHT_BORDER
  634. RGB(0x4b, 0x4b, 0x6f), // XPCOLOR_HIGHLIGHT_PUSHED_BORDER
  635. RGB(0x4b, 0x4b, 0x6f), // XPCOLOR_HIGHLIGHT_CHECKED_BORDER
  636. RGB(0xfe, 0x80, 0x3e), // XPCOLOR_HIGHLIGHT_PUSHED
  637. RGB(0xff, 0xc0, 0x6f), // XPCOLOR_HIGHLIGHT_CHECKED
  638. RGB(0xd7, 0xd7, 0xe5), // XPCOLOR_TOOLBAR_FACE
  639. RGB(0x00, 0x00, 0x00), // XPCOLOR_PUSHED_TEXT
  640. RGB(0x24, 0x20, 0x29), // XPCOLOR_SHADOW_FACTOR
  641. LightColor(GetColor(COLOR_APPWORKSPACE), GetColor(COLOR_WINDOW), 0x5a)
  642. };
  643. for (int i = 0; i < _countof(nLunaElements); i++)
  644. m_arrLunaColor[nLunaElements[i]] = clrValues[i];
  645. }
  646. break;
  647. default:
  648. {
  649. for (int i = 0; i <= XPCOLOR_LAST; i++)
  650. m_arrLunaColor[i] = COLORREF_NULL;
  651. }
  652. break;
  653. }
  654. }
  655. void CXTPColorManager::SetColors(int cElements, CONST INT* lpaElements, CONST COLORREF* lpaRgbValues)
  656. {
  657. for (int i = 0; i < cElements; i++)
  658. m_arrCustomColor[lpaElements[i]] = lpaRgbValues[i];
  659. }
  660. void CXTPColorManager::SetColor(int nIndex, COLORREF clrValue)
  661. {
  662. m_arrCustomColor[nIndex] = clrValue;
  663. }
  664. double CXTPColorManager::GetRDelta(COLORREF clr)
  665. {
  666. return GetRValue(clr) * (195.0/255.0);
  667. }
  668. double CXTPColorManager::GetGDelta(COLORREF clr)
  669. {
  670. return GetGValue(clr) * (390.0/255.0);
  671. }
  672. double CXTPColorManager::GetBDelta(COLORREF clr)
  673. {
  674. return GetBValue(clr) * (65.0/255.0);
  675. }
  676. void CXTPColorManager::DisableLunaColors(BOOL bDisable)
  677. {
  678. m_bDisableLunaColors = bDisable;
  679. }
  680. BOOL CXTPColorManager::IsLunaColorsDisabled() const
  681. {
  682. return m_bDisableLunaColors;
  683. }
  684. void CXTPColorManager::SetLunaTheme(XTPCurrentSystemTheme systemTheme)
  685. {
  686. m_systemTheme = systemTheme;
  687. RefreshColors();
  688. }
  689. XTPCurrentSystemTheme CXTPColorManager::GetWinThemeWrapperTheme() const
  690. {
  691. return m_winThemeWrapperTheme;
  692. }
  693. XTPCurrentSystemTheme CXTPColorManager::_GetWinThemeWrapperTheme()
  694. {
  695. // windows classic theme is in use we do not need to go further.
  696. if (!CXTPWinThemeWrapper().IsThemeActive())
  697. return xtpSystemThemeUnknown;
  698. if (IsLowResolution())
  699. return xtpSystemThemeUnknown;
  700. WCHAR pszThemeFileName[MAX_PATH];
  701. WCHAR pszColorBuff[MAX_PATH];
  702. WCHAR pszSizeBuff[MAX_PATH];
  703. ZeroMemory(pszThemeFileName, MAX_PATH);
  704. ZeroMemory(pszColorBuff, MAX_PATH);
  705. ZeroMemory(pszSizeBuff, MAX_PATH);
  706. // get the name of the current theme in use.
  707. if (CXTPWinThemeWrapper().GetCurrentThemeName(pszThemeFileName, MAX_PATH,
  708. pszColorBuff, MAX_PATH, pszSizeBuff, MAX_PATH) != S_OK)
  709. {
  710. return xtpSystemThemeUnknown;
  711. }
  712. // search for "luna.msstyles" string in theme name.
  713. if (wcsstr(WCSLWR_S(pszThemeFileName, MAX_PATH), L"luna.msstyles") ||
  714. wcsstr(WCSLWR_S(pszThemeFileName, MAX_PATH), L"winxp.luna.cjstyles"))
  715. {
  716. if (wcscmp(WCSLWR_S(pszColorBuff, MAX_PATH), L"normalcolor") == 0)
  717. return xtpSystemThemeBlue;
  718. if (wcscmp(WCSLWR_S(pszColorBuff, MAX_PATH), L"homestead") == 0)
  719. return xtpSystemThemeOlive;
  720. if (wcscmp(WCSLWR_S(pszColorBuff, MAX_PATH), L"metallic") == 0)
  721. return xtpSystemThemeSilver;
  722. }
  723. if (m_bEnableLunaBlueForRoyaleTheme)
  724. {
  725. // search for "royale.msstyles" (Windows Media Center) string in theme name.
  726. if (wcsstr(WCSLWR_S(pszThemeFileName, MAX_PATH), L"royale.msstyles") ||
  727. wcsstr(WCSLWR_S(pszThemeFileName, MAX_PATH), L"winxp.royale.cjstyles"))
  728. {
  729. return xtpSystemThemeRoyale;
  730. }
  731. }
  732. if (m_bEnableLunaBlueForAeroTheme)
  733. {
  734. // search for "aero.msstyles" (Vista Aero) string in theme name.
  735. if (wcsstr(WCSLWR_S(pszThemeFileName, MAX_PATH), L"aero.msstyles"))
  736. {
  737. return xtpSystemThemeAero;
  738. }
  739. }
  740. // theme was found just not luna theme.
  741. return xtpSystemThemeUnknown;
  742. }
  743. XTPCurrentSystemTheme CXTPColorManager::GetCurrentSystemTheme() const
  744. {
  745. if (m_systemTheme != xtpSystemThemeAuto && m_systemTheme != xtpSystemThemeDefault)
  746. return m_systemTheme;
  747. return m_winThemeWrapperTheme;
  748. }