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

对话框与窗口

开发平台:

Visual C++

  1. // Themes.cpp
  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 "Themes.h"
  22. #include "resource.h"
  23. void CCustomMacTheme::_FillRect(CDC* pDC, CRect rc, int /*nTop*/)
  24. {
  25. CXTPPenDC pen(*pDC, 0);
  26. for (int i = /*- nTop % 4*/0 ; i < rc.Height();)
  27. {
  28. pen.Color(RGB(251, 251, 251)); pDC->MoveTo(0, i); pDC->LineTo(rc.Width(), i++);
  29. pen.Color(RGB(253, 253, 253)); pDC->MoveTo(0, i); pDC->LineTo(rc.Width(), i++);
  30. pen.Color(RGB(251, 251, 251)); pDC->MoveTo(0, i); pDC->LineTo(rc.Width(), i++);
  31. pen.Color(RGB(239, 239, 239)); pDC->MoveTo(0, i); pDC->LineTo(rc.Width(), i++);
  32. }
  33. }
  34. void CCustomMacTheme::FillDockBar(CDC* pDC, CXTPDockBar* pBar)
  35. {
  36. _FillRect(pDC, CXTPClientRect((CWnd*)pBar), CXTPWindowRect((CWnd*)pBar).top);
  37. }
  38. void CCustomMacTheme::FillStatusBar(CDC* pDC, CXTPStatusBar* pBar)
  39. {
  40. _FillRect(pDC, CXTPClientRect((CWnd*)pBar), CXTPWindowRect((CWnd*)pBar).top);
  41. }
  42. void CCustomMacTheme::FillCommandBarEntry(CDC* pDC, CXTPCommandBar* pBar)
  43. {
  44. CRect rc;
  45. pBar->GetClientRect(&rc);
  46. if (pBar->GetPosition() == xtpBarPopup)
  47. {
  48. pDC->FillSolidRect(rc, RGB(251, 251, 251));
  49. Draw3dRect(pDC, rc, COLOR_3DFACE, 0);
  50. rc.DeflateRect(1, 1);
  51. }
  52. else
  53. {
  54. _FillRect(pDC, rc, CXTPWindowRect((CWnd*)pBar).top);
  55. if (pBar->GetPosition() == xtpBarFloating )
  56. {
  57. Draw3dRect(pDC, rc, COLOR_3DFACE, 0);
  58. rc.DeflateRect(1, 1);
  59. }
  60. }
  61. Draw3dRect(pDC, rc, COLOR_BTNHILIGHT, COLOR_3DSHADOW);
  62. }
  63. void CCustomGrayTheme::FillCommandBarEntry(CDC* pDC, CXTPCommandBar* pBar)
  64. {
  65. CRect rc;
  66. pBar->GetClientRect(&rc);
  67. pDC->FillSolidRect(rc, RGB(221, 221, 221));
  68. if (pBar->GetPosition() == xtpBarFloating || pBar->GetPosition() == xtpBarPopup)
  69. {
  70. Draw3dRect(pDC, rc, COLOR_3DFACE, 0);
  71. rc.DeflateRect(1, 1);
  72. }
  73. Draw3dRect(pDC, rc, COLOR_BTNHILIGHT, COLOR_3DSHADOW);
  74. }
  75. void CCustomGrayTheme::FillDockBar(CDC* pDC, CXTPDockBar* pBar)
  76. {
  77. pDC->FillSolidRect(CXTPClientRect((CWnd*)pBar), RGB(221, 221, 221));
  78. }
  79. void CCustomGrayTheme::FillStatusBar(CDC* pDC, CXTPStatusBar* pBar)
  80. {
  81. pDC->FillSolidRect(CXTPClientRect((CWnd*)pBar), RGB(221, 221, 221));
  82. }
  83. void CCustomGrayTheme::DrawRectangle(CDC* pDC, CRect rc, BOOL bSelected, BOOL bPressed, BOOL bEnabled, BOOL bChecked, BOOL bPopuped, XTPBarType barType, XTPBarPosition barPosition)
  84. {
  85. if (barType == xtpBarTypePopup)
  86. {
  87. CXTPDefaultTheme::DrawRectangle(pDC, rc, bSelected, bPressed, bEnabled, bChecked, bPopuped, barType, barPosition);
  88. return;
  89. }
  90. if ((bSelected || bPressed || bPopuped) && bEnabled)
  91. pDC->FillSolidRect(rc, RGB(221, 221, 221));
  92. if (!bEnabled)
  93. {
  94. if (IsKeyboardSelected(bSelected)) Draw3dRect(pDC, rc, COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  95. }
  96. else if (bChecked && !bSelected && !bPressed)
  97. {
  98. DrawShadedRect(pDC, rc);
  99. Draw3dRect(pDC, rc, COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  100. }
  101. else if (bChecked ||bPopuped || IsKeyboardSelected(bPressed) || (bSelected && bPressed)) Draw3dRect(pDC, rc, COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  102. else if (bSelected || bPressed)  Draw3dRect(pDC, rc, COLOR_BTNHILIGHT, COLOR_3DSHADOW);
  103. }
  104. CSize CCustomGrayTheme::DrawCommandBarGripper(CDC* pDC, CXTPCommandBar* pBar, BOOL bDraw)
  105. {
  106. CRect rc;
  107. pBar->GetClientRect(&rc);
  108. COLORREF clrGripper[] = {RGB(255, 255, 255), RGB(128, 128, 128), RGB(205, 205, 205)};
  109. CXTPPenDC pen(*pDC, 0);
  110. if (pBar->IsDialogBar())
  111. {
  112. CSize sz(8, max(22, m_nTextHeight + 4));
  113. if (pDC && bDraw)
  114. {
  115. for (int i = 3; i < sz.cy; i++)
  116. {
  117. pen.Color(clrGripper[i % 3]); pDC->MoveTo(3, i); pDC->LineTo(8, i);
  118. }
  119. }
  120. return sz;
  121. } else if (pBar->GetPosition() == xtpBarFloating)
  122. {
  123. ASSERT(pDC);
  124. CXTPFontDC font(pDC, GetSmCaptionFont());
  125. CSize sz = pDC->GetTextExtent(_T(" "));
  126. rc.SetRect(3, 3, rc.right - 3, 3 + max(15, sz.cy));
  127. if (pDC && bDraw)
  128. {
  129. pDC->FillSolidRect(rc, GetXtremeColor(COLOR_ACTIVECAPTION));
  130. pDC->SetTextColor(GetXtremeColor(COLOR_3DHIGHLIGHT));
  131. pDC->DrawText(pBar->GetTitle(), CRect(5, 3, rc.right - 2* rc.Size().cy, rc.bottom), DT_SINGLELINE | DT_VCENTER );
  132. }
  133. return rc.Size();
  134. }
  135. else if (pBar->GetPosition() == xtpBarRight || pBar->GetPosition() == xtpBarLeft)
  136. {
  137. if (pDC && bDraw)
  138. {
  139. //Draw3dRect(pDC, CRect(3, 3, rc.right - 3, 6), COLOR_BTNHILIGHT, COLOR_3DSHADOW);
  140. for (int i = 3; i < rc.right - 4; i++)
  141. {
  142. pen.Color(clrGripper[i % 3]); pDC->MoveTo(i, 3); pDC->LineTo(i, 8);
  143. }
  144. }
  145. return CSize(0, 8);
  146. }
  147. else if (pBar->GetPosition() == xtpBarTop || pBar->GetPosition() == xtpBarBottom)
  148. {
  149. if (pDC && bDraw)
  150. {
  151. for (int i = 3; i < rc.bottom - 4; i++)
  152. {
  153. pen.Color(clrGripper[i % 3]); pDC->MoveTo(3, i); pDC->LineTo(8, i);
  154. }
  155. }
  156. return CSize(8, 0);
  157. }
  158. return 0;
  159. }
  160. void CCustomGradientTheme::FillCommandBarEntry(CDC* pDC, CXTPCommandBar* pBar)
  161. {
  162. if (pBar->GetPosition() == xtpBarPopup)
  163. {
  164. CRect rc;
  165. pBar->GetClientRect(&rc);
  166. XTPPaintManager()->GradientFill(pDC, rc, RGB(248, 242, 224), RGB(255, 255,255), FALSE);
  167. pDC->Draw3dRect(rc, RGB(160, 130, 35), RGB(160, 130, 35));
  168. }
  169. else if (pBar->GetPosition() == xtpBarFloating)
  170. {
  171. CXTPDefaultTheme::FillCommandBarEntry(pDC, pBar);
  172. }
  173. else
  174. {
  175. CWnd* pFrame = pBar->GetParentFrame(), *pWnd = pBar;
  176. CRect rc, rcParent, rcClient;
  177. pFrame->GetWindowRect(rcParent);
  178. pWnd->GetWindowRect(rc);
  179. pWnd->GetClientRect(rcClient);
  180. rcClient.TopLeft() += rcParent.TopLeft() -rc.TopLeft();
  181. rcClient.BottomRight() += rcParent.BottomRight() - rc.BottomRight();
  182. XTPPaintManager()->GradientFill(pDC, rcClient, RGB(248, 242, 224), RGB(255, 255,255), TRUE);
  183. pDC->Draw3dRect(CXTPClientRect(pWnd), RGB(255, 255, 255), RGB(248, 242, 224));
  184. }
  185. }
  186. void CCustomGradientTheme::DrawRectangle(CDC* pDC, CRect rc, BOOL bSelected, BOOL bPressed, BOOL bEnabled, BOOL bChecked, BOOL bPopuped, XTPBarType barType, XTPBarPosition barPosition)
  187. {
  188. if (barType == xtpBarTypePopup)
  189. {
  190. CXTPDefaultTheme::DrawRectangle(pDC, rc, bSelected, bPressed, bEnabled, bChecked, bPopuped, barType, barPosition);
  191. return;
  192. }
  193. if (!bEnabled)
  194. {
  195. if (IsKeyboardSelected(bSelected)) Draw3dRect(pDC, rc, COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  196. }
  197. else if (bChecked && !bSelected && !bPressed)
  198. {
  199. DrawShadedRect(pDC, rc);
  200. Draw3dRect(pDC, rc, COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  201. }
  202. else if (bPopuped)
  203. {
  204. pDC->Draw3dRect(rc, RGB(160, 130, 35), RGB(160, 130, 35));
  205. }
  206. else if (bChecked || IsKeyboardSelected(bPressed) || (bSelected && bPressed)) pDC->Draw3dRect(rc, RGB(160, 130, 35), RGB(255, 255, 255));
  207. else if (bSelected || bPressed)  pDC->Draw3dRect(rc, RGB(255, 255, 255), RGB(160, 130, 35));
  208. }
  209. void CCustomGradientTheme::AdjustExcludeRect(CRect& rc, CXTPControl* pControl, BOOL bVertical)
  210. {
  211. CXTPCommandBar* pParent = pControl->GetParent();
  212. ASSERT(pParent);
  213. if (pControl->GetType() == xtpControlComboBox) return;
  214. if (pParent->GetType() != xtpBarTypePopup)
  215. {
  216. if (bVertical)
  217. rc.DeflateRect(-1, 0); else rc.DeflateRect(0, -1);
  218. } else rc.InflateRect(3, 0);
  219. }
  220. void CCustomBevelTheme::DrawUnpressedPushButton(CDC *pDC, const CRect &rect)
  221. {
  222. pDC->RoundRect(rect, CPoint(6, 6));
  223. int nLeft = rect.left;
  224. int nTop = rect.top;
  225. int nRight = rect.right;
  226. int nBottom = rect.bottom;
  227. pDC->SelectObject(&m_penHilight);
  228. pDC->MoveTo(nLeft + 2, nBottom - 4);
  229. pDC->LineTo(nLeft + 2, nTop + 2);
  230. pDC->LineTo(nRight - 3, nTop + 2);
  231. pDC->SetPixel(nLeft + 3, nTop + 3, m_crHilight);
  232. pDC->SelectObject(&m_penLiteShadow);
  233. pDC->MoveTo(nLeft + 3, nBottom - 3);
  234. pDC->LineTo(nRight - 4, nBottom - 3);
  235. pDC->LineTo(nRight - 4, nBottom - 4);
  236. pDC->LineTo(nRight - 3, nBottom - 4);
  237. pDC->LineTo(nRight - 3, nTop + 2);
  238. pDC->SelectObject(&m_penShadow);
  239. pDC->MoveTo(nLeft + 3, nBottom - 2);
  240. pDC->LineTo(nRight - 3, nBottom - 2);
  241. pDC->LineTo(nRight - 3, nBottom - 3);
  242. pDC->LineTo(nRight - 2, nBottom - 3);
  243. pDC->LineTo(nRight - 2, nTop + 2);
  244. pDC->SetPixel(nLeft, nTop + 2, m_crDarkDkShadow);
  245. pDC->SetPixel(nLeft + 2, nTop, m_crDarkDkShadow);
  246. pDC->SetPixel(nRight - 3, nTop, m_crDarkDkShadow);
  247. pDC->SetPixel(nRight - 1, nTop + 2, m_crDarkDkShadow);
  248. pDC->SetPixel(nRight - 1, nBottom - 3, m_crDarkDkShadow);
  249. pDC->SetPixel(nRight - 3, nBottom - 1, m_crDarkDkShadow);
  250. pDC->SetPixel(nLeft + 2, nBottom - 1, m_crDarkDkShadow);
  251. pDC->SetPixel(nLeft, nBottom - 3, m_crDarkDkShadow);
  252. pDC->SetPixel(nLeft + 1, nTop + 2, m_crLiteShadow);
  253. pDC->SetPixel(nLeft + 2, nTop + 1, m_crLiteShadow);
  254. pDC->SetPixel(nRight - 3, nTop + 1, m_crLiteShadow);
  255. pDC->SetPixel(nRight - 2, nTop + 2, m_crLiteShadow);
  256. pDC->SetPixel(nLeft + 2, nBottom - 2, m_crLiteShadow);
  257. pDC->SetPixel(nLeft + 1, nBottom - 3, m_crLiteShadow);
  258. DrawCornerShadows(pDC, rect);
  259. }   // DrawUnpressedPushButton
  260. void CCustomBevelTheme::DrawCornerShadows(CDC *pDC, const CRect &rect)
  261. {
  262. pDC->SetPixel(rect.left, rect.top + 2, m_crDarkDkShadow);
  263. pDC->SetPixel(rect.left + 2, rect.top, m_crDarkDkShadow);
  264. pDC->SetPixel(rect.right - 3, rect.top, m_crDarkDkShadow);
  265. pDC->SetPixel(rect.right - 1, rect.top + 2, m_crDarkDkShadow);
  266. pDC->SetPixel(rect.right - 1, rect.bottom - 3, m_crDarkDkShadow);
  267. pDC->SetPixel(rect.right - 3, rect.bottom - 1, m_crDarkDkShadow);
  268. pDC->SetPixel(rect.left + 2, rect.bottom - 1, m_crDarkDkShadow);
  269. pDC->SetPixel(rect.left, rect.bottom - 3, m_crDarkDkShadow);
  270. }   // DrawCornerShadows
  271. void CCustomBevelTheme::GetColors()
  272. {
  273. m_crHilight = ::GetSysColor(COLOR_3DHILIGHT);
  274. m_crLiteFace = ::GetSysColor(COLOR_3DLIGHT);
  275. m_crFace = ::GetSysColor(COLOR_3DFACE);
  276. m_crShadow = ::GetSysColor(COLOR_3DSHADOW);
  277. m_crDkShadow = ::GetSysColor(COLOR_3DDKSHADOW);
  278. // Create some intermediate colors. This is done by averaging two colors.
  279. BYTE byRedFace = GetRValue(m_crFace);
  280. BYTE byGreenFace = GetGValue(m_crFace);
  281. BYTE byBlueFace = GetBValue(m_crFace);
  282. BYTE byRedShadow = GetRValue(m_crShadow);
  283. BYTE byGreenShadow = GetGValue(m_crShadow);
  284. BYTE byBlueShadow = GetBValue(m_crShadow);
  285. BYTE byRedDkShadow = GetRValue(m_crDkShadow);
  286. BYTE byGreenDkShadow = GetGValue(m_crDkShadow);
  287. BYTE byBlueDkShadow = GetBValue(m_crDkShadow);
  288. m_crLiteShadow = RGB(byRedFace + ((byRedShadow - byRedFace) >> 1),
  289. byGreenFace + ((byGreenShadow - byGreenFace) >> 1),
  290. byBlueFace + ((byBlueShadow - byBlueFace) >> 1));
  291. m_crDarkDkShadow = RGB(byRedShadow + ((byRedDkShadow - byRedShadow) >> 1),
  292. byGreenShadow + ((byGreenDkShadow - byGreenShadow) >> 1),
  293. byBlueShadow + ((byBlueDkShadow - byBlueShadow) >> 1));
  294. }
  295. void CCustomBevelTheme::CreatePens()
  296. {
  297. DeletePens();
  298. m_penLiteShadow.CreatePen(PS_SOLID, 1, m_crLiteShadow);
  299. m_penShadow.CreatePen(PS_SOLID, 1, m_crShadow);
  300. m_penHilight.CreatePen(PS_SOLID, 1, m_crHilight);
  301. }   // CreatePens
  302. void CCustomBevelTheme::DeletePens()
  303. {
  304. if (m_penHilight.m_hObject)
  305. m_penHilight.DeleteObject();
  306. if (m_penLiteShadow.m_hObject)
  307. m_penLiteShadow.DeleteObject();
  308. if (m_penShadow.m_hObject)
  309. m_penShadow.DeleteObject();
  310. }   // DeletePens
  311. CCustomBevelTheme::CCustomBevelTheme()
  312. {
  313. RefreshMetrics();
  314. }
  315. void CCustomBevelTheme::RefreshMetrics()
  316. {
  317. CXTPDefaultTheme::RefreshMetrics();
  318. GetColors();
  319. CreatePens();
  320. }
  321. void CCustomBevelTheme::DrawRectangle(CDC* pDC, CRect rc, BOOL bSelected, BOOL bPressed, BOOL bEnabled, BOOL bChecked, BOOL bPopuped, XTPBarType barType, XTPBarPosition barPosition)
  322. {
  323. if (barType == xtpBarTypePopup)
  324. {
  325. CXTPDefaultTheme::DrawRectangle(pDC, rc, bSelected, bPressed, bEnabled, bChecked, bPopuped, barType, barPosition);
  326. return;
  327. }
  328. if (!bEnabled)
  329. {
  330. CBrush brFill(m_crFace);
  331. CBrush *pOldBrush   = (CBrush *)pDC->SelectObject(&brFill);
  332. CPen penFrame(PS_SOLID, 1, ::GetSysColor(COLOR_WINDOWFRAME));
  333. CPen *pOldPen = (CPen *)pDC->SelectObject(&m_penShadow);
  334. pDC->RoundRect(rc, CPoint(6, 6));
  335. pDC->SelectObject(pOldBrush);
  336. pDC->SelectObject(pOldPen);
  337. } else
  338. {
  339. COLORREF crBack = pDC->SetBkColor(GetSysColor(COLOR_3DFACE));
  340. COLORREF crText = pDC->SetTextColor(GetSysColor(COLOR_3DHIGHLIGHT));
  341. CBrush brFill;
  342. if (bChecked && !bPressed)
  343. {
  344. WORD bits[] = {
  345. 0x0055, 0x00AA, 0x0055, 0x00AA,
  346. 0x0055, 0x00AA, 0x0055, 0x00AA
  347. };
  348. CBitmap bitmap;
  349. bitmap.CreateBitmap( 8, 8, 1, 1, &bits );
  350. brFill.CreatePatternBrush( &bitmap );
  351. }
  352. else
  353. {
  354. brFill.CreateSolidBrush(bPressed || bPopuped ? m_crLiteShadow : m_crFace);
  355. }
  356. CBrush *pOldBrush   = (CBrush *)pDC->SelectObject(&brFill);
  357. CPen penFrame(PS_SOLID, 1, ::GetSysColor(COLOR_WINDOWFRAME));
  358. CPen *pOldPen = (CPen *)pDC->SelectObject(&penFrame);
  359. DrawUnpressedPushButton(pDC, rc);
  360. pDC->SelectObject(pOldBrush);
  361. pDC->SelectObject(pOldPen);
  362. if (IsKeyboardSelected(bSelected) && !bPopuped)
  363. {
  364. rc.DeflateRect(2, 2);
  365. pDC->DrawFocusRect(rc);
  366. }
  367. pDC->SetBkColor(crBack);
  368. pDC->SetTextColor(crText);
  369. }
  370. }
  371. void CCustomBevelTheme::FillCommandBarEntry(CDC* pDC, CXTPCommandBar* pBar)
  372. {
  373. if (pBar->GetPosition() == xtpBarPopup || pBar->GetPosition() == xtpBarFloating)
  374. {
  375. CRect rc;
  376. pBar->GetClientRect(&rc);
  377. pDC->FillSolidRect(rc, GetXtremeColor(COLOR_3DFACE));
  378. Draw3dRect(pDC, rc, COLOR_BTNTEXT, COLOR_BTNTEXT);
  379. rc.DeflateRect(1, 1);
  380. Draw3dRect(pDC, rc, COLOR_BTNHIGHLIGHT, COLOR_3DSHADOW);
  381. }
  382. else
  383. {
  384. CXTPDefaultTheme::FillCommandBarEntry(pDC, pBar);
  385. }
  386. }
  387. void CCustomBevelTheme::AdjustExcludeRect(CRect& rc, CXTPControl* pControl, BOOL bVertical)
  388. {
  389. CXTPCommandBar* pParent = pControl->GetParent();
  390. ASSERT(pParent);
  391. if (pControl->GetType() == xtpControlComboBox) return;
  392. if (pParent->GetType() != xtpBarTypePopup)
  393. {
  394. if (bVertical)
  395. rc.DeflateRect(-1, 0); else rc.DeflateRect(0, -1);
  396. } else rc.InflateRect(-3, 3);
  397. }
  398. CCustomFancyTheme::CCustomFancyTheme()
  399. {
  400. m_iconsInfo.bUseFadedIcons = FALSE;
  401. m_iconsInfo.bIconsWithShadow = FALSE;
  402. RefreshMetrics();
  403. }
  404. void CCustomFancyTheme::RefreshMetrics()
  405. {
  406. CXTPOfficeTheme::RefreshMetrics();
  407. INT nElements[] =      { XPCOLOR_TOOLBAR_GRIPPER, XPCOLOR_SEPARATOR,  XPCOLOR_DISABLED,   XPCOLOR_MENUBAR_FACE, XPCOLOR_MENUBAR_BORDER, XPCOLOR_HIGHLIGHT,  XPCOLOR_HIGHLIGHT_BORDER, XPCOLOR_HIGHLIGHT_PUSHED_BORDER, XPCOLOR_HIGHLIGHT_CHECKED_BORDER, XPCOLOR_HIGHLIGHT_PUSHED, XPCOLOR_HIGHLIGHT_CHECKED, XPCOLOR_TOOLBAR_FACE, XPCOLOR_PUSHED_TEXT };
  408. COLORREF clrValues[] = { RGB(39, 65, 118),        RGB(106, 140, 203), RGB(109, 150, 208), RGB(255, 255, 220),   RGB(0, 45, 150),        RGB(255, 238, 194), RGB(0, 0, 128),           RGB(0, 0, 128),                  RGB(0, 0, 128),                   RGB(254, 128, 62),        RGB(255, 192, 111),         RGB(215, 241, 215),   RGB(255, 255, 255)};
  409. SetColors(sizeof(nElements)/sizeof(INT), nElements, clrValues);
  410. }
  411. void CCustomFancyTheme::FillCommandBarEntry(CDC* pDC, CXTPCommandBar* pBar)
  412. {
  413. if (pBar->GetPosition() == xtpBarPopup)
  414. {
  415. CXTPOfficeTheme::FillCommandBarEntry(pDC, pBar);
  416. }
  417. else if (pBar->GetPosition() == xtpBarFloating)
  418. {
  419. CXTPOfficeTheme::FillCommandBarEntry(pDC, pBar);
  420. }
  421. else
  422. {
  423. CWnd* pFrame = pBar->GetParentFrame(), *pWnd = pBar;
  424. CRect rc, rcParent, rcClient;
  425. pFrame->GetWindowRect(rcParent);
  426. pWnd->GetWindowRect(rc);
  427. pWnd->GetClientRect(rcClient);
  428. rcClient.TopLeft() += rcParent.TopLeft() -rc.TopLeft();
  429. rcClient.BottomRight() += rcParent.BottomRight() - rc.BottomRight();
  430. XTPPaintManager()->GradientFill(pDC, rcClient, RGB(255, 220, 220), RGB(150, 254, 150), TRUE);
  431. }
  432. }
  433. COLORREF DarkenColor( long lScale, COLORREF lColor)
  434. {
  435. long red   = MulDiv(GetRValue(lColor),(255-lScale),255);
  436. long green = MulDiv(GetGValue(lColor),(255-lScale),255);
  437. long blue  = MulDiv(GetBValue(lColor),(255-lScale),255);
  438. return RGB(red, green, blue);
  439. }
  440. COLORREF LightenColor( long lScale, COLORREF lColor)
  441. {
  442. long R = MulDiv(255-GetRValue(lColor),lScale,255)+GetRValue(lColor);
  443. long G = MulDiv(255-GetGValue(lColor),lScale,255)+GetGValue(lColor);
  444. long B = MulDiv(255-GetBValue(lColor),lScale,255)+GetBValue(lColor);
  445. return RGB(R, G, B);
  446. }
  447. void CCustomIcyTheme::DrawPopupBarGripper(CDC* pDC, int x, int y, int cx, int cy, BOOL /*bExpanded*/)
  448. {
  449. GradientFill(pDC, CRect(CPoint(x, y), CSize(cx, cy)), DarkenColor(30, GetXtremeColor(COLOR_3DFACE)), LightenColor(30, GetXtremeColor(COLOR_3DFACE)), TRUE);
  450. }
  451. CSize CCustomIcyTheme::DrawCommandBarGripper(CDC* pDC, CXTPCommandBar* pBar, BOOL bDraw)
  452. {
  453. CRect rc;
  454. pBar->GetClientRect(&rc);
  455. if (pBar->IsDialogBar())
  456. {
  457. CSize sz(8, max(22, m_nTextHeight + 4));
  458. if (pDC && bDraw)
  459. {
  460. for (int y = 5; y < sz.cy - 2; y += 4)
  461. {
  462. pDC->FillSolidRect(CRect(4 + 2, y + 1, 6 + 2, y + 3), GetXtremeColor(COLOR_BTNHIGHLIGHT));
  463. pDC->FillSolidRect(CRect(3 + 2, y, 5 + 2, y + 2), DarkenColor(60, GetXtremeColor(COLOR_3DFACE)));
  464. }
  465. }
  466. return sz;
  467. } else if (pBar->GetPosition() == xtpBarFloating)
  468. {
  469. return CXTPOfficeTheme::DrawCommandBarGripper(pDC, pBar, bDraw);
  470. } else if (pBar->GetPosition() == xtpBarRight || pBar->GetPosition() == xtpBarLeft)
  471. {
  472. if (!pDC || !bDraw) return CSize(0, 8 + 1);
  473. for (int x = 5; x < rc.Width() - 8; x += 4)
  474. {
  475. pDC->FillSolidRect(CRect(x + 1, 4 + 3, x + 3, 6 + 3), GetXtremeColor(COLOR_BTNHIGHLIGHT));
  476. pDC->FillSolidRect(CRect(x, 3 + 3, x + 2, 5 + 3), DarkenColor(60, GetXtremeColor(COLOR_3DFACE)));
  477. }
  478. }
  479. else if (pBar->GetPosition() == xtpBarTop || pBar->GetPosition() == xtpBarBottom)
  480. {
  481. if (!pDC || !bDraw) return CSize(6 + 2 - 2, 0);
  482. for (int y = 5; y < rc.Height() - 8; y += 4)
  483. {
  484. pDC->FillSolidRect(CRect(4 + 2, y + 1, 6 + 2, y + 3), GetXtremeColor(COLOR_BTNHIGHLIGHT));
  485. pDC->FillSolidRect(CRect(3 + 2, y, 5 + 2, y + 2), DarkenColor(60, GetXtremeColor(COLOR_3DFACE)));
  486. }
  487. }
  488. return 0;
  489. }
  490. CSize CCustomIcyTheme::DrawCommandBarSeparator(CDC* pDC, CXTPCommandBar* pBar, CXTPControl* pControl, BOOL bDraw)
  491. {
  492. if (!bDraw)
  493. {
  494. return CXTPOfficeTheme::DrawCommandBarSeparator(pDC, pBar, pControl, bDraw);
  495. }
  496. CRect rc;
  497. pBar->GetClientRect(&rc);
  498. CRect rcControl = pControl->GetRect();
  499. CRect rcRow = pControl->GetRowRect();
  500. if (pBar->GetPosition() == xtpBarRight || pBar->GetPosition() == xtpBarLeft)
  501. {
  502. if (!pControl->GetWrap())
  503. {
  504. Line(pDC, rcRow.left + 4, rcControl.top - 4, rcRow.right - 4, rcControl.top - 4, XPCOLOR_3DSHADOW);
  505. Line(pDC, rcRow.left + 5, rcControl.top - 3, rcRow.right - 3, rcControl.top - 3, COLOR_3DHIGHLIGHT);
  506. }
  507. else
  508. {
  509. Line(pDC, rcRow.right + 2, rcRow.top + 4, rcRow.right + 2, rcRow.bottom, XPCOLOR_3DSHADOW);
  510. Line(pDC, rcRow.right + 3, rcRow.top + 5, rcRow.right + 3, rcRow.bottom, COLOR_3DHIGHLIGHT);
  511. }
  512. } else if (pBar->GetPosition() == xtpBarTop || pBar->GetPosition() == xtpBarBottom)
  513. {
  514. if (!pControl->GetWrap())
  515. {
  516. Line(pDC, rcControl.left - 4, rcRow.top + 4, rcControl.left - 4, rcRow.bottom - 4, XPCOLOR_3DSHADOW);
  517. Line(pDC, rcControl.left - 3, rcRow.top + 5, rcControl.left - 3, rcRow.bottom - 3, COLOR_3DHIGHLIGHT);
  518. }
  519. else
  520. {
  521. Line(pDC, rcRow.left + 4, rcRow.top - 4, rcRow.right, rcRow.top - 4, XPCOLOR_3DSHADOW);
  522. Line(pDC, rcRow.left + 5, rcRow.top - 3, rcRow.right, rcRow.top - 3, COLOR_3DHIGHLIGHT);
  523. }
  524. }
  525. else return CXTPOfficeTheme::DrawCommandBarSeparator(pDC, pBar, pControl, bDraw);
  526. return 0;
  527. }
  528. void CCustomIcyTheme::FillCommandBarEntry(CDC* pDC, CXTPCommandBar* pBar)
  529. {
  530. CXTPClientRect rc((CWnd*)pBar);
  531. if (pBar->GetPosition() == xtpBarPopup)
  532. {
  533. Rectangle(pDC, rc, XPCOLOR_MENUBAR_BORDER, COLOR_3DFACE);
  534. if (pBar->GetType() == xtpBarTypePopup)
  535. {
  536. COLORREF color3DHilight = DarkenColor(30, GetXtremeColor(COLOR_3DFACE));
  537. COLORREF color3DShadow = LightenColor(30, GetXtremeColor(COLOR_3DFACE));
  538. for (int i = 0; i < pBar->GetControls()->GetCount(); i++)
  539. {
  540. CXTPControl* pControl = pBar->GetControl(i);
  541. if (pControl->IsVisible())
  542. XTPPaintManager()->GradientFill(pDC, pControl->GetRect(), color3DShadow, color3DHilight, FALSE);
  543. }
  544. }
  545. CXTPPopupBar* pPopupBar = DYNAMIC_DOWNCAST(CXTPPopupBar, pBar);
  546. FillIntersectRect(pDC, pPopupBar, GetXtremeColor(COLOR_3DFACE));
  547. }
  548. else if (pBar->GetPosition() == xtpBarFloating)
  549. {
  550. CXTPOfficeTheme::FillCommandBarEntry(pDC, pBar);
  551. }
  552. else if (pBar->GetPosition() == xtpBarTop || pBar->GetPosition() == xtpBarBottom )
  553. {
  554. COLORREF clr3DFace = GetXtremeColor(COLOR_3DFACE);
  555. pDC->FillSolidRect(rc, clr3DFace);
  556. CWnd* pWnd = pBar->GetParent();
  557. if (pWnd)
  558. {
  559. pDC->ExcludeClipRect(rc.left, rc.top, rc.left + 3, rc.bottom);
  560. XTPDrawHelpers()->ExcludeCorners(pDC, CRect(rc.left + 3, rc.top + 1, rc.right, rc.bottom - 1));
  561. }
  562. COLORREF color3DHilight = DarkenColor(30, GetXtremeColor(COLOR_3DFACE));
  563. COLORREF color3DShadow = LightenColor(30, GetXtremeColor(COLOR_3DFACE));
  564. GradientFill(pDC, rc, color3DShadow, color3DHilight, FALSE);
  565. pDC->FillSolidRect(rc.left + 5, rc.bottom - 1, rc.Width() - 7, 1, DarkenColor(60, GetXtremeColor(COLOR_3DFACE)));
  566. pDC->SelectClipRgn(0);
  567. }
  568. else if (pBar->GetPosition() == xtpBarLeft || pBar->GetPosition() == xtpBarRight )
  569. {
  570. COLORREF clr3DFace = GetXtremeColor(COLOR_3DFACE);
  571. pDC->FillSolidRect(rc, clr3DFace);
  572. CWnd* pWnd = pBar->GetParent();
  573. if (pWnd)
  574. {
  575. pDC->ExcludeClipRect(rc.left, rc.top, rc.right, rc.top + 3);
  576. XTPDrawHelpers()->ExcludeCorners(pDC, CRect(rc.left + 1, rc.top + 3, rc.right - 1, rc.bottom));
  577. }
  578. COLORREF color3DHilight = DarkenColor(30, GetXtremeColor(COLOR_3DFACE));
  579. COLORREF color3DShadow = LightenColor(30, GetXtremeColor(COLOR_3DFACE));
  580. GradientFill(pDC, rc, color3DShadow, color3DHilight, TRUE);
  581. pDC->FillSolidRect(rc.right - 1, rc.top + 5 , 1, rc.Height() - 7, DarkenColor(60, GetXtremeColor(COLOR_3DFACE)));
  582. pDC->SelectClipRgn(0);
  583. }
  584. else
  585. {
  586. CXTPOfficeTheme::FillCommandBarEntry(pDC, pBar);
  587. }
  588. }
  589. void CCustomFancyTheme::FillDockBar(CDC* pDC, CXTPDockBar* pBar)
  590. {
  591. CWnd* pFrame = pBar->GetParentFrame(), *pWnd = pBar;
  592. CRect rc, rcParent, rcClient;
  593. pFrame->GetWindowRect(rcParent);
  594. pWnd->GetWindowRect(rc);
  595. pWnd->GetClientRect(rcClient);
  596. rcClient.TopLeft() += rcParent.TopLeft() -rc.TopLeft();
  597. rcClient.BottomRight() += rcParent.BottomRight() - rc.BottomRight();
  598. XTPPaintManager()->GradientFill(pDC, rcClient, RGB(255, 220, 220), RGB(150, 254, 150), TRUE);
  599. }
  600. #define CLR_TO_RGBQUAD(clr)     (RGB(GetBValue(clr), GetGValue(clr), GetRValue(clr)))
  601. inline COLORREF GetNormColor(int r, int g, int b)
  602. {
  603. return RGB(r > 255? 255: r, g > 255? 255: g, b > 255? 255: b);
  604. }
  605. HBITMAP AFXAPI CreateBackgroundBitmap(HINSTANCE hInst, HRSRC hRsrc, COLORREF clrAdjust)
  606. {
  607. HGLOBAL hglb;
  608. if ((hglb = LoadResource(hInst, hRsrc)) == NULL)
  609. return NULL;
  610. LPBITMAPINFOHEADER lpBitmap = (LPBITMAPINFOHEADER)LockResource(hglb);
  611. if (lpBitmap == NULL)
  612. return NULL;
  613. // make copy of BITMAPINFOHEADER so we can modify the color table
  614. const int nColorTableSize = 16;
  615. UINT nSize = lpBitmap->biSize + nColorTableSize * sizeof(RGBQUAD);
  616. LPBITMAPINFOHEADER lpBitmapInfo = (LPBITMAPINFOHEADER)::malloc(nSize);
  617. if (lpBitmapInfo == NULL)
  618. return NULL;
  619. MEMCPY_S(lpBitmapInfo, lpBitmap, nSize);
  620. // color table is in RGBQUAD DIB format
  621. DWORD* pColorTable =
  622. (DWORD*)(((LPBYTE)lpBitmapInfo) + (UINT)lpBitmapInfo->biSize);
  623. clrAdjust = CLR_TO_RGBQUAD(clrAdjust);
  624. for (int iColor = 0; iColor < nColorTableSize; iColor++)
  625. {
  626. pColorTable[iColor]
  627. = GetNormColor(int(GetRValue(clrAdjust) * GetRValue(pColorTable[iColor]) / 192.75),
  628. int(GetGValue(clrAdjust) * GetGValue(pColorTable[iColor]) / 192.75),
  629. int(GetBValue(clrAdjust) * GetBValue(pColorTable[iColor]) / 192.75));
  630. }
  631. int nWidth = (int)lpBitmapInfo->biWidth;
  632. int nHeight = (int)lpBitmapInfo->biHeight;
  633. HDC hDCScreen = ::GetDC(NULL);
  634. HBITMAP hbm = ::CreateCompatibleBitmap(hDCScreen, nWidth, nHeight);
  635. if (hbm != NULL)
  636. {
  637. HDC hDCGlyphs = ::CreateCompatibleDC(hDCScreen);
  638. HBITMAP hbmOld = (HBITMAP)::SelectObject(hDCGlyphs, hbm);
  639. LPBYTE lpBits;
  640. lpBits = (LPBYTE)(lpBitmap + 1);
  641. lpBits += ((size_t)1 << (lpBitmapInfo->biBitCount)) * sizeof(RGBQUAD);
  642. StretchDIBits(hDCGlyphs, 0, 0, nWidth, nHeight, 0, 0, nWidth, nHeight,
  643. lpBits, (LPBITMAPINFO)lpBitmapInfo, DIB_RGB_COLORS, SRCCOPY);
  644. SelectObject(hDCGlyphs, hbmOld);
  645. ::DeleteDC(hDCGlyphs);
  646. }
  647. ::ReleaseDC(NULL, hDCScreen);
  648. // free copy of bitmap info struct and resource itself
  649. ::free(lpBitmapInfo);
  650. ::FreeResource(hglb);
  651. return hbm;
  652. }
  653. CCustomBackgroundTheme::CCustomBackgroundTheme()
  654. {
  655. InitBitmaps();
  656. }
  657. CCustomBackgroundTheme::~CCustomBackgroundTheme()
  658. {
  659. }
  660. void CCustomBackgroundTheme::RefreshMetrics()
  661. {
  662. CXTPDefaultTheme::RefreshMetrics();
  663. InitBitmaps();
  664. }
  665. BOOL CCustomBackgroundTheme::InitBitmaps()
  666. {
  667. m_bmpImageFill.DeleteObject();
  668. LPCTSTR lpszResourceName = MAKEINTRESOURCE(IDB_BACKGROUND);
  669. HINSTANCE hInstImageWell = AfxFindResourceHandle(lpszResourceName, RT_BITMAP);
  670. HRSRC hRsrcImageWell = ::FindResource(hInstImageWell, lpszResourceName, RT_BITMAP);
  671. if (hRsrcImageWell == NULL)
  672. return FALSE;
  673. HBITMAP hbmImageFill = CreateBackgroundBitmap(hInstImageWell, hRsrcImageWell, GetSysColor(COLOR_3DFACE));
  674. ASSERT(hbmImageFill);
  675. m_bmpImageFill.Attach(hbmImageFill);
  676. return TRUE;
  677. }
  678. void CCustomBackgroundTheme::_FillRect(CDC* pDC, CWnd* pWnd, HBITMAP hbm)
  679. {
  680. CXTPCompatibleDC dc(pDC, CBitmap::FromHandle(hbm));
  681. CXTPClientRect r(pWnd);
  682. for (int x = 0; x  < r.Width(); x += 128)
  683. for (int y = 0; y  < r.Height(); y += 128)
  684. pDC->BitBlt(x, y, 128, 128, &dc, 0, 0, SRCCOPY);
  685. }
  686. void CCustomBackgroundTheme::FillDockBar(CDC* pDC, CXTPDockBar* pBar)
  687. {
  688. _FillRect(pDC, ((CWnd*)pBar), m_bmpImageFill);
  689. }
  690. void CCustomBackgroundTheme::FillCommandBarEntry(CDC* pDC, CXTPCommandBar* pBar)
  691. {
  692. CRect rc;
  693. pBar->GetClientRect(&rc);
  694. _FillRect(pDC, pBar, m_bmpImageFill);
  695. if (pBar->GetPosition() == xtpBarFloating || pBar->GetPosition() == xtpBarPopup)
  696. {
  697. Draw3dRect(pDC, rc, COLOR_3DFACE, 0);
  698. rc.DeflateRect(1, 1);
  699. }
  700. Draw3dRect(pDC, rc, COLOR_BTNHILIGHT, COLOR_3DSHADOW);
  701. }