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

对话框与窗口

开发平台:

Visual C++

  1. // XTTabBaseTheme.cpp: implementation of the CXTTabBaseTheme class.
  2. //
  3. // This file is a part of the XTREME CONTROLS 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 "Common/XTPIntel80Helpers.h"
  22. #include "Common/XTPWinThemeWrapper.h"
  23. #include "XTTabBaseTheme.h"
  24. #include "XTDefines.h"
  25. #include "XTUtil.h"
  26. #include "XTGlobal.h"
  27. #include "XTVC50Helpers.h"
  28. #include "XTTabBase.h"
  29. #include "XTTabCtrlButtons.h"
  30. #define DB_LEFT        0x0002
  31. #define DB_RIGHT       0x0004
  32. #define DB_CROSS       0x0008
  33. #define DB_ENABLED     0x0000
  34. #define DB_DISABLED    0x0100
  35. #define DB_PRESSED     0x1000
  36. #define DB_OVER        0x4000
  37. #define DB_ISENABLED(Style) (!((Style)&DB_DISABLED))
  38. #define DB_ISPRESSED(Style) (((Style) & (DB_PRESSED)) != 0)
  39. #define DB_ISOVER(Style) (((Style)&DB_OVER) == DB_OVER)
  40. #ifdef _DEBUG
  41. #undef THIS_FILE
  42. static char THIS_FILE[] = __FILE__;
  43. #define new DEBUG_NEW
  44. #endif
  45. IMPLEMENT_THEME_FACTORY(CXTTabBaseTheme)
  46. //===========================================================================
  47. // CXTTabBaseTheme class
  48. //===========================================================================
  49. CXTTabBaseTheme::CXTTabBaseTheme()
  50. : m_bUseWinThemes(TRUE)
  51. , m_bSystemDrawing(FALSE)
  52. {
  53. }
  54. CXTTabBaseTheme::~CXTTabBaseTheme()
  55. {
  56. }
  57. void CXTTabBaseTheme::RefreshMetrics()
  58. {
  59. CXTThemeManagerStyle ::RefreshMetrics();
  60. m_clrNormalText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  61. m_clrSelectedText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  62. m_iEdge = ::GetSystemMetrics(SM_CYEDGE);
  63. m_wrapTheme.OpenTheme(0, L"TAB");
  64. }
  65. void CXTTabBaseTheme::DrawBorders(CDC* pDC, const CRect& rcClient)
  66. {
  67. CRect rcBorder = rcClient;
  68. if (m_bUseWinThemes && m_wrapTheme.IsAppThemeReady())
  69. {
  70. }
  71. else
  72. {
  73. pDC->Draw3dRect(&rcBorder, GetXtremeColor(COLOR_3DHILIGHT),
  74. GetXtremeColor(COLOR_3DDKSHADOW));
  75. rcBorder.DeflateRect(1, 1);
  76. pDC->Draw3dRect(&rcBorder, GetXtremeColor(COLOR_3DFACE),
  77. GetXtremeColor(COLOR_3DSHADOW));
  78. }
  79. }
  80. void CXTTabBaseTheme::DrawTabCtrl(CDC* pDC, CXTTabBase* pTabCtrlBase)
  81. {
  82. CTabCtrl* pTabCtrl = pTabCtrlBase->GetTabCtrlImpl();
  83. CXTPClientRect rcClient(pTabCtrl);
  84. pDC->FillSolidRect(rcClient, GetBackColor());
  85. if ((m_enumTheme == xtThemeDefault) && (IsTop(GetTabStyle(pTabCtrl)) || !m_wrapTheme.IsAppThemed()))
  86. {
  87. ShowButtons(pTabCtrlBase);
  88. PROTECTED_DEFWINDOWPROC_CALL(CXTTabBaseTheme, pTabCtrlBase->GetTabCtrlImpl(), WM_PAINT, (WPARAM)pDC->m_hDC, 0);
  89. return;
  90. }
  91. if (m_bSystemDrawing)
  92. {
  93. ShowButtons(pTabCtrlBase);
  94. PROTECTED_DEFWINDOWPROC_CALL(CXTTabBaseTheme, pTabCtrlBase->GetTabCtrlImpl(), WM_PAINT, (WPARAM)pDC->m_hDC, 0);
  95. return;
  96. }
  97. DrawBorders(pDC, rcClient);
  98. if (pTabCtrl->GetItemCount() != 0)
  99. {
  100. FillHeader(pDC, pTabCtrlBase, GetHeaderRect(pTabCtrlBase));
  101. // draw remaining tabs
  102. for (int iItem = 0; iItem < pTabCtrl->GetItemCount(); ++iItem)
  103. {
  104. DrawTab(pDC, pTabCtrlBase, iItem);
  105. }
  106. DrawTab(pDC, pTabCtrlBase, pTabCtrl->GetCurSel());
  107. ShowButtons(pTabCtrlBase);
  108. if (pTabCtrlBase->m_bXPBorder)
  109. {
  110. CRect rcChild;
  111. pTabCtrlBase->GetChildRect(rcChild);
  112. rcChild.InflateRect(1, 1);
  113. DrawBorder(pDC, rcChild);
  114. }
  115. }
  116. else
  117. {
  118. ShowButtons(pTabCtrlBase);
  119. }
  120. }
  121. void CXTTabBaseTheme::FillHeader(CDC* pDC, CXTTabBase* pTabCtrlBase, CRect rcHeader)
  122. {
  123. pDC->FillSolidRect(rcHeader, GetBackColor());
  124. DWORD dwStyle = GetTabStyle(pTabCtrlBase->GetTabCtrlImpl());
  125. if (m_bUseWinThemes && m_wrapTheme.IsAppThemeReady())
  126. {
  127. CXTPClientRect rc(pTabCtrlBase->GetTabCtrlImpl());
  128. if (IsRight(dwStyle))
  129. {
  130. rc.right = rcHeader.left + 1;
  131. }
  132. else if (IsLeft(dwStyle))
  133. {
  134. rc.left = rcHeader.right;
  135. }
  136. else if (IsBottom(dwStyle))
  137. {
  138. rc.bottom = rcHeader.top + 1;
  139. }
  140. else
  141. {
  142. rc.top = rcHeader.bottom;
  143. }
  144. m_wrapTheme.DrawThemeBackground(pDC->GetSafeHdc(), TABP_PANE,
  145. 0, &rc, 0);
  146. return;
  147. }
  148. // draw a line to separate tab area.
  149. if (IsRight(dwStyle))
  150. {
  151. pDC->FillSolidRect(rcHeader.left-2, rcHeader.top,
  152. 1, rcHeader.Height()-1, GetXtremeColor(COLOR_3DSHADOW));
  153. pDC->FillSolidRect(rcHeader.left-1, rcHeader.top,
  154. 1, rcHeader.Height()-1, GetXtremeColor(COLOR_3DDKSHADOW));
  155. }
  156. else if (IsLeft(dwStyle))
  157. {
  158. pDC->FillSolidRect(rcHeader.right, rcHeader.top,
  159. 1, rcHeader.Height(), GetXtremeColor(COLOR_3DHILIGHT));
  160. }
  161. else if (IsBottom(dwStyle))
  162. {
  163. pDC->FillSolidRect(rcHeader.left+1, rcHeader.top-2,
  164. rcHeader.Width()-2, 1, GetXtremeColor(COLOR_3DSHADOW));
  165. pDC->FillSolidRect(rcHeader.left, rcHeader.top-1,
  166. rcHeader.Width(), 1, GetXtremeColor(COLOR_3DDKSHADOW));
  167. }
  168. else
  169. {
  170. pDC->FillSolidRect(rcHeader.left, rcHeader.bottom,
  171. rcHeader.Width()-1, 1, GetXtremeColor(COLOR_3DHILIGHT));
  172. }
  173. }
  174. void CXTTabBaseTheme::SwapColors(COLORREF& clrLight, COLORREF& clrDark)
  175. {
  176. COLORREF clr(clrLight);
  177. clrLight = clrDark;
  178. clrDark = clr;
  179. }
  180. void CXTTabBaseTheme::VerticalLine(CDC* pDC, int x, int y, int nLength, COLORREF clr)
  181. {
  182. if (clr != COLORREF_NULL)
  183. pDC->FillSolidRect(x, y, 1, nLength, clr);
  184. }
  185. void CXTTabBaseTheme::HorizontalLine(CDC* pDC, int x, int y, int nLength, COLORREF clr)
  186. {
  187. if (clr != COLORREF_NULL)
  188. pDC->FillSolidRect(x, y, nLength, 1, clr);
  189. }
  190. void CXTTabBaseTheme::Pixel(CDC* pDC, int x, int y, COLORREF clr)
  191. {
  192. if (clr != COLORREF_NULL)
  193. pDC->SetPixel(x, y, clr);
  194. }
  195. void CXTTabBaseTheme::DrawRotatedBitsBottom(int cx, int cy, UINT* pSrcBits, UINT* pDestBits)
  196. {
  197. UINT* pSrc = &pSrcBits[cx * (cy - 1)];
  198. for (int i = 0; i < cy; i++)
  199. {
  200. pSrcBits = pSrc;
  201. for (int j = 0; j < cx; j++)
  202. {
  203. *pDestBits++ = *pSrcBits++;
  204. }
  205. pSrc -= cx;
  206. }
  207. }
  208. void CXTTabBaseTheme::DrawRotatedBitsRight(int cx, int cy, UINT* pSrcBits, UINT* pDestBits)
  209. {
  210. UINT* pSrc = pSrcBits;
  211. for (int i = 0; i < cy; i++)
  212. {
  213. pSrcBits = pSrc;
  214. for (int j = 0; j < cx; j++)
  215. {
  216. *pDestBits++ = *pSrcBits;
  217. pSrcBits += cy;
  218. }
  219. pSrc += 1;
  220. }
  221. }
  222. void CXTTabBaseTheme::DrawRotatedBitsLeft(int cx, int cy, UINT* pSrcBits, UINT* pDestBits)
  223. {
  224. UINT* pSrc = pSrcBits;
  225. pDestBits += cx * cy - 1;
  226. for (int i = 0; i < cy; i++)
  227. {
  228. pSrcBits = pSrc;
  229. for (int j = 0; j < cx; j++)
  230. {
  231. *pDestBits-- = *pSrcBits;
  232. pSrcBits += cy;
  233. }
  234. pSrc += 1;
  235. }
  236. }
  237. void CXTTabBaseTheme::DrawRotatedButton(CDC* pDC, CRect rcItem, BOOL bSelected, BOOL bSwap, LPFNDRAWROTATEDBITS pfnRotatedProc)
  238. {
  239. const int cx = rcItem.Width();
  240. const int cy = rcItem.Height();
  241. BITMAPINFOHEADER BMI;
  242. // Fill in the header info.
  243. ZeroMemory (&BMI, sizeof(BMI));
  244. BMI.biSize = sizeof(BITMAPINFOHEADER);
  245. BMI.biWidth = bSwap ? cy : cx;
  246. BMI.biHeight = bSwap ? cx : cy;
  247. BMI.biPlanes = 1;
  248. BMI.biBitCount = 32;
  249. BMI.biCompression = BI_RGB;   // No compression
  250. UINT* pSrcBits = NULL;
  251. HBITMAP hbmSrc = CreateDIBSection (NULL, (BITMAPINFO *)&BMI, DIB_RGB_COLORS, (void **)&pSrcBits, 0, 0l);
  252. BMI.biWidth = cx;
  253. BMI.biHeight = cy;
  254. UINT* pDestBits = NULL;
  255. HBITMAP hbmDest = CreateDIBSection (NULL, (BITMAPINFO *)&BMI, DIB_RGB_COLORS, (void **)&pDestBits, 0, 0l);
  256. CDC dc;
  257. dc.CreateCompatibleDC(NULL);
  258. HGDIOBJ hbmpOld = ::SelectObject(dc, hbmSrc);
  259. CRect rcDraw(0, 0, bSwap ? cy: cx, bSwap ? cx : cy);
  260. dc.FillSolidRect(rcDraw, GetBackColor());
  261. m_wrapTheme.DrawThemeBackground(dc.GetSafeHdc(), TABP_TABITEM,
  262. bSelected ? TIS_SELECTED : TIS_NORMAL, &rcDraw, 0);
  263. (*pfnRotatedProc)(cx, cy, pSrcBits, pDestBits);
  264. pDC->DrawState(rcItem.TopLeft(), rcItem.Size(), hbmDest, DST_BITMAP);
  265. ::SelectObject(dc, hbmpOld);
  266. DeleteObject(hbmSrc);
  267. DeleteObject(hbmDest);
  268. }
  269. void CXTTabBaseTheme::FillTabFaceNativeWinXP(CDC* pDC, CTabCtrl* pTabCtrl, CRect rcItem, BOOL bSelected)
  270. {
  271. DWORD dwStyle = GetTabStyle(pTabCtrl);
  272. if (IsRight(dwStyle))
  273. {
  274. rcItem.InflateRect(1, 0, 0, 0);
  275. if (bSelected)
  276. {
  277. rcItem.InflateRect(1, 2, 2, 2);
  278. pDC->ExcludeClipRect(rcItem.left, rcItem.top, rcItem.left + 1, rcItem.top + 1);
  279. pDC->ExcludeClipRect(rcItem.left, rcItem.bottom - 1, rcItem.left + 1, rcItem.bottom);
  280. }
  281. DrawRotatedButton(pDC, rcItem, bSelected, TRUE, DrawRotatedBitsRight);
  282. }
  283. else if (IsLeft(dwStyle))
  284. {
  285. if (bSelected)
  286. {
  287. rcItem.InflateRect(2, 2, 1, 2);
  288. pDC->ExcludeClipRect(rcItem.right - 1, rcItem.top, rcItem.right, rcItem.top + 1);
  289. pDC->ExcludeClipRect(rcItem.right - 1, rcItem.bottom - 1, rcItem.right, rcItem.bottom);
  290. }
  291. DrawRotatedButton(pDC, rcItem, bSelected, TRUE, DrawRotatedBitsLeft);
  292. }
  293. else if (IsBottom(dwStyle))
  294. {
  295. rcItem.InflateRect(0, 1, 0, 0);
  296. if (bSelected)
  297. {
  298. rcItem.InflateRect(2, 1, 2, 2);
  299. pDC->ExcludeClipRect(rcItem.left, rcItem.top, rcItem.left + 1, rcItem.top + 1);
  300. pDC->ExcludeClipRect(rcItem.right - 1, rcItem.top, rcItem.right, rcItem.top + 1);
  301. }
  302. DrawRotatedButton(pDC, rcItem, bSelected, FALSE, DrawRotatedBitsBottom);
  303. }
  304. else
  305. {
  306. if (bSelected)
  307. {
  308. rcItem.InflateRect(2, 2, 2, 1);
  309. pDC->ExcludeClipRect(rcItem.left, rcItem.bottom - 1, rcItem.left + 1, rcItem.bottom);
  310. pDC->ExcludeClipRect(rcItem.right - 1, rcItem.bottom - 1, rcItem.right, rcItem.bottom);
  311. }
  312. m_wrapTheme.DrawThemeBackground(pDC->GetSafeHdc(), TABP_TABITEM,
  313. bSelected ? TIS_SELECTED: TIS_NORMAL, &rcItem, 0);
  314. }
  315. }
  316. void CXTTabBaseTheme::FillTabFace(CDC* pDC, CTabCtrl* pTabCtrl, CRect rcItem, BOOL bSelected)
  317. {
  318. if (m_bUseWinThemes && m_wrapTheme.IsAppThemeReady())
  319. {
  320. FillTabFaceNativeWinXP(pDC, pTabCtrl, rcItem, bSelected);
  321. return ;
  322. }
  323. DWORD dwStyle = GetTabStyle(pTabCtrl);
  324. if (IsRight(dwStyle))
  325. {
  326. if (bSelected)
  327. {
  328. rcItem.InflateRect(2, 2, 1, 2);
  329. // paint the selected tab background.
  330. pDC->FillSolidRect(&rcItem, GetBackColor());
  331. HorizontalLine(pDC, rcItem.left, rcItem.top, rcItem.Width()-1, GetXtremeColor(COLOR_3DHILIGHT));
  332. HorizontalLine(pDC, rcItem.left, rcItem.top+1, rcItem.Width()-2, GetXtremeColor(COLOR_3DFACE));
  333. Pixel(pDC, rcItem.right-1, rcItem.top+1, GetXtremeColor(COLOR_3DHILIGHT));
  334. VerticalLine(pDC, rcItem.right, rcItem.top+2, rcItem.Height()-4, GetXtremeColor(COLOR_3DDKSHADOW));
  335. VerticalLine(pDC, rcItem.right-1, rcItem.top+2, rcItem.Height()-4, GetXtremeColor(COLOR_3DSHADOW));
  336. HorizontalLine(pDC, rcItem.left+1, rcItem.bottom-2, rcItem.Width()-1, GetXtremeColor(COLOR_3DSHADOW));
  337. HorizontalLine(pDC, rcItem.left+1, rcItem.bottom-1, rcItem.Width()-2, GetXtremeColor(COLOR_3DDKSHADOW));
  338. Pixel(pDC, rcItem.right-1, rcItem.bottom-2, GetXtremeColor(COLOR_3DDKSHADOW));
  339. }
  340. else
  341. {
  342. // paint the selected tab background.
  343. pDC->FillSolidRect(&rcItem, GetBackColor());
  344. HorizontalLine(pDC, rcItem.left, rcItem.top, rcItem.Width()-2, GetXtremeColor(COLOR_3DHILIGHT));
  345. HorizontalLine(pDC, rcItem.left, rcItem.top+1, rcItem.Width()-2, GetXtremeColor(COLOR_3DFACE));
  346. Pixel(pDC, rcItem.right-2, rcItem.top+1, GetXtremeColor(COLOR_3DHILIGHT));
  347. VerticalLine(pDC, rcItem.right-1, rcItem.top+2, rcItem.Height()-4, GetXtremeColor(COLOR_3DDKSHADOW));
  348. VerticalLine(pDC, rcItem.right-2, rcItem.top+2, rcItem.Height()-4, GetXtremeColor(COLOR_3DSHADOW));
  349. HorizontalLine(pDC, rcItem.left, rcItem.bottom-2, rcItem.Width()-2, GetXtremeColor(COLOR_3DSHADOW));
  350. HorizontalLine(pDC, rcItem.left, rcItem.bottom-1, rcItem.Width()-2, GetXtremeColor(COLOR_3DDKSHADOW));
  351. Pixel(pDC, rcItem.right-2, rcItem.bottom-2, GetXtremeColor(COLOR_3DDKSHADOW));
  352. }
  353. }
  354. else if (IsLeft(dwStyle))
  355. {
  356. if (bSelected)
  357. {
  358. rcItem.InflateRect(2, 2, 1, 1);
  359. // paint the selected tab background.
  360. pDC->FillSolidRect(&rcItem, GetBackColor());
  361. HorizontalLine(pDC, rcItem.left+2, rcItem.top, rcItem.Width()-2, GetXtremeColor(COLOR_3DHILIGHT));
  362. HorizontalLine(pDC, rcItem.left+2, rcItem.top+1, rcItem.Width()-2, GetXtremeColor(COLOR_3DFACE));
  363. Pixel(pDC, rcItem.left+1, rcItem.top+1, GetXtremeColor(COLOR_3DHILIGHT));
  364. VerticalLine(pDC, rcItem.left, rcItem.top+2, rcItem.Height()-3, GetXtremeColor(COLOR_3DHILIGHT));
  365. VerticalLine(pDC, rcItem.left+1, rcItem.top+2, rcItem.Height()-3, GetXtremeColor(COLOR_3DFACE));
  366. HorizontalLine(pDC, rcItem.left+1, rcItem.bottom-1, rcItem.Width()-2, GetXtremeColor(COLOR_3DSHADOW));
  367. HorizontalLine(pDC, rcItem.left+2, rcItem.bottom, rcItem.Width()-3, GetXtremeColor(COLOR_3DDKSHADOW));
  368. Pixel(pDC, rcItem.left+1, rcItem.bottom-1, GetXtremeColor(COLOR_3DDKSHADOW));
  369. }
  370. else
  371. {
  372. // paint the selected tab background.
  373. pDC->FillSolidRect(&rcItem, GetBackColor());
  374. HorizontalLine(pDC, rcItem.left+2, rcItem.top, rcItem.Width()-1, GetXtremeColor(COLOR_3DHILIGHT));
  375. HorizontalLine(pDC, rcItem.left+2, rcItem.top+1, rcItem.Width()-2, GetXtremeColor(COLOR_3DFACE));
  376. Pixel(pDC, rcItem.left+1, rcItem.top+1, GetXtremeColor(COLOR_3DHILIGHT));
  377. VerticalLine(pDC, rcItem.left, rcItem.top+2, rcItem.Height()-4, GetXtremeColor(COLOR_3DHILIGHT));
  378. VerticalLine(pDC, rcItem.left+1, rcItem.top+2, rcItem.Height()-4, GetXtremeColor(COLOR_3DFACE));
  379. HorizontalLine(pDC, rcItem.left+1, rcItem.bottom-2, rcItem.Width()-1, GetXtremeColor(COLOR_3DSHADOW));
  380. HorizontalLine(pDC, rcItem.left+2, rcItem.bottom-1, rcItem.Width()-2, GetXtremeColor(COLOR_3DDKSHADOW));
  381. Pixel(pDC, rcItem.left+1, rcItem.bottom-2, GetXtremeColor(COLOR_3DDKSHADOW));
  382. }
  383. }
  384. else if (IsBottom(dwStyle))
  385. {
  386. if (bSelected)
  387. {
  388. rcItem.InflateRect(2, 2, 2, 1);
  389. // paint the selected tab background.
  390. pDC->FillSolidRect(&rcItem, GetBackColor());
  391. VerticalLine(pDC, rcItem.left, rcItem.top, rcItem.Height()-1, GetXtremeColor(COLOR_3DHILIGHT));
  392. VerticalLine(pDC, rcItem.left+1, rcItem.top, rcItem.Height()-1, GetXtremeColor(COLOR_3DFACE));
  393. Pixel(pDC, rcItem.left+1, rcItem.bottom-1, GetXtremeColor(COLOR_3DHILIGHT));
  394. HorizontalLine(pDC, rcItem.left+2, rcItem.bottom, rcItem.Width()-4, GetXtremeColor(COLOR_3DDKSHADOW));
  395. HorizontalLine(pDC, rcItem.left+2, rcItem.bottom-1, rcItem.Width()-4, GetXtremeColor(COLOR_3DSHADOW));
  396. VerticalLine(pDC, rcItem.right-1, rcItem.top+1, rcItem.Height()-2, GetXtremeColor(COLOR_3DDKSHADOW));
  397. VerticalLine(pDC, rcItem.right-2, rcItem.top+1, rcItem.Height()-2, GetXtremeColor(COLOR_3DSHADOW));
  398. Pixel(pDC, rcItem.right-2, rcItem.bottom-1, GetXtremeColor(COLOR_3DDKSHADOW));
  399. }
  400. else
  401. {
  402. // paint the selected tab background.
  403. pDC->FillSolidRect(&rcItem, GetBackColor());
  404. VerticalLine(pDC, rcItem.left, rcItem.top, rcItem.Height()-2, GetXtremeColor(COLOR_3DHILIGHT));
  405. VerticalLine(pDC, rcItem.left+1, rcItem.top, rcItem.Height()-2, GetXtremeColor(COLOR_3DFACE));
  406. Pixel(pDC, rcItem.left+1, rcItem.bottom-2, GetXtremeColor(COLOR_3DHILIGHT));
  407. HorizontalLine(pDC, rcItem.left+2, rcItem.bottom-1, rcItem.Width()-4, GetXtremeColor(COLOR_3DDKSHADOW));
  408. HorizontalLine(pDC, rcItem.left+2, rcItem.bottom-2, rcItem.Width()-4, GetXtremeColor(COLOR_3DSHADOW));
  409. VerticalLine(pDC, rcItem.right-1, rcItem.top-1, rcItem.Height()-1, GetXtremeColor(COLOR_3DDKSHADOW));
  410. VerticalLine(pDC, rcItem.right-2, rcItem.top-1, rcItem.Height()-1, GetXtremeColor(COLOR_3DSHADOW));
  411. Pixel(pDC, rcItem.right-2, rcItem.bottom-2, GetXtremeColor(COLOR_3DDKSHADOW));
  412. }
  413. }
  414. else
  415. {
  416. if (bSelected)
  417. {
  418. rcItem.InflateRect(2, 2, 2, 1);
  419. // paint the selected tab background.
  420. pDC->FillSolidRect(&rcItem, GetBackColor());
  421. VerticalLine(pDC, rcItem.left, rcItem.top+2, rcItem.Height()-1, GetXtremeColor(COLOR_3DHILIGHT));
  422. VerticalLine(pDC, rcItem.left+1, rcItem.top+2, rcItem.Height()-1, GetXtremeColor(COLOR_3DFACE));
  423. Pixel(pDC, rcItem.left+1, rcItem.top+1, GetXtremeColor(COLOR_3DHILIGHT));
  424. HorizontalLine(pDC, rcItem.left+2, rcItem.top, rcItem.Width()-4, GetXtremeColor(COLOR_3DHILIGHT));
  425. HorizontalLine(pDC, rcItem.left+2, rcItem.top+1, rcItem.Width()-4, GetXtremeColor(COLOR_3DFACE));
  426. VerticalLine(pDC, rcItem.right-1, rcItem.top+2, rcItem.Height()-3, GetXtremeColor(COLOR_3DDKSHADOW));
  427. VerticalLine(pDC, rcItem.right-2, rcItem.top+2, rcItem.Height()-3, GetXtremeColor(COLOR_3DSHADOW));
  428. Pixel(pDC, rcItem.right-2, rcItem.top+1, GetXtremeColor(COLOR_3DDKSHADOW));
  429. }
  430. else
  431. {
  432. // paint the selected tab background.
  433. pDC->FillSolidRect(&rcItem, GetBackColor());
  434. VerticalLine(pDC, rcItem.left, rcItem.top+2, rcItem.Height()-2, GetXtremeColor(COLOR_3DHILIGHT));
  435. VerticalLine(pDC, rcItem.left+1, rcItem.top+2, rcItem.Height()-2, GetXtremeColor(COLOR_3DFACE));
  436. Pixel(pDC, rcItem.left+1, rcItem.top+1, GetXtremeColor(COLOR_3DHILIGHT));
  437. HorizontalLine(pDC, rcItem.left+2, rcItem.top, rcItem.Width()-4, GetXtremeColor(COLOR_3DHILIGHT));
  438. HorizontalLine(pDC, rcItem.left+2, rcItem.top+1, rcItem.Width()-4, GetXtremeColor(COLOR_3DFACE));
  439. VerticalLine(pDC, rcItem.right-1, rcItem.top+2, rcItem.Height()-2, GetXtremeColor(COLOR_3DDKSHADOW));
  440. VerticalLine(pDC, rcItem.right-2, rcItem.top+2, rcItem.Height()-2, GetXtremeColor(COLOR_3DSHADOW));
  441. Pixel(pDC, rcItem.right-2, rcItem.top+1, GetXtremeColor(COLOR_3DDKSHADOW));
  442. }
  443. }
  444. }
  445. void CXTTabBaseTheme::DrawTabIcon(CDC* pDC, CTabCtrl* pTabCtrl, CRect& rcItem, int iItem)
  446. {
  447. TC_ITEM tci;
  448. tci.mask = TCIF_IMAGE;
  449. if (pTabCtrl->GetItem(iItem, &tci))
  450. {
  451. CImageList* pImageList = pTabCtrl->GetImageList();
  452. if (pImageList && tci.iImage >= 0)
  453. {
  454. CPoint point = rcItem.TopLeft();
  455. DWORD dwStyle = GetTabStyle(pTabCtrl);
  456. if (IsHorz(dwStyle))
  457. {
  458. point.Offset(m_iEdge*2, IsTop(dwStyle) ? m_iEdge : 1);
  459. }
  460. else
  461. {
  462. point.Offset(IsLeft(dwStyle) ? m_iEdge : 1, m_iEdge*2);
  463. }
  464. // Draw any associated icons.
  465. pImageList->Draw(pDC, tci.iImage, point, ILD_TRANSPARENT);
  466. IMAGEINFO info;
  467. pImageList->GetImageInfo(tci.iImage, &info);
  468. CRect rcImage(info.rcImage);
  469. if (IsHorz(dwStyle))
  470. {
  471. rcItem.left += rcImage.Width() + m_iEdge;
  472. }
  473. else
  474. {
  475. rcItem.top += rcImage.Height() + m_iEdge;
  476. }
  477. }
  478. }
  479. }
  480. void CXTTabBaseTheme::DrawTabText(CDC* pDC, CTabCtrl* pTabCtrl, CRect& rcItem, int iItem, BOOL bSelected, BOOL bBoldFont)
  481. {
  482. TCHAR szLabel[256];
  483. szLabel[0] = 0;
  484. TC_ITEM tci;
  485. tci.mask = TCIF_TEXT;
  486. tci.pszText = szLabel;
  487. tci.cchTextMax = _countof(szLabel);
  488. if (pTabCtrl->GetItem(iItem, &tci))
  489. {
  490. int nLen = (int)_tcslen(szLabel);
  491. if (nLen > 0)
  492. {
  493. pDC->SetBkMode(TRANSPARENT);
  494. pDC->SetTextColor(bSelected ? m_clrSelectedText : m_clrNormalText);
  495. // Set the font for the tab label.
  496. DWORD dwStyle = GetTabStyle(pTabCtrl);
  497. CXTPFontDC font(pDC, (bBoldFont && bSelected) ? (IsHorz(dwStyle) ? &XTAuxData().fontBold : &XTAuxData().fontVertBold): (IsHorz(dwStyle) ? &XTAuxData().font : &XTAuxData().fontVert));
  498. // Draw the tab label.
  499. if (IsHorz(dwStyle))
  500. {
  501. pDC->DrawText(szLabel, nLen, rcItem, DT_SINGLELINE | DT_VCENTER | DT_CENTER | DT_END_ELLIPSIS);
  502. }
  503. else
  504. {
  505. CSize sz = pDC->GetTextExtent(szLabel, nLen);
  506. rcItem.left = rcItem.right-(rcItem.Width()-sz.cy + 1)/ 2;
  507. rcItem.top = rcItem.top+(rcItem.Height()-sz.cx + 1)/ 2;
  508. pDC->DrawText(szLabel, nLen, &rcItem, DT_SINGLELINE | DT_NOCLIP);
  509. }
  510. }
  511. }
  512. }
  513. void CXTTabBaseTheme::DrawTab(CDC* pDC, CXTTabBase* pTabCtrlBase, int iItem)
  514. {
  515. // Get the current tab selection.
  516. CTabCtrl* pTabCtrl = pTabCtrlBase->GetTabCtrlImpl();
  517. int iCurSel = pTabCtrl->GetCurSel();
  518. // Get the tab item size.
  519. CRect rcItem;
  520. pTabCtrl->GetItemRect(iItem, &rcItem);
  521. // Draw the tab item.
  522. BOOL bSelected = (iItem == iCurSel);
  523. FillTabFace(pDC, pTabCtrl, rcItem, bSelected);
  524. DrawTabIcon(pDC, pTabCtrl, rcItem, iItem);
  525. DrawTabText(pDC, pTabCtrl, rcItem, iItem, bSelected, pTabCtrlBase->m_bBoldFont);
  526. }
  527. CRect CXTTabBaseTheme::GetHeaderRect(CXTTabBase* pTabCtrlBase)
  528. {
  529. CTabCtrl* pTabCtrl = pTabCtrlBase->GetTabCtrlImpl();
  530. CRect rcHeader;
  531. pTabCtrl->GetClientRect(&rcHeader);
  532. // get the selected tab item rect.
  533. CRect rcItem;
  534. pTabCtrl->GetItemRect(pTabCtrl->GetCurSel(), &rcItem);
  535. DWORD dwStyle = GetTabStyle(pTabCtrlBase->GetTabCtrlImpl());
  536. if (IsRight(dwStyle))
  537. {
  538. rcHeader.left = rcItem.left;
  539. }
  540. else if (IsLeft(dwStyle))
  541. {
  542. rcHeader.right = rcItem.right;
  543. }
  544. else if (IsBottom(dwStyle))
  545. {
  546. rcHeader.top = rcItem.top;
  547. }
  548. else
  549. {
  550. rcHeader.bottom = (rcHeader.top + rcItem.Height()) * pTabCtrl->GetRowCount() + m_iEdge;
  551. }
  552. return rcHeader;
  553. }
  554. void CXTTabBaseTheme::DrawButton(CDC* /*pDC*/, CXTTabCtrlButton* /*pButton*/, COLORREF /*clrButton*/)
  555. {
  556. ASSERT(FALSE);
  557. }
  558. COLORREF CXTTabBaseTheme::FillButtons(CDC* /*pDC*/, CXTTabCtrlButtons* /*pButtons*/)
  559. {
  560. ASSERT(FALSE);
  561. return 0;
  562. }
  563. void CXTTabBaseTheme::ShowButtons(CXTTabBase* pTabCtrlBase)
  564. {
  565. CXTTabCtrlButtons* pNavBtns = pTabCtrlBase->GetButtons();
  566. CTabCtrl* pTabCtrl = pTabCtrlBase->GetTabCtrlImpl();
  567. if (::IsWindow(pTabCtrl->GetSafeHwnd()) && pNavBtns)
  568. {
  569. const bool bVertical = (pTabCtrl->GetStyle() & TCS_VERTICAL) == TCS_VERTICAL;
  570. const bool bMultiLine = bVertical || ((pTabCtrl->GetStyle() & TCS_MULTILINE) == TCS_MULTILINE);
  571. if ((m_enumTheme != xtThemeDefault) && !bVertical && !bMultiLine && !pTabCtrlBase->m_bAutoCondensing)
  572. {
  573. CWnd* pWnd = pTabCtrl->GetDlgItem(1);
  574. pNavBtns->SubclassTabButtons(pWnd); // pWnd can be NULL
  575. pNavBtns->ShowButtons(TRUE);
  576. }
  577. else
  578. {
  579. pNavBtns->ShowButtons(FALSE);
  580. }
  581. }
  582. }
  583. CXTPPaintManagerColor CXTTabBaseTheme::GetBackColor() const
  584. {
  585. return GetXtremeColor(COLOR_3DFACE);
  586. }
  587. void CXTTabBaseTheme::AdjustBorders(CXTTabBase* pTabCtrl, CXTTcbItem* pMember)
  588. {
  589. if (pMember && ::IsWindow(pMember->pWnd->GetSafeHwnd()) && pTabCtrl->m_bXPBorder)
  590. {
  591. // add WS_BORDER, WS_EX_CLIENTEDGE and WS_EX_STATICEDGE window styles.
  592. pMember->pWnd->ModifyStyle(0, (pMember->dwStyle & WS_BORDER));
  593. pMember->pWnd->ModifyStyleEx(0, (pMember->dwExStyle & (WS_EX_CLIENTEDGE | WS_EX_STATICEDGE)));
  594. // Force WM_NCCALCSIZE to be called.
  595. pMember->pWnd->SetWindowPos(NULL, 0, 0, 0, 0,
  596. SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_FRAMECHANGED);
  597. }
  598. }
  599. void CXTTabBaseTheme::DrawBorder(CDC* /*pDC*/, const CRect& /*rcChild*/)
  600. {
  601. }
  602. //////////////////////////////////////////////////////////////////////////
  603. // CXTTabBaseThemeOfficeXP
  604. CXTTabBaseThemeOfficeXP::CXTTabBaseThemeOfficeXP()
  605. {
  606. }
  607. void CXTTabBaseThemeOfficeXP::RefreshMetrics()
  608. {
  609. CXTTabBaseTheme::RefreshMetrics();
  610. m_clrNormalText.SetStandardValue(GetXtremeColor(XPCOLOR_TAB_INACTIVE_TEXT));
  611. m_clrSelectedText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  612. m_iEdge *= 2;
  613. }
  614. void CXTTabBaseThemeOfficeXP::DrawBorders(CDC* /*pDC*/, const CRect& /*rcClient*/)
  615. {
  616. }
  617. void CXTTabBaseThemeOfficeXP::DrawTabIcon(CDC* pDC, CTabCtrl* pTabCtrl, CRect& rcItem, int iItem)
  618. {
  619. TC_ITEM tci;
  620. tci.mask = TCIF_IMAGE;
  621. if (pTabCtrl->GetItem(iItem, &tci))
  622. {
  623. CImageList* pImageList = pTabCtrl->GetImageList();
  624. if (pImageList && tci.iImage >= 0)
  625. {
  626. CPoint point = rcItem.TopLeft();
  627. DWORD dwStyle = GetTabStyle(pTabCtrl);
  628. if (IsHorz(dwStyle))
  629. {
  630. point.Offset(m_iEdge*2, m_iEdge/2);
  631. }
  632. else
  633. {
  634. point.Offset(IsRight(dwStyle) ? 1 : 2, m_iEdge*2);
  635. }
  636. // Draw any associated icons.
  637. pImageList->Draw(pDC, tci.iImage, point, ILD_TRANSPARENT);
  638. IMAGEINFO info;
  639. pImageList->GetImageInfo(tci.iImage, &info);
  640. CRect rcImage(info.rcImage);
  641. if (IsHorz(dwStyle))
  642. {
  643. rcItem.left += rcImage.Width() + m_iEdge;
  644. }
  645. else
  646. {
  647. rcItem.top += rcImage.Height() + m_iEdge;
  648. }
  649. }
  650. }
  651. }
  652. void CXTTabBaseThemeOfficeXP::FillHeader(CDC* pDC, CXTTabBase* pTabCtrlBase, CRect rcHeader)
  653. {
  654. pDC->FillSolidRect(rcHeader, GetXtremeColor(XPCOLOR_TAB_INACTIVE_BACK));
  655. // draw a line to separate tab area.
  656. DWORD dwStyle = GetTabStyle(pTabCtrlBase->GetTabCtrlImpl());
  657. if (IsRight(dwStyle))
  658. {
  659. pDC->FillSolidRect(rcHeader.left-1, rcHeader.top,
  660. 1, rcHeader.Height(), GetXtremeColor(COLOR_3DHILIGHT));
  661. }
  662. else if (IsLeft(dwStyle))
  663. {
  664. pDC->FillSolidRect(rcHeader.right, rcHeader.top,
  665. 1, rcHeader.Height(), GetXtremeColor(COLOR_3DHILIGHT));
  666. }
  667. else if (IsBottom(dwStyle))
  668. {
  669. pDC->FillSolidRect(rcHeader.left, rcHeader.top,
  670. rcHeader.Width(), 1, GetXtremeColor(COLOR_WINDOWFRAME));
  671. }
  672. else
  673. {
  674. pDC->FillSolidRect(rcHeader.left, rcHeader.bottom-1,
  675. rcHeader.Width(), 1, GetXtremeColor(COLOR_3DFACE));
  676. pDC->FillSolidRect(rcHeader.left, rcHeader.bottom-2,
  677. rcHeader.Width(), 1, GetXtremeColor(COLOR_3DHILIGHT));
  678. }
  679. }
  680. void CXTTabBaseThemeOfficeXP::FillTabFace(CDC* pDC, CTabCtrl* pTabCtrl, CRect rcItem, BOOL bSelected)
  681. {
  682. DWORD dwStyle = GetTabStyle(pTabCtrl);
  683. if (IsRight(dwStyle))
  684. {
  685. if (bSelected)
  686. {
  687. rcItem.InflateRect(1, -3, -1, 1);
  688. // paint the selected tab background.
  689. pDC->FillSolidRect(&rcItem, GetBackColor());
  690. HorizontalLine(pDC, rcItem.left, rcItem.top, rcItem.Width(), GetXtremeColor(COLOR_3DHILIGHT));
  691. VerticalLine(pDC, rcItem.right, rcItem.top, rcItem.Height() + 1, GetXtremeColor(COLOR_WINDOWFRAME));
  692. HorizontalLine(pDC, rcItem.left, rcItem.bottom, rcItem.Width(), GetXtremeColor(COLOR_WINDOWFRAME));
  693. }
  694. else
  695. {
  696. HorizontalLine(pDC, rcItem.left+2, rcItem.bottom+3, rcItem.Width()-4, GetXtremeColor(COLOR_3DSHADOW));
  697. }
  698. }
  699. else if (IsLeft(dwStyle))
  700. {
  701. if (bSelected)
  702. {
  703. rcItem.InflateRect(1, -3, 1, 1);
  704. // paint the selected tab background.
  705. pDC->FillSolidRect(&rcItem, GetBackColor());
  706. HorizontalLine(pDC, rcItem.left, rcItem.top, rcItem.Width(), GetXtremeColor(COLOR_3DHILIGHT));
  707. VerticalLine(pDC, rcItem.left, rcItem.top, rcItem.Height(), GetXtremeColor(COLOR_3DHILIGHT));
  708. HorizontalLine(pDC, rcItem.left, rcItem.bottom, rcItem.Width(), GetXtremeColor(COLOR_WINDOWFRAME));
  709. }
  710. else
  711. {
  712. HorizontalLine(pDC, rcItem.left+2, rcItem.bottom+3, rcItem.Width()-4, GetXtremeColor(COLOR_3DSHADOW));
  713. }
  714. }
  715. else if (IsBottom(dwStyle))
  716. {
  717. if (bSelected)
  718. {
  719. rcItem.InflateRect(-2, 0, 1, 1);
  720. // paint the selected tab background.
  721. pDC->FillSolidRect(&rcItem, GetBackColor());
  722. VerticalLine(pDC, rcItem.left, rcItem.top+1, rcItem.Height()-1, GetXtremeColor(COLOR_3DHILIGHT));
  723. HorizontalLine(pDC, rcItem.left, rcItem.bottom-1, rcItem.Width(), GetXtremeColor(COLOR_WINDOWFRAME));
  724. VerticalLine(pDC, rcItem.right, rcItem.top+1, rcItem.Height()-1, GetXtremeColor(COLOR_WINDOWFRAME));
  725. }
  726. else
  727. {
  728. VerticalLine(pDC, rcItem.right+1, rcItem.top+2, rcItem.Height()-3, GetXtremeColor(COLOR_3DSHADOW));
  729. }
  730. }
  731. else
  732. {
  733. if (bSelected)
  734. {
  735. rcItem.InflateRect(-2, 1, 2, 2);
  736. // paint the selected tab background.
  737. pDC->FillSolidRect(&rcItem, GetBackColor());
  738. VerticalLine(pDC, rcItem.left, rcItem.top+1, rcItem.Height()-2, GetXtremeColor(COLOR_3DHILIGHT));
  739. HorizontalLine(pDC, rcItem.left, rcItem.top, rcItem.Width(), GetXtremeColor(COLOR_3DHILIGHT));
  740. VerticalLine(pDC, rcItem.right, rcItem.top, rcItem.Height()-1, GetXtremeColor(COLOR_WINDOWFRAME));
  741. }
  742. else
  743. {
  744. VerticalLine(pDC, rcItem.right+2, rcItem.top+2, rcItem.Height()-3, GetXtremeColor(COLOR_3DSHADOW));
  745. }
  746. }
  747. }
  748. COLORREF CXTTabBaseThemeOfficeXP::FillButtons(CDC* pDC, CXTTabCtrlButtons* pButton)
  749. {
  750. CXTPClientRect rcClient(pButton);
  751. pDC->FillSolidRect(rcClient, XTPColorManager()->GetColor(XPCOLOR_TAB_INACTIVE_BACK));
  752. if ((pButton->GetTabCtrl()->GetStyle() & TCS_BOTTOM) != 0)
  753. {
  754. pDC->FillSolidRect(0, 0, rcClient.right, 1, GetXtremeColor(COLOR_BTNTEXT));
  755. }
  756. else
  757. {
  758. pDC->FillSolidRect(0, rcClient.bottom - 1, rcClient.right, 1, GetXtremeColor(COLOR_3DHILIGHT));
  759. }
  760. return XTPColorManager()->GetColor(XPCOLOR_TAB_INACTIVE_TEXT);
  761. }
  762. void CXTTabBaseThemeOfficeXP::DrawButton(CDC* pDC, CXTTabCtrlButton* pButton, COLORREF clrButton)
  763. {
  764. ASSERT (pDC != NULL);
  765. if (!pDC)
  766. return;
  767. CRect rc (pButton->GetRect());
  768. DWORD wStyle = pButton->m_wStyle;
  769. if (DB_ISENABLED(wStyle))
  770. {
  771. if (DB_ISPRESSED(wStyle))
  772. pDC->Draw3dRect(rc, RGB(0, 0, 0), GetSysColor(0x16));
  773. else if (DB_ISOVER(wStyle))
  774. pDC->Draw3dRect(rc, GetSysColor(0x16), RGB(0, 0, 0));
  775. if (DB_ISPRESSED(wStyle))
  776. {
  777. rc.OffsetRect(1, 1);
  778. }
  779. }
  780. CXTPPenDC pen(*pDC, clrButton);
  781. CBrush brush;
  782. CBrush* pOldBrush;
  783. if (DB_ISENABLED(wStyle))
  784. {
  785. brush.CreateSolidBrush(clrButton);
  786. pOldBrush = pDC->SelectObject(&brush);
  787. }
  788. else
  789. {
  790. pOldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
  791. }
  792. if (wStyle & DB_CROSS)
  793. {
  794. pDC->MoveTo(rc.left + 3, rc.top + 3);
  795. pDC->LineTo(rc.right - 4, rc.bottom - 5);
  796. pDC->MoveTo(rc.left + 4, rc.top + 3);
  797. pDC->LineTo(rc.right - 3, rc.bottom - 5);
  798. pDC->MoveTo(rc.left + 3, rc.bottom - 6);
  799. pDC->LineTo(rc.right - 4, rc.top + 2);
  800. pDC->MoveTo(rc.left + 4, rc.bottom - 6);
  801. pDC->LineTo(rc.right - 3, rc.top + 2);
  802. }
  803. else if (wStyle & DB_LEFT)
  804. {
  805. CPoint pts[] =
  806. {
  807. CPoint(rc.right - 5, rc.top + 2),
  808. CPoint(rc.right - 9, rc.top + 6),
  809. CPoint(rc.right - 5, rc.top + 10)
  810. };
  811. pDC->Polygon(pts, 3);
  812. }
  813. else if (wStyle & DB_RIGHT)
  814. {
  815. CPoint pts[] =
  816. {
  817. CPoint(rc.left + 4, rc.top + 2),
  818. CPoint(rc.left + 8, rc.top + 6),
  819. CPoint(rc.left + 4, rc.top + 10)
  820. };
  821. pDC->Polygon(pts, 3);
  822. }
  823. pDC->SelectObject(pOldBrush);
  824. }
  825. void CXTTabBaseThemeOfficeXP::AdjustBorders(CXTTabBase* pTabCtrl, CXTTcbItem* pMember)
  826. {
  827. if (pMember && ::IsWindow(pMember->pWnd->GetSafeHwnd()) && pTabCtrl->m_bXPBorder)
  828. {
  829. // remove WS_BORDER, WS_EX_CLIENTEDGE and WS_EX_STATICEDGE window styles.
  830. pMember->pWnd->ModifyStyle(WS_BORDER, 0);
  831. pMember->pWnd->ModifyStyleEx(WS_EX_CLIENTEDGE|WS_EX_STATICEDGE, 0);
  832. // Force WM_NCCALCSIZE to be called.
  833. pMember->pWnd->SetWindowPos(NULL, 0, 0, 0, 0,
  834. SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE|SWP_FRAMECHANGED);
  835. }
  836. }
  837. void CXTTabBaseThemeOfficeXP::DrawBorder(CDC* pDC, const CRect& rcChild)
  838. {
  839. pDC->Draw3dRect(&rcChild,
  840. GetXtremeColor(XPCOLOR_3DSHADOW), GetXtremeColor(XPCOLOR_3DSHADOW));
  841. }
  842. //////////////////////////////////////////////////////////////////////////
  843. // CXTTabBaseThemeOffice2003
  844. CXTTabBaseThemeOffice2003::CXTTabBaseThemeOffice2003()
  845. {
  846. }
  847. void CXTTabBaseThemeOffice2003::RefreshMetrics()
  848. {
  849. CXTTabBaseThemeOfficeXP::RefreshMetrics();
  850. m_clrHeaderFace.SetStandardValue(GetBackColor(),
  851. XTPColorManager()->LightColor(GetBackColor(), GetXtremeColor(COLOR_WINDOW), 0xcd));
  852. m_clrShadow.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW));
  853. m_clrHighlight.SetStandardValue(GetXtremeColor(COLOR_3DHIGHLIGHT));
  854. m_clrDarkShadow.SetStandardValue(GetXtremeColor(COLOR_3DDKSHADOW));
  855. m_clrButtonSelected.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_CHECKED));
  856. m_clrButtonNormal.SetStandardValue(GetBackColor());
  857. m_clrNormalText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  858. m_clrSelectedText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  859. switch (XTPColorManager()->GetCurrentSystemTheme())
  860. {
  861. case xtpSystemThemeBlue:
  862. case xtpSystemThemeRoyale:
  863. case xtpSystemThemeAero:
  864. {
  865. m_clrHeaderFace.SetStandardValue(RGB(196, 218, 250), RGB(252, 253, 254));
  866. m_clrDarkShadow.SetStandardValue(RGB(0, 53, 154));
  867. m_clrShadow.SetStandardValue(RGB(117, 166, 241));
  868. m_clrButtonSelected.SetStandardValue(RGB(255, 194, 115));
  869. m_clrButtonNormal.SetStandardValue(RGB(162, 192, 246));
  870. }
  871. break;
  872. case xtpSystemThemeOlive:
  873. {
  874. m_clrHeaderFace.SetStandardValue(RGB(242, 241, 228), RGB(252, 254, 254));
  875. m_clrDarkShadow.SetStandardValue(RGB(96, 119, 107));
  876. m_clrShadow.SetStandardValue(RGB(176, 194, 140));
  877. m_clrButtonNormal.SetStandardValue(RGB(208, 222, 170));
  878. m_clrButtonSelected.SetStandardValue(RGB(255, 194, 115));
  879. }
  880. break;
  881. case xtpSystemThemeSilver:
  882. {
  883. m_clrHeaderFace.SetStandardValue(RGB(243, 243, 247), RGB(252, 254, 254));
  884. m_clrDarkShadow.SetStandardValue(RGB(118, 116, 146));
  885. m_clrShadow.SetStandardValue(RGB(186, 185, 206));
  886. m_clrButtonNormal.SetStandardValue(RGB(217, 217, 230));
  887. m_clrButtonSelected.SetStandardValue(RGB(255, 194, 115));
  888. }
  889. break;
  890. }
  891. }
  892. AFX_INLINE BOOL IsRightOrBottom(DWORD dwStyle)
  893. {
  894. ASSERT(TCS_BOTTOM == TCS_RIGHT);
  895. return (dwStyle & TCS_BOTTOM);
  896. }
  897. void CXTTabBaseThemeOffice2003::FillHeader(CDC* pDC, CXTTabBase* pTabCtrlBase, CRect rcHeader)
  898. {
  899. COLORREF clrLight = m_clrHeaderFace.clrLight, clrDark = m_clrHeaderFace.clrDark;
  900. DWORD dwStyle = GetTabStyle(pTabCtrlBase->GetTabCtrlImpl());
  901. BOOL bHoriz = !(dwStyle & TCS_VERTICAL);
  902. if (IsRightOrBottom(dwStyle))  SwapColors(clrLight, clrDark);
  903. XTPDrawHelpers()->GradientFill(pDC, rcHeader, clrLight, clrDark, !bHoriz);
  904. if (IsRight(dwStyle))
  905. {
  906. pDC->FillSolidRect(rcHeader.left-1, rcHeader.top,
  907. 1, rcHeader.Height(), m_clrDarkShadow);
  908. }
  909. else if (IsLeft(dwStyle))
  910. {
  911. pDC->FillSolidRect(rcHeader.right, rcHeader.top,
  912. 1, rcHeader.Height(), m_clrDarkShadow);
  913. }
  914. else if (IsBottom(dwStyle))
  915. {
  916. pDC->FillSolidRect(rcHeader.left, rcHeader.top-1,
  917. rcHeader.Width(), 1, m_clrDarkShadow);
  918. }
  919. else
  920. {
  921. pDC->FillSolidRect(rcHeader.left, rcHeader.bottom-2,
  922. rcHeader.Width(), 1, m_clrDarkShadow);
  923. }
  924. }
  925. COLORREF CXTTabBaseThemeOffice2003::GradientFillTabFace(CDC* pDC, CTabCtrl* pTabCtrl, CRect rcItem, BOOL bSelected)
  926. {
  927. COLORREF clrItem = bSelected ? m_clrButtonSelected : m_clrButtonNormal;
  928. COLORREF clrLight = XTPColorManager()->LightColor(clrItem, RGB(255, 255, 255), 300), clrDark = clrItem;
  929. DWORD dwStyle = GetTabStyle(pTabCtrl);
  930. BOOL bHoriz = !(dwStyle & TCS_VERTICAL);
  931. if (IsRightOrBottom(dwStyle)) SwapColors(clrLight, clrDark);
  932. XTPDrawHelpers()->GradientFill(pDC, rcItem, clrLight, clrDark, !bHoriz);
  933. return clrItem;
  934. }
  935. void CXTTabBaseThemeOffice2003::FillTabFace(CDC* pDC, CTabCtrl* pTabCtrl, CRect rcItem, BOOL bSelected)
  936. {
  937. CRect rc(rcItem);
  938. CRect rcClient;
  939. pTabCtrl->GetClientRect(&rcClient);
  940. DWORD dwStyle = GetTabStyle(pTabCtrl);
  941. if (IsRight(dwStyle))
  942. {
  943. COLORREF clr = GradientFillTabFace(pDC, pTabCtrl, CRect(rc.left-(bSelected ? 1 : 0), rc.top + 1, rc.right, rc.bottom), bSelected);
  944. HorizontalLine(pDC, rc.left, rc.top, rc.Width() - 1, m_clrDarkShadow);
  945. Pixel(pDC, rc.right - 1, rc.top + 1, m_clrDarkShadow);
  946. VerticalLine(pDC, rc.right - 0, rc.top + 2, rc.Height() - 3, m_clrDarkShadow);
  947. HorizontalLine(pDC, rc.left, rc.bottom, rc.Width() - 1, m_clrDarkShadow);
  948. Pixel(pDC, rc.right - 1, rc.bottom - 1, m_clrDarkShadow);
  949. if (bSelected)
  950. {
  951. VerticalLine(pDC, rc.left - 2, rcClient.top, rcClient.Height(), clr);
  952. }
  953. }
  954. else if (IsLeft(dwStyle))
  955. {
  956. COLORREF clr = GradientFillTabFace(pDC, pTabCtrl, CRect(rc.left + 1, rc.top + 1, rc.right + (bSelected ? 1 : 0), rc.bottom), bSelected);
  957. HorizontalLine(pDC, rc.left + 2, rc.top, rc.Width() - 2, m_clrDarkShadow);
  958. Pixel(pDC, rc.left + 1, rc.top + 1, m_clrDarkShadow);
  959. VerticalLine(pDC, rc.left, rc.top + 2, rc.Height() - 3, m_clrDarkShadow);
  960. HorizontalLine(pDC, rc.left + 2, rc.bottom, rc.Width() - 1, m_clrDarkShadow);
  961. Pixel(pDC, rc.left + 1, rc.bottom - 1, m_clrDarkShadow);
  962. if (bSelected)
  963. {
  964. VerticalLine(pDC, rc.right+1, rcClient.top, rcClient.Height(), clr);
  965. }
  966. }
  967. else if (IsBottom(dwStyle))
  968. {
  969. rc.InflateRect(0, 0, 0, 1);
  970. COLORREF clr = GradientFillTabFace(pDC, pTabCtrl, CRect(rc.left + 1, rc.top - (bSelected ? 1 : 0), rc.right, rc.bottom - 1), bSelected);
  971. VerticalLine(pDC, rc.left, rc.top, rc.Height() - 1, m_clrDarkShadow);
  972. Pixel(pDC, rc.left + 1, rc.top+rc.Height() - 1, m_clrDarkShadow);
  973. HorizontalLine(pDC, rc.left + 2, rc.bottom, rc.Width() - 3, m_clrDarkShadow);
  974. VerticalLine(pDC, rc.right, rc.top, rc.Height() - 1, m_clrDarkShadow);
  975. Pixel(pDC, rc.left + rc.Width() - 1, rc.top + rc.Height() - 1, m_clrDarkShadow);
  976. if (bSelected)
  977. {
  978. HorizontalLine(pDC, rcClient.left, rc.top-2, rcClient.Width(), clr);
  979. }
  980. }
  981. else
  982. {
  983. rc.InflateRect(0, 2, 0, 0);
  984. COLORREF clr = GradientFillTabFace(pDC, pTabCtrl, CRect(rc.left + 1, rc.top + 1, rc.right, rc.bottom + (bSelected ? 1 : 0)), bSelected);
  985. VerticalLine(pDC, rc.left, rc.top + 2, rc.Height() - 2, m_clrDarkShadow);
  986. Pixel(pDC, rc.left + 1, rc.top + 1, m_clrDarkShadow);
  987. HorizontalLine(pDC, rc.left + 2, rc.top, rc.Width() - 3, m_clrDarkShadow);
  988. VerticalLine(pDC, rc.right, rc.top + 2, rc.Height() - 2, m_clrDarkShadow);
  989. Pixel(pDC, rc.left + rc.Width() - 1, rc.top + 1, m_clrDarkShadow);
  990. if (bSelected)
  991. {
  992. HorizontalLine(pDC, rcClient.left, rc.bottom + 1, rcClient.Width(), clr);
  993. }
  994. }
  995. }
  996. void CXTTabBaseThemeOffice2003::DrawBorder(CDC* pDC, const CRect& rcChild)
  997. {
  998. pDC->Draw3dRect(&rcChild,
  999. GetMSO2003Color(XPCOLOR_SEPARATOR), GetMSO2003Color(XPCOLOR_SEPARATOR));
  1000. }
  1001. CXTPPaintManagerColor CXTTabBaseThemeOffice2003::GetBackColor() const
  1002. {
  1003. return XTPColorManager()->grcDockBar.clrDark;
  1004. }
  1005. COLORREF CXTTabBaseThemeOffice2003::FillButtons(CDC* pDC, CXTTabCtrlButtons* pButton)
  1006. {
  1007. CXTPClientRect rcClient(pButton);
  1008. COLORREF clrLight = m_clrHeaderFace.clrLight, clrDark = m_clrHeaderFace.clrDark;
  1009. DWORD dwStyle = GetTabStyle(pButton->GetTabCtrl());
  1010. BOOL bHoriz = !(dwStyle & TCS_VERTICAL);
  1011. if (IsRightOrBottom(dwStyle))  SwapColors(clrLight, clrDark);
  1012. XTPDrawHelpers()->GradientFill(pDC, rcClient, clrLight, clrDark, !bHoriz);
  1013. return 0;
  1014. }