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

对话框与窗口

开发平台:

Visual C++

  1. // XTPTabPaintManager.cpp: implementation of the CXTPTabPaintManager 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 "Common/XTPDrawHelpers.h"
  22. #include "Common/XTPColorManager.h"
  23. #include "Common/XTPOffice2007Image.h"
  24. #include "Common/XTPImageManager.h"
  25. #include "XTPTabPaintManager.h"
  26. #include "XTPTabManager.h"
  27. #include "XTPTabPaintManager.inl"
  28. #ifndef _countof
  29. #define _countof(array) (sizeof(array)/sizeof(array[0]))
  30. #endif
  31. #ifdef _DEBUG
  32. #undef THIS_FILE
  33. static char THIS_FILE[] = __FILE__;
  34. #define new DEBUG_NEW
  35. #endif
  36. //////////////////////////////////////////////////////////////////////////
  37. // CAppearanceSet
  38. CXTPTabPaintManager::CAppearanceSet::CAppearanceSet()
  39. {
  40. m_pPaintManager = NULL;
  41. m_rcHeaderMargin.SetRect(0, 0, 0, 0);
  42. m_nRowMargin = -2;
  43. m_bButtonsReverseZOrder = FALSE;
  44. }
  45. CXTPTabPaintManager::CAppearanceSet::~CAppearanceSet()
  46. {
  47. }
  48. void CXTPTabPaintManager::CAppearanceSet::RefreshMetrics()
  49. {
  50. CWindowDC dc (NULL);
  51. CXTPFontDC fnt(&dc, m_pPaintManager->GetFont());
  52. CSize szRect = dc.GetTextExtent(_T(" "), 1);
  53. m_nButtonHeight = max(18, szRect.cy + 3);
  54. }
  55. CRect CXTPTabPaintManager::CAppearanceSet::GetButtonDrawRect(const CXTPTabManagerItem* pItem)
  56. {
  57. CRect rc = pItem->GetRect();
  58. rc.InflateRect(2, 2);
  59. return rc;
  60. }
  61. int CXTPTabPaintManager::CAppearanceSet::GetButtonHeight(const CXTPTabManager* pTabManager)
  62. {
  63. CSize szButtonMin(0);
  64. int nMargin = m_pPaintManager->m_rcButtonMargin.top + m_pPaintManager->m_rcButtonMargin.bottom;
  65. if (pTabManager) pTabManager->GetItemMetrics(NULL, &szButtonMin, NULL);
  66. int nButtonHeight = max(m_nButtonHeight + nMargin, szButtonMin.cy);
  67. if (!m_pPaintManager->m_bShowIcons)
  68. return nButtonHeight;
  69. CSize szIcon(m_pPaintManager->m_szIcon);
  70. if (pTabManager) pTabManager->DrawIcon(NULL, 0, NULL, FALSE, szIcon);
  71. return max(max(szIcon.cx, szIcon.cy) + 4 + nMargin, nButtonHeight);
  72. }
  73. void CXTPTabPaintManager::CAppearanceSet::DrawPolyLine(CDC* pDC, COLORREF clr, LPPOINT pts, int nCount)
  74. {
  75. CXTPPenDC pen(*pDC, clr);
  76. pDC->MoveTo(pts[0].x, pts[0].y);
  77. CPoint pt(pts[0]);
  78. for (int i = 1; i < nCount; i++)
  79. {
  80. pt.Offset(pts[i]);
  81. pDC->LineTo(pt);
  82. }
  83. }
  84. void CXTPTabPaintManager::CAppearanceSet::InflateRectEx(CRect& rc, CRect rcInflate, XTPTabPosition position)
  85. {
  86. switch (position)
  87. {
  88. case xtpTabPositionTop: rc.top -= rcInflate.top; rc.left -= rcInflate.left; rc.bottom += rcInflate.bottom; rc.right += rcInflate.right; break;
  89. case xtpTabPositionLeft: rc.left -= rcInflate.top; rc.bottom += rcInflate.right; rc.right += rcInflate.bottom;  rc.top -= rcInflate.left; break;
  90. case xtpTabPositionBottom: rc.bottom += rcInflate.top; rc.right += rcInflate.right; rc.top -= rcInflate.bottom; rc.left -= rcInflate.left; break;
  91. case xtpTabPositionRight: rc.right += rcInflate.top; rc.top -= rcInflate.left; rc.left -= rcInflate.bottom; rc.bottom += rcInflate.right; break;
  92. }
  93. }
  94. void CXTPTabPaintManager::CAppearanceSet::DeflateRectEx(CRect& rc, CRect rcDeflate, XTPTabPosition position)
  95. {
  96. InflateRectEx(rc, CRect(-rcDeflate.left, -rcDeflate.top, -rcDeflate.right, -rcDeflate.bottom), position);
  97. }
  98. void CXTPTabPaintManager::CAppearanceSet::DrawSingleLineBorder(CDC* pDC, CRect rc, XTPTabPosition position, COLORREF clrTopLeft, COLORREF clrBottomRight)
  99. {
  100. switch (position)
  101. {
  102. case xtpTabPositionTop: HorizontalLine(pDC, rc.left, rc.top, rc.Width(), clrTopLeft); break;
  103. case xtpTabPositionLeft: VerticalLine(pDC, rc.left, rc.top, rc.Height(), clrTopLeft); break;
  104. case xtpTabPositionBottom: HorizontalLine(pDC, rc.left, rc.bottom - 1, rc.Width(), clrBottomRight); break;
  105. case xtpTabPositionRight: VerticalLine(pDC, rc.right - 1, rc.top, rc.Height(), clrBottomRight); break;
  106. }
  107. }
  108. COLORREF CXTPTabPaintManager::CAppearanceSet::FillButton(CDC* pDC, CXTPTabManagerItem* pItem, LPPOINT pts, int nCount, XTPTabPosition /*tabPosition*/, BOOL bAbsoulute)
  109. {
  110. LPPOINT lpPointRgn = new POINT[nCount];
  111. CPoint pt(0);
  112. for (int i = 0; i < nCount; i++)
  113. {
  114. if (!bAbsoulute)
  115. {
  116. pt.Offset(pts[i]);
  117. lpPointRgn[i] = pt;
  118. }
  119. else
  120. {
  121. lpPointRgn[i] = pts[i];
  122. }
  123. }
  124. CRect rcClip;
  125. pDC->GetClipBox(rcClip);
  126. CRgn rgnClip;
  127. rgnClip.CreateRectRgnIndirect(rcClip);
  128. CRgn rgn;
  129. rgn.CreatePolygonRgn(lpPointRgn, nCount, ALTERNATE);
  130. pDC->SelectClipRgn(&rgn, RGN_AND);
  131. CRect rcFill;
  132. rgn.GetRgnBox(rcFill);
  133. CBitmap bmp;
  134. bmp.CreateCompatibleBitmap(pDC, rcFill.Width(), rcFill.Height());
  135. CXTPCompatibleDC dcButton(pDC, &bmp);
  136. COLORREF clrFill = GetColorSet()->FillPropertyButton(&dcButton, CRect(0, 0, rcFill.Width(), rcFill.Height()), pItem);
  137. pDC->BitBlt(rcFill.left, rcFill.top, rcFill.Width(), rcFill.Height(), &dcButton, 0, 0, SRCCOPY);
  138. pDC->SelectClipRgn(&rgnClip);
  139. delete[] lpPointRgn;
  140. return clrFill;
  141. }
  142. int CXTPTabPaintManager::CAppearanceSet::GetButtonLength(CDC* pDC, CXTPTabManagerItem* pItem)
  143. {
  144. return m_pPaintManager->DrawSingleButtonIconAndText(pDC, pItem, CXTPEmptyRect(), FALSE);
  145. }
  146. int CXTPTabPaintManager::CAppearanceSet::GetHeaderHeight(CXTPTabManager* pTabManager)
  147. {
  148. if (!m_pPaintManager->m_bShowTabs)
  149. return 0;
  150. int nMargin = m_rcHeaderMargin.top + m_rcHeaderMargin.bottom;
  151. int nButtonHeight = GetButtonHeight(pTabManager) * pTabManager->GetRowCount() +
  152. m_nRowMargin * (pTabManager->GetRowCount() - 1);
  153. if (pTabManager->GetLayout() == xtpTabLayoutRotated)
  154. {
  155. for (int i = 0; i < pTabManager->GetItemCount(); i++)
  156. {
  157. CXTPTabManagerItem* pItem = pTabManager->GetItem(i);
  158. if (pItem->GetButtonLength() > nButtonHeight)
  159. nButtonHeight = pItem->GetButtonLength();
  160. }
  161. }
  162. return nButtonHeight + nMargin;
  163. }
  164. CRect CXTPTabPaintManager::CAppearanceSet::GetHeaderRect(CRect rcControl, CXTPTabManager* pTabManager)
  165. {
  166. CRect rcHeader(rcControl);
  167. int nHeight = GetHeaderHeight(pTabManager);
  168. switch (pTabManager->GetPosition())
  169. {
  170. case xtpTabPositionTop: rcHeader.bottom = rcControl.top + nHeight; break;
  171. case xtpTabPositionLeft: rcHeader.right = rcControl.left + nHeight; break;
  172. case xtpTabPositionBottom: rcHeader.top = rcControl.bottom - nHeight; break;
  173. case xtpTabPositionRight: rcHeader.left = rcControl.right - nHeight; break;
  174. }
  175. return rcHeader;
  176. }
  177. CRect CXTPTabPaintManager::CAppearanceSet::GetClientRect(CRect rcControl, CXTPTabManager* pTabManager)
  178. {
  179. if (!m_pPaintManager->m_bShowTabs)
  180. return rcControl;
  181. CRect rcClient(rcControl);
  182. CRect rcHeader = GetHeaderRect(rcControl, pTabManager);
  183. switch (pTabManager->GetPosition())
  184. {
  185. case xtpTabPositionTop: rcClient.top = rcHeader.bottom - 1; break;
  186. case xtpTabPositionLeft: rcClient.left = rcHeader.right - 1; break;
  187. case xtpTabPositionBottom: rcClient.bottom = rcHeader.top + 1; break;
  188. case xtpTabPositionRight: rcClient.right = rcHeader.left + 1; break;
  189. }
  190. return rcClient;
  191. }
  192. CRect CXTPTabPaintManager::CAppearanceSet::GetClientMargin()
  193. {
  194. return m_pPaintManager->m_rcClientMargin;
  195. }
  196. void CXTPTabPaintManager::CAppearanceSet::AdjustClientRect(CXTPTabManager* pTabManager, CRect& rcClient)
  197. {
  198. DeflateRectEx(rcClient, m_pPaintManager->m_rcControlMargin, pTabManager->GetPosition());
  199. rcClient = GetClientRect(rcClient, pTabManager);
  200. DeflateRectEx(rcClient, GetClientMargin(), pTabManager->GetPosition());
  201. if (m_pPaintManager->m_clientFrame == xtpTabFrameBorder)
  202. {
  203. DeflateRectEx(rcClient, CRect(2, 2, 2, 2), pTabManager->GetPosition());
  204. }
  205. if (m_pPaintManager->m_clientFrame == xtpTabFrameSingleLine)
  206. {
  207. DeflateRectEx(rcClient, CRect(0, 2, 0, 0), pTabManager->GetPosition());
  208. }
  209. }
  210. void CXTPTabPaintManager::CAppearanceSet::DrawWorkspacePart(CDC* pDC, LPRECT lpRect, XTPTabWorkspacePart workspacePart)
  211. {
  212. if (!m_pPaintManager->m_bStaticFrame)
  213. {
  214. switch (workspacePart)
  215. {
  216. case xtpTabWorkspacePartBorder:
  217. break;
  218. case xtpTabWorkspacePartWidth:
  219. lpRect->top -= 2;
  220. lpRect->left -= 2;
  221. lpRect->right += 2;
  222. lpRect->bottom += 2;
  223. break;
  224. case xtpTabWorkspacePartVSplitter:
  225. pDC->FillSolidRect(lpRect, GetColorSet()->m_clrHeaderFace.clrLight);
  226. break;
  227. case xtpTabWorkspacePartHSplitter:
  228. pDC->FillSolidRect(lpRect, GetColorSet()->m_clrHeaderFace.clrLight);
  229. break;
  230. }
  231. }
  232. else
  233. {
  234. switch (workspacePart)
  235. {
  236. case xtpTabWorkspacePartBorder:
  237. pDC->Draw3dRect(1, 0, lpRect->right - lpRect->left - 2, lpRect->bottom - lpRect->top - 1, GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_3DFACE));
  238. pDC->Draw3dRect(0, 0, lpRect->right - lpRect->left, lpRect->bottom - lpRect->top, GetColorSet()->m_clrFrameBorder, GetColorSet()->m_clrFrameBorder);
  239. break;
  240. case xtpTabWorkspacePartWidth:
  241. lpRect->top -= 1;
  242. break;
  243. case xtpTabWorkspacePartVSplitter:
  244. pDC->FillSolidRect(lpRect, GetColorSet()->m_clrControlFace);
  245. pDC->FillSolidRect(lpRect->right - 1, lpRect->top, 1, lpRect->bottom - lpRect->top, GetColorSet()->m_clrFrameBorder);
  246. break;
  247. case xtpTabWorkspacePartHSplitter:
  248. pDC->FillSolidRect(lpRect, GetColorSet()->m_clrControlFace);
  249. pDC->FillSolidRect(lpRect->left, lpRect->bottom - 1, lpRect->right - lpRect->left, 1, GetColorSet()->m_clrFrameBorder);
  250. break;
  251. }
  252. }
  253. }
  254. //////////////////////////////////////////////////////////////////////////
  255. // CAppearanceSetVisualStudio
  256. void CXTPTabPaintManager::CAppearanceSetVisualStudio::DrawSingleButton(CDC* pDC, CXTPTabManagerItem* pItem)
  257. {
  258. CRect rcItem = pItem->GetRect();
  259. if (!pItem->IsSelected())
  260. {
  261. if (!IsHorizontalTabPosition(pItem->GetTabManager()->GetPosition()))
  262. {
  263. HorizontalLine(pDC, rcItem.left + 2, rcItem.bottom, rcItem.Width() - 4, GetColorSet()->m_clrFrameBorder);
  264. }
  265. else
  266. {
  267. VerticalLine(pDC, rcItem.right, rcItem.top + 2, rcItem.Height() - 4, GetColorSet()->m_clrFrameBorder);
  268. }
  269. }
  270. else
  271. {
  272. GetColorSet()->FillPropertyButton(pDC, rcItem, pItem);
  273. InflateRectEx(rcItem, CRect(0, 0, 0, 1), pItem->GetTabManager()->GetPosition());
  274. pDC->Draw3dRect(rcItem, GetColorSet()->m_clrBorderHighlight, GetColorSet()->m_clrSelectedText);
  275. }
  276. m_pPaintManager->DrawSingleButtonIconAndText(pDC, pItem, pItem->GetRect(), TRUE);
  277. }
  278. CRect CXTPTabPaintManager::CAppearanceSetVisualStudio::FillTabControl(CXTPTabManager* pTabManager, CDC* pDC, CRect rcControl)
  279. {
  280. CRect rcHeader = GetHeaderRect(rcControl, pTabManager);
  281. GetColorSet()->FillHeader(pDC, rcHeader, pTabManager);
  282. CRect rcClient = GetClientRect(rcControl, pTabManager);
  283. if (m_pPaintManager->m_clientFrame == xtpTabFrameBorder)
  284. {
  285. GetColorSet()->FillClient(pDC, rcClient, pTabManager);
  286. pDC->Draw3dRect(rcClient, GetColorSet()->m_clrBorderHighlight, GetColorSet()->m_clrSelectedText);
  287. }
  288. if (m_pPaintManager->m_clientFrame == xtpTabFrameSingleLine)
  289. {
  290. DrawSingleLineBorder(pDC, rcClient, pTabManager->GetPosition(), GetColorSet()->m_clrBorderHighlight, GetColorSet()->m_clrSelectedText);
  291. }
  292. return rcHeader;
  293. }
  294. //////////////////////////////////////////////////////////////////////////
  295. // CAppearanceSetPropertyPage
  296. void CXTPTabPaintManager::CAppearanceSetPropertyPage::RefreshMetrics()
  297. {
  298. CAppearanceSet::RefreshMetrics();
  299. }
  300. CRect CXTPTabPaintManager::CAppearanceSetPropertyPage::GetButtonDrawRect(const CXTPTabManagerItem* pItem)
  301. {
  302. CRect rc = pItem->GetRect();
  303. rc.InflateRect(2, 2);
  304. return rc;
  305. }
  306. CRect CXTPTabPaintManager::CAppearanceSetPropertyPage::FillTabControl(CXTPTabManager* pTabManager, CDC* pDC, CRect rcControl)
  307. {
  308. CRect rcHeader = GetHeaderRect(rcControl, pTabManager);
  309. InflateRectEx(rcHeader, CRect(0, 0, 0, 1), pTabManager->GetPosition());
  310. GetColorSet()->FillHeader(pDC, rcHeader, pTabManager);
  311. CRect rcClient = GetClientRect(rcControl, pTabManager);
  312. if (m_pPaintManager->m_clientFrame == xtpTabFrameBorder)
  313. {
  314. GetColorSet()->FillClient(pDC, rcClient, pTabManager);
  315. Draw3dRect(pDC, rcClient, GetColorSet()->m_csPropertyPage.clrHighlight, GetColorSet()->m_csPropertyPage.clrDarkShadow);
  316. HorizontalLine(pDC, rcClient.left + 1, rcClient.bottom - 2, rcClient.Width() - 2, GetColorSet()->m_csPropertyPage.clrShadow);
  317. VerticalLine(pDC, rcClient.right - 2, rcClient.top + 1, rcClient.Height() - 2, GetColorSet()->m_csPropertyPage.clrShadow);
  318. }
  319. if (m_pPaintManager->m_clientFrame == xtpTabFrameSingleLine)
  320. {
  321. switch (pTabManager->GetPosition())
  322. {
  323. case xtpTabPositionTop: HorizontalLine(pDC, rcClient.left, rcClient.top, rcClient.Width(), GetColorSet()->m_csPropertyPage.clrHighlight); break;
  324. case xtpTabPositionLeft: VerticalLine(pDC, rcClient.left, rcClient.top, rcClient.Height(), GetColorSet()->m_csPropertyPage.clrHighlight); break;
  325. case xtpTabPositionBottom:
  326. HorizontalLine(pDC, rcClient.left, rcClient.bottom - 1, rcClient.Width(), GetColorSet()->m_csPropertyPage.clrDarkShadow);
  327. HorizontalLine(pDC, rcClient.left, rcClient.bottom - 2, rcClient.Width(), GetColorSet()->m_csPropertyPage.clrShadow);
  328. break;
  329. case xtpTabPositionRight:
  330. VerticalLine(pDC, rcClient.right - 1, rcClient.top, rcClient.Height(), GetColorSet()->m_csPropertyPage.clrDarkShadow);
  331. VerticalLine(pDC, rcClient.right - 2, rcClient.top, rcClient.Height(), GetColorSet()->m_csPropertyPage.clrShadow);
  332. break;
  333. }
  334. }
  335. return rcHeader;
  336. }
  337. CRect CXTPTabPaintManager::CAppearanceSetPropertyPage::GetClientMargin()
  338. {
  339. CRect rc = m_pPaintManager->m_rcClientMargin;
  340. if (m_pPaintManager->GetColorSet()->IsAppThemed() && m_pPaintManager->m_clientFrame == xtpTabFrameBorder)
  341. {
  342. if (m_pPaintManager->GetPosition() == xtpTabPositionTop ||
  343. m_pPaintManager->GetPosition() == xtpTabPositionLeft)
  344. {
  345. rc.bottom += 2;
  346. }
  347. rc.right += 2;
  348. }
  349. return rc;
  350. }
  351. void CXTPTabPaintManager::CAppearanceSetPropertyPage::DrawSingleButton(CDC* pDC, CXTPTabManagerItem* pItem)
  352. {
  353. CRect rc = pItem->GetRect();
  354. COLORREF clrShadow = GetColorSet()->m_csPropertyPage.clrShadow, clrHighlight = GetColorSet()->m_csPropertyPage.clrHighlight, clrDarkShadow = GetColorSet()->m_csPropertyPage.clrDarkShadow;
  355. switch (pItem->GetTabManager()->GetPosition())
  356. {
  357. case xtpTabPositionTop:
  358. {
  359. if (pItem->IsSelected())
  360. rc.InflateRect(2, 2, 2, 0);
  361. COLORREF clr = GetColorSet()->FillPropertyButton(pDC, CRect(rc.left + 1, rc.top + 1, rc.right - 1, rc.bottom - 1), pItem);
  362. VerticalLine(pDC, rc.left, rc.top + 2, rc.Height() - 2, clrHighlight);
  363. Pixel(pDC, rc.left + 1, rc.top + 1, clrHighlight);
  364. HorizontalLine(pDC, rc.left + 2, rc.top, rc.Width() - 4, clrHighlight);
  365. Pixel(pDC, rc.right - 2 , rc.top + 1, clrDarkShadow);
  366. VerticalLine(pDC, rc.right - 1, rc.top + 2, rc.Height() - 3, clrDarkShadow);
  367. VerticalLine(pDC, rc.right - 2, rc.top + 2, rc.Height() - 3, clrShadow);
  368. if (pItem->IsSelected() && pItem->GetItemRow() == 0)
  369. HorizontalLine(pDC, rc.left + 1, rc.bottom - 1, rc.Width() - 3, clr);
  370. }
  371. break;
  372. case xtpTabPositionLeft:
  373. {
  374. if (pItem->IsSelected())
  375. rc.InflateRect(2, 2, 0, 2);
  376. COLORREF clr = GetColorSet()->FillPropertyButton(pDC, CRect(rc.left + 1, rc.top + 1, rc.right - 1, rc.bottom - 1), pItem);
  377. HorizontalLine(pDC, rc.left + 2, rc.top, rc.Width() - 2, clrHighlight);
  378. Pixel(pDC, rc.left + 1, rc.top + 1, clrHighlight);
  379. VerticalLine(pDC, rc.left, rc.top + 2, rc.Height() - 4, clrHighlight);
  380. HorizontalLine(pDC, rc.left + 1, rc.bottom - 2, rc.Width() - 2, clrShadow);
  381. HorizontalLine(pDC, rc.left + 2, rc.bottom - 1, rc.Width() - 3, clrDarkShadow);
  382. Pixel(pDC, rc.left + 2, rc.bottom - 2, clrDarkShadow);
  383. Pixel(pDC, rc.left + 2, rc.bottom - 1, clrShadow);
  384. if (pItem->IsSelected() && pItem->GetItemRow() == 0)
  385. VerticalLine(pDC, rc.right - 1, rc.top + 1, rc.Height() - 3, clr);
  386. }
  387. break;
  388. case xtpTabPositionBottom:
  389. {
  390. if (pItem->IsSelected())
  391. rc.InflateRect(2, 2);
  392. COLORREF clr = GetColorSet()->FillPropertyButton(pDC, CRect(rc.left + 1, rc.top + 1, rc.right - 1, rc.bottom - 1), pItem);
  393. VerticalLine(pDC, rc.left, rc.top + 1, rc.Height() - 2, clrHighlight);
  394. Pixel(pDC, rc.left + 1, rc.bottom - 1, clrHighlight);
  395. HorizontalLine(pDC, rc.left + 2, rc.bottom -1, rc.Width() - 4, clrShadow);
  396. HorizontalLine(pDC, rc.left + 2, rc.bottom, rc.Width() - 4, clrDarkShadow);
  397. Pixel(pDC, rc.right - 2, rc.bottom - 1, clrDarkShadow);
  398. VerticalLine(pDC, rc.right - 1, rc.top, rc.Height() - 1, clrDarkShadow);
  399. VerticalLine(pDC, rc.right - 2, rc.top, rc.Height() - 1, clrShadow);
  400. if (pItem->IsSelected() && pItem->GetItemRow() == 0)
  401. {
  402. HorizontalLine(pDC, rc.left + 1, rc.top + 1, rc.Width() - 1, clr);
  403. rc.bottom += 2;
  404. }
  405. }
  406. break;
  407. case xtpTabPositionRight:
  408. {
  409. if (pItem->IsSelected())
  410. rc.InflateRect(2, 2);
  411. COLORREF clr = GetColorSet()->FillPropertyButton(pDC, CRect(rc.left + 1, rc.top + 1, rc.right - 1, rc.bottom - 1), pItem);
  412. HorizontalLine(pDC, rc.left + 1, rc.top, rc.Width() - 2, clrHighlight);
  413. Pixel(pDC, rc.right - 1, rc.top + 1, clrHighlight);
  414. VerticalLine(pDC, rc.right - 1, rc.top + 2, rc.Height() - 4, clrShadow);
  415. VerticalLine(pDC, rc.right - 0, rc.top + 2, rc.Height() - 4, clrDarkShadow);
  416. Pixel(pDC, rc.right - 1, rc.bottom - 2, clrDarkShadow);
  417. HorizontalLine(pDC, rc.left + 1, rc.bottom - 2, rc.Width() - 2, clrShadow);
  418. HorizontalLine(pDC, rc.left + 1, rc.bottom - 1, rc.Width() - 2, clrDarkShadow);
  419. if (pItem->IsSelected() && pItem->GetItemRow() == 0)
  420. {
  421. VerticalLine(pDC, rc.left + 1, rc.top + 1, rc.Height() - 1, clr);
  422. rc.right += 2;
  423. }
  424. }
  425. break;
  426. }
  427. m_pPaintManager->DrawSingleButtonIconAndText(pDC, pItem, rc, TRUE);
  428. }
  429. //////////////////////////////////////////////////////////////////////////
  430. //
  431. void CXTPTabPaintManager::CAppearanceSetPropertyPageSelected::DrawSingleButton(CDC* pDC, CXTPTabManagerItem* pItem)
  432. {
  433. if (pItem->IsSelected() || pItem->IsHighlighted())
  434. {
  435. CAppearanceSetPropertyPage::DrawSingleButton(pDC, pItem);
  436. }
  437. else
  438. {
  439. m_pPaintManager->DrawSingleButtonIconAndText(pDC, pItem, pItem->GetRect(), TRUE);
  440. }
  441. }
  442. //////////////////////////////////////////////////////////////////////////
  443. // CAppearanceSetStateButtons
  444. CRect CXTPTabPaintManager::CAppearanceSetStateButtons::FillTabControl(CXTPTabManager* pTabManager, CDC* /*pDC*/, CRect rcControl)
  445. {
  446. return GetHeaderRect(rcControl, pTabManager);
  447. }
  448. void CXTPTabPaintManager::CAppearanceSetStateButtons::DrawSingleButton(CDC* pDC, CXTPTabManagerItem* pItem)
  449. {
  450. CRect rcItem = pItem->GetRect();
  451. GetColorSet()->FillStateButton(pDC, rcItem, pItem);
  452. m_pPaintManager->DrawSingleButtonIconAndText(pDC, pItem, pItem->GetRect(), TRUE);
  453. }
  454. //////////////////////////////////////////////////////////////////////////
  455. // CAppearanceSetPropertyPage2003
  456. void CXTPTabPaintManager::CAppearanceSetPropertyPage2003::RefreshMetrics()
  457. {
  458. CAppearanceSet::RefreshMetrics();
  459. }
  460. CRect CXTPTabPaintManager::CAppearanceSetPropertyPage2003::GetButtonDrawRect(const CXTPTabManagerItem* pItem)
  461. {
  462. CRect rc = pItem->GetRect();
  463. return pItem->GetTabManager()->IsHorizontalPosition() ?
  464. CRect(rc.left - rc.Height(), rc.top, rc.right + 2, rc.bottom) :
  465. CRect(rc.left, rc.top - rc.Width(), rc.right, rc.bottom + 2);
  466. }
  467. CRect CXTPTabPaintManager::CAppearanceSetPropertyPage2003::FillTabControl(CXTPTabManager* pTabManager, CDC* pDC, CRect rcControl)
  468. {
  469. CRect rcHeader = GetHeaderRect(rcControl, pTabManager);
  470. GetColorSet()->FillHeader(pDC, rcHeader, pTabManager);
  471. CRect rcClient = GetClientRect(rcControl, pTabManager);
  472. if (m_pPaintManager->m_clientFrame == xtpTabFrameBorder)
  473. {
  474. GetColorSet()->FillClient(pDC, rcClient, pTabManager);
  475. pDC->Draw3dRect(rcClient, GetColorSet()->m_csPropertyPage2003.clrFrameBorder, GetColorSet()->m_csPropertyPage2003.clrFrameBorder);
  476. }
  477. if (m_pPaintManager->m_clientFrame == xtpTabFrameSingleLine)
  478. {
  479. DrawSingleLineBorder(pDC, rcClient, pTabManager->GetPosition(), GetColorSet()->m_csPropertyPage2003.clrFrameBorder, GetColorSet()->m_csPropertyPage2003.clrFrameBorder);
  480. }
  481. return rcHeader;
  482. }
  483. void CXTPTabPaintManager::CAppearanceSetPropertyPage2003::DrawSingleButton(CDC* pDC, CXTPTabManagerItem* pItem)
  484. {
  485. CRect rc = pItem->GetRect();
  486. COLORREF clrBorder = GetColorSet()->m_csPropertyPage2003.clrDarkShadow, clrLeftHighlight = GetColorSet()->m_csPropertyPage2003.clrBorderLeftHighlight, clrTopHighlight = GetColorSet()->m_csPropertyPage2003.clrBorderTopHighlight;
  487. if (pItem->IsSelected())
  488. {
  489. clrBorder = GetColorSet()->m_csPropertyPage2003.clrFrameBorder;
  490. clrLeftHighlight = RGB(255, 255, 255);
  491. clrTopHighlight = RGB(255, 255, 255);
  492. }
  493. if (pItem->IsHighlighted() && m_bDoubleHighlightedBorder)
  494. {
  495. clrLeftHighlight = clrTopHighlight = clrBorder = GetColorSet()->m_csStateButton.clrBorder.clrDark;
  496. }
  497. switch (pItem->GetTabManager()->GetPosition())
  498. {
  499. case xtpTabPositionTop:
  500. {
  501. rc.bottom--;
  502. POINT ptsFill[] = {{rc.right - 1, rc.bottom}, {0, 2 - rc.Height()}, {5 - rc.Width(), 0}, {3 - rc.Height(), rc.Height() - 3}};
  503. COLORREF clrDark = FillButton(pDC, pItem, ptsFill, sizeof(ptsFill) / sizeof(ptsFill[0]), pItem->GetTabManager()->GetPosition());
  504. POINT ptsBorder[] = {{rc.right, rc.bottom - 1}, {+0, 3 - rc.Height()}, {-2, -2}, {9 - rc.Width(), 0}, {-5, 2}, {3 - rc.Height(), rc.Height() - 3}, {-2, 0}};
  505. DrawPolyLine(pDC, clrBorder, ptsBorder, sizeof(ptsBorder) / sizeof(ptsBorder[0]));
  506. POINT ptsLeftHighlight[] = {{rc.right - 1, rc.bottom - 1}, {+0, 3 - rc.Height()}, {-2, -2}};
  507. DrawPolyLine(pDC, clrLeftHighlight, ptsLeftHighlight, sizeof(ptsLeftHighlight) / sizeof(ptsLeftHighlight[0]));
  508. POINT ptsTopHighlight[] = {{rc.right - 3, rc.top + 1}, {9 - rc.Width(), 0}, {-5, +3}, {4 - rc.Height(), rc.Height() - 4}};
  509. DrawPolyLine(pDC, clrTopHighlight, ptsTopHighlight, sizeof(ptsTopHighlight) / sizeof(ptsTopHighlight[0]));
  510. if (pItem->IsSelected())
  511. HorizontalLine(pDC, rc.left - rc.Height() + 4, rc.bottom, rc.Width() + rc.Height() - 3, clrDark);
  512. }
  513. break;
  514. case xtpTabPositionLeft:
  515. {
  516. rc.right--;
  517. POINT ptsFill[] = {{rc.right, rc.bottom - 1}, {2 - rc.Width(), 0}, {0, 5 - rc.Height()}, {rc.Width() - 2, 2 - rc.Width()}};
  518. COLORREF clrDark = FillButton(pDC, pItem, ptsFill, sizeof(ptsFill) / sizeof(ptsFill[0]), pItem->GetTabManager()->GetPosition());
  519. POINT ptsBorder[] = {{rc.right - 1, rc.bottom}, {3 - rc.Width(), 0}, {-2, -2}, {0, 9 - rc.Height()}, {2, -5}, {rc.Width() - 3, 3 - rc.Width()}, {0, -2}};
  520. DrawPolyLine(pDC, clrBorder, ptsBorder, sizeof(ptsBorder) / sizeof(ptsBorder[0]));
  521. POINT ptsLeftHighlight[] = {{rc.right - 1, rc.bottom - 1}, {3 - rc.Width(), 0}, {-2, -2}};
  522. DrawPolyLine(pDC, clrLeftHighlight, ptsLeftHighlight, sizeof(ptsLeftHighlight) / sizeof(ptsLeftHighlight[0]));
  523. POINT ptsTopHighlight[] = {{rc.left + 1, rc.bottom - 3}, {0, 9 - rc.Height()}, {+3, -5}, {rc.Width() - 4, 4 - rc.Width()}};
  524. DrawPolyLine(pDC, clrTopHighlight, ptsTopHighlight, sizeof(ptsTopHighlight) / sizeof(ptsTopHighlight[0]));
  525. if (pItem->IsSelected())
  526. VerticalLine(pDC, rc.right, rc.top - rc.Width() + 4, rc.Width() + rc.Height() - 3, clrDark);
  527. }
  528. break;
  529. case xtpTabPositionBottom:
  530. {
  531. POINT ptsFill[] = {{rc.right - 1, rc.top}, {0, rc.Height() - 1}, {5 - rc.Width(), 0}, {3 - rc.Height(), 2 - rc.Height()}};
  532. COLORREF clrDark = FillButton(pDC, pItem, ptsFill, sizeof(ptsFill) / sizeof(ptsFill[0]), pItem->GetTabManager()->GetPosition());
  533. POINT ptsBorder[] = {{rc.right, rc.top + 1}, {+0, rc.Height() - 3}, {-2, 2}, {9 - rc.Width(), 0}, {-5, -2}, {3 - rc.Height(), 3 - rc.Height()}, {-2, 0}};
  534. DrawPolyLine(pDC, clrBorder, ptsBorder, sizeof(ptsBorder) / sizeof(ptsBorder[0]));
  535. POINT ptsLeftHighlight[] = {{rc.right - 1, rc.top + 1}, {+0, rc.Height() - 3}, {-2, 2}};
  536. DrawPolyLine(pDC, clrLeftHighlight, ptsLeftHighlight, sizeof(ptsLeftHighlight) / sizeof(ptsLeftHighlight[0]));
  537. POINT ptsTopHighlight[] = {{rc.right - 3, rc.bottom - 1}, {9 - rc.Width(), 0}, {-5, -3}, {4 - rc.Height(), 4 - rc.Height()}};
  538. DrawPolyLine(pDC, clrTopHighlight, ptsTopHighlight, sizeof(ptsTopHighlight) / sizeof(ptsTopHighlight[0]));
  539. if (pItem->IsSelected())
  540. HorizontalLine(pDC, rc.left - rc.Height() + 4, rc.top, rc.Width() + rc.Height() - 3, clrDark);
  541. }
  542. break;
  543. case xtpTabPositionRight:
  544. {
  545. POINT ptsFill[] = {{rc.left + 1, rc.bottom - 1}, {rc.Width() - 2, 0}, {0, 5 - rc.Height()}, {2 - rc.Width(), 2 - rc.Width()}};
  546. //POINT ptsFill[] = {{rc.left, rc.bottom - 1}, {rc.Width() - 1, 0}, {0, 5 - rc.Height()}, {2 - rc.Width(), 2 - rc.Width()}};
  547. COLORREF clrDark = FillButton(pDC, pItem, ptsFill, sizeof(ptsFill) / sizeof(ptsFill[0]), pItem->GetTabManager()->GetPosition());
  548. POINT ptsBorder[] = {{rc.left + 1, rc.bottom}, {rc.Width() -3, 0}, {2, -2}, {0, 9 - rc.Height()}, {-2, -5}, {3 - rc.Width(), 3 - rc.Width()}, {0, -2}};
  549. DrawPolyLine(pDC, clrBorder, ptsBorder, sizeof(ptsBorder) / sizeof(ptsBorder[0]));
  550. POINT ptsLeftHighlight[] = {{rc.left + 1, rc.bottom - 1}, {rc.Width() - 3, 0}, {2, -2}};
  551. DrawPolyLine(pDC, clrLeftHighlight, ptsLeftHighlight, sizeof(ptsLeftHighlight) / sizeof(ptsLeftHighlight[0]));
  552. POINT ptsTopHighlight[] = {{rc.right - 1, rc.bottom - 3}, {0, 9 - rc.Height()}, {-3, -5}, {4 - rc.Width(), 4 - rc.Width()}};
  553. DrawPolyLine(pDC, clrTopHighlight, ptsTopHighlight, sizeof(ptsTopHighlight) / sizeof(ptsTopHighlight[0]));
  554. if (pItem->IsSelected())
  555. VerticalLine(pDC, rc.left, rc.top - rc.Width() + 4, rc.Width() + rc.Height() - 3, clrDark);
  556. }
  557. break;
  558. }
  559. m_pPaintManager->DrawSingleButtonIconAndText(pDC, pItem, pItem->GetRect(), TRUE);
  560. }
  561. //////////////////////////////////////////////////////////////////////////
  562. // CAppearanceSetPropertyPage2007
  563. void CXTPTabPaintManager::CAppearanceSetPropertyPage2007::RefreshMetrics()
  564. {
  565. CAppearanceSet::RefreshMetrics();
  566. }
  567. CRect CXTPTabPaintManager::CAppearanceSetPropertyPage2007::FillTabControl(CXTPTabManager* pTabManager, CDC* pDC, CRect rcControl)
  568. {
  569. if (!XTPOffice2007Images()->IsValid())
  570. return CAppearanceSet::FillTabControl(pTabManager, pDC, rcControl);
  571. CRect rcHeader = GetHeaderRect(rcControl, pTabManager);
  572. pDC->FillSolidRect(rcHeader, GetColorSet()->m_clrHeaderFace.clrLight);
  573. CRect rcClient = GetClientRect(rcControl, pTabManager);
  574. if (m_pPaintManager->m_clientFrame == xtpTabFrameBorder)
  575. {
  576. CXTPOffice2007Image* pImage = XTPOffice2007Images()->LoadFile(_T("RIBBONGROUPS"));
  577. if (pImage) pImage->DrawImage(pDC, rcClient, pImage->GetSource(0, 1), CRect(8, 8, 8, 8));
  578. }
  579. if (m_pPaintManager->m_clientFrame == xtpTabFrameSingleLine)
  580. {
  581. DrawSingleLineBorder(pDC, rcClient, pTabManager->GetPosition(),
  582. GetColorSet()->m_csPropertyPage.clrShadow, GetColorSet()->m_csPropertyPage.clrShadow);
  583. }
  584. return rcHeader;
  585. }
  586. void CXTPTabPaintManager::CAppearanceSetPropertyPage2007::DrawButtonBackground(CDC* pDC, CXTPTabManagerItem* pItem, CRect rc)
  587. {
  588. CXTPOffice2007Image* pImage = XTPOffice2007Images()->LoadFile(_T("RIBBONTAB"));
  589. int nState = 0;
  590. if (pItem->IsSelected() && pItem->IsFocused())
  591. {
  592. nState = 5;
  593. }
  594. else if (pItem->IsSelected() && pItem->IsHighlighted())
  595. {
  596. nState = 4;
  597. }
  598. else if (pItem->IsSelected())
  599. {
  600. nState = 3;
  601. }
  602. else if (pItem->IsPressed())
  603. {
  604. nState = 2;
  605. }
  606. else if (pItem->IsHighlighted())
  607. {
  608. nState = 1;
  609. }
  610. if (pImage) pImage->DrawImage(pDC, rc, pImage->GetSource(nState, 6), CRect(5, 5, 5, 5), 0xFF00FF);
  611. }
  612. void CXTPTabPaintManager::CAppearanceSetPropertyPage2007::DrawRotatedButton(CDC* pDC, CRect rcItem, CXTPTabManagerItem* pItem, BOOL bSwap, LPFNDRAWROTATEDBITS pfnRotatedProcBack, LPFNDRAWROTATEDBITS pfnRotatedProc)
  613. {
  614. const int cx = rcItem.Width();
  615. const int cy = rcItem.Height();
  616. UINT* pSrcBits = NULL;
  617. HBITMAP hbmSrc = CXTPImageManager::Create32BPPDIBSection(NULL, bSwap ? cy : cx, bSwap ? cx : cy, (LPBYTE*)&pSrcBits);
  618. if (!pSrcBits)
  619. return;
  620. UINT* pDestBits = NULL;
  621. HBITMAP hbmDest = CXTPImageManager::Create32BPPDIBSection(NULL, cx, cy, (LPBYTE*)&pDestBits);
  622. if (!pDestBits)
  623. return;
  624. CRect rcDraw(0, 0, bSwap ? cy: cx, bSwap ? cx : cy);
  625. CDC dc;
  626. dc.CreateCompatibleDC(NULL);
  627. HGDIOBJ hbmpOld = 0;
  628. if (pfnRotatedProcBack != NULL)
  629. {
  630. hbmpOld = ::SelectObject(dc, hbmDest);
  631. dc.BitBlt(0, 0, cx, cy, pDC, rcItem.left, rcItem.top, SRCCOPY);
  632. (*pfnRotatedProcBack)(rcDraw.Width(), rcDraw.Height(), pDestBits, pSrcBits);
  633. ::SelectObject(dc, hbmpOld);
  634. hbmpOld = ::SelectObject(dc, hbmSrc);
  635. }
  636. else
  637. {
  638. hbmpOld = ::SelectObject(dc, hbmSrc);
  639. dc.FillSolidRect(rcDraw, GetColorSet()->m_clrHeaderFace.clrLight);
  640. }
  641. DrawButtonBackground(&dc, pItem, rcDraw);
  642. (*pfnRotatedProc)(cx, cy, pSrcBits, pDestBits);
  643. pDC->DrawState(rcItem.TopLeft(), rcItem.Size(), hbmDest, DST_BITMAP);
  644. ::SelectObject(dc, hbmpOld);
  645. DeleteObject(hbmSrc);
  646. DeleteObject(hbmDest);
  647. }
  648. void CXTPTabPaintManager::CAppearanceSetPropertyPage2007::DrawSingleButton(CDC* pDC, CXTPTabManagerItem* pItem)
  649. {
  650. if (!XTPOffice2007Images()->IsValid())
  651. {
  652. CAppearanceSet::DrawSingleButton(pDC, pItem);
  653. return;
  654. }
  655. CRect rc = pItem->GetRect();
  656. if (pItem->IsSelected() || pItem->IsHighlighted())
  657. {
  658. switch (pItem->GetTabManager()->GetPosition())
  659. {
  660. case xtpTabPositionTop:
  661. DrawButtonBackground(pDC, pItem, rc);
  662. break;
  663. case xtpTabPositionBottom:
  664. DrawRotatedButton(pDC, rc, pItem, FALSE, NULL, &CColorSetWinXP::DrawRotatedBitsBottom);
  665. break;
  666. case xtpTabPositionLeft:
  667. DrawRotatedButton(pDC, rc, pItem, TRUE, NULL, &CColorSetWinXP::DrawRotatedBitsLeft);
  668. break;
  669. case xtpTabPositionRight:
  670. DrawRotatedButton(pDC, rc, pItem, TRUE, NULL, &CColorSetWinXP::DrawRotatedBitsRight);
  671. break;
  672. }
  673. }
  674. m_pPaintManager->DrawSingleButtonIconAndText(pDC, pItem, rc, TRUE);
  675. }
  676. //////////////////////////////////////////////////////////////////////////
  677. // CAppearanceSetPropertyPage2007
  678. void CXTPTabPaintManager::CAppearanceSetPropertyPageAccess2007::RefreshMetrics()
  679. {
  680. CAppearanceSetPropertyPage2007::RefreshMetrics();
  681. m_nButtonHeight = max(m_nButtonHeight, 24);
  682. }
  683. CRect CXTPTabPaintManager::CAppearanceSetPropertyPageAccess2007::GetButtonDrawRect(const CXTPTabManagerItem* pItem)
  684. {
  685. CRect rc = pItem->GetRect();
  686. return pItem->GetTabManager()->IsHorizontalPosition() ?
  687. CRect(rc.left, rc.top, rc.right + m_nButtonHeight / 2, rc.bottom) :
  688. CRect(rc.left, rc.top, rc.right, rc.bottom + m_nButtonHeight / 2);
  689. }
  690. CRect CXTPTabPaintManager::CAppearanceSetPropertyPageAccess2007::FillTabControl(CXTPTabManager* pTabManager, CDC* pDC, CRect rcControl)
  691. {
  692. CRect rcHeader = GetHeaderRect(rcControl, pTabManager);
  693. pDC->FillSolidRect(rcHeader, GetColorSet()->m_clrHeaderFace.clrLight);
  694. CRect rcClient = GetClientRect(rcControl, pTabManager);
  695. if (m_pPaintManager->m_clientFrame == xtpTabFrameBorder)
  696. {
  697. GetColorSet()->FillClient(pDC, rcClient, pTabManager);
  698. pDC->Draw3dRect(rcClient, GetColorSet()->m_clrFrameBorder, GetColorSet()->m_clrFrameBorder);
  699. }
  700. if (m_pPaintManager->m_clientFrame == xtpTabFrameSingleLine)
  701. {
  702. GetColorSet()->FillClient(pDC, rcClient, pTabManager);
  703. DrawSingleLineBorder(pDC, rcClient, pTabManager->GetPosition(), GetColorSet()->m_clrFrameBorder, GetColorSet()->m_clrFrameBorder);
  704. }
  705. return rcHeader;
  706. }
  707. void CXTPTabPaintManager::CAppearanceSetPropertyPageAccess2007::DrawButtonBackground(CDC* pDC, CXTPTabManagerItem* pItem, CRect rc)
  708. {
  709. CXTPOffice2007Image* pImage = XTPOffice2007Images()->LoadFile(_T("ACCESSTAB"));
  710. int nState = 0;
  711. if (pItem->IsSelected() && pItem->IsHighlighted())
  712. {
  713. nState = 3;
  714. }
  715. else if (pItem->IsSelected())
  716. {
  717. nState = 2;
  718. }
  719. else if (pItem->IsHighlighted())
  720. {
  721. nState = 1;
  722. }
  723. CRect rcSrc(pImage->GetSource(nState, 4));
  724. if (pImage) pImage->DrawImage(pDC, rc, rcSrc, CRect(5, 10, 22, 10), 0xFF00FF);
  725. }
  726. void CXTPTabPaintManager::CAppearanceSetPropertyPageAccess2007::DrawSingleButton(CDC* pDC, CXTPTabManagerItem* pItem)
  727. {
  728. if (!XTPOffice2007Images()->IsValid())
  729. {
  730. CAppearanceSet::DrawSingleButton(pDC, pItem);
  731. return;
  732. }
  733. CRect rc = pItem->GetRect();
  734. if (IsHorizontalTabPosition(pItem->GetTabManager()->GetPosition())) rc.right += m_nButtonHeight / 2 - 1; else rc.bottom += m_nButtonHeight / 2 - 1;
  735. switch (pItem->GetTabManager()->GetPosition())
  736. {
  737. case xtpTabPositionTop:
  738. DrawButtonBackground(pDC, pItem, rc);
  739. break;
  740. case xtpTabPositionBottom:
  741. DrawRotatedButton(pDC, rc, pItem, FALSE, &CColorSetWinXP::DrawRotatedBitsBottom, &CColorSetWinXP::DrawRotatedBitsBottom);
  742. break;
  743. case xtpTabPositionLeft:
  744. DrawRotatedButton(pDC, rc, pItem, TRUE, &CColorSetWinXP::DrawRotatedBitsLeft, &CColorSetWinXP::DrawRotatedBitsLeft);
  745. break;
  746. case xtpTabPositionRight:
  747. DrawRotatedButton(pDC, rc, pItem, TRUE, &CColorSetWinXP::DrawRotatedBitsInvertRight, &CColorSetWinXP::DrawRotatedBitsRight);
  748. break;
  749. }
  750. m_pPaintManager->DrawSingleButtonIconAndText(pDC, pItem, pItem->GetRect(), TRUE);
  751. }
  752. //////////////////////////////////////////////////////////////////////////
  753. // CAppearanceSetVisualStudio2005
  754. CRect CXTPTabPaintManager::CAppearanceSetVisualStudio2005::GetButtonDrawRect(const CXTPTabManagerItem* pItem)
  755. {
  756. CRect rc = pItem->GetRect();
  757. return pItem->GetTabManager()->IsHorizontalPosition() ?
  758. CRect(rc.left - rc.Height() / 2, rc.top, rc.right + rc.Height() / 2 , rc.bottom) :
  759. CRect(rc.left, rc.top  - rc.Width() / 2, rc.right , rc.bottom  + rc.Width() / 2);
  760. }
  761. void CXTPTabPaintManager::CAppearanceSetVisualStudio2005::DrawSingleButton(CDC* pDC, CXTPTabManagerItem* pItem)
  762. {
  763. CRect rc = pItem->GetRect();
  764. COLORREF clrBorder = GetColorSet()->m_csPropertyPage2003.clrDarkShadow, clrLeftHighlight = GetColorSet()->m_csPropertyPage2003.clrBorderLeftHighlight, clrTopHighlight = GetColorSet()->m_csPropertyPage2003.clrBorderTopHighlight;
  765. if (pItem->IsSelected())
  766. {
  767. clrBorder = GetColorSet()->m_csPropertyPage2003.clrFrameBorder;
  768. clrLeftHighlight = RGB(255, 255, 255);
  769. clrTopHighlight = RGB(255, 255, 255);
  770. }
  771. switch (pItem->GetTabManager()->GetPosition())
  772. {
  773. case xtpTabPositionBottom:
  774. {
  775. int nHeight2 = rc.Height() /2;
  776. POINT ptsBorder[] = {{rc.right + nHeight2 - 4, rc.top + 1}, {-nHeight2 + 3 , nHeight2 * 2 - 6}, {-4, 4}, {-2, 1}, {-rc.Width() + 14, 0}, {-2, -1}, {-3, -3}, {-nHeight2 + 3 - 1 , -(nHeight2 * 2 - 6 + 2)}};
  777. FillButton(pDC, pItem, ptsBorder, sizeof(ptsBorder) / sizeof(ptsBorder[0]), pItem->GetTabManager()->GetPosition());
  778. DrawPolyLine(pDC, clrBorder, ptsBorder, sizeof(ptsBorder) / sizeof(ptsBorder[0]));
  779. POINT ptsRightBorder[] = {{rc.right + nHeight2 - 4 - 1, rc.top + 1}, {-nHeight2 + 3 , nHeight2 * 2 - 6}, {-3, 3}, {-2, 1}};
  780. DrawPolyLine(pDC, clrLeftHighlight, ptsRightBorder, sizeof(ptsRightBorder) / sizeof(ptsRightBorder[0]));
  781. POINT ptsLeftBorder[] = {{rc.right - 4 + 3 - 4 - 2 - rc.Width() + 14, rc.top + 1 + nHeight2 * 2 - 6 + 4}
  782. , {-2, -1}, {-2, -2}, {-nHeight2 + 3 - 1 , -(nHeight2 * 2 - 6 + 2)}};
  783. DrawPolyLine(pDC, clrTopHighlight, ptsLeftBorder, sizeof(ptsLeftBorder) / sizeof(ptsLeftBorder[0]));
  784. }
  785. break;
  786. case xtpTabPositionTop:
  787. {
  788. int nHeight2 = rc.Height() /2;
  789. POINT ptsBorder[] = {{rc.right + nHeight2 - 4, rc.bottom - 1}, {-nHeight2 + 3 , - nHeight2 * 2 + 6}, {-4, -4}, {-3, -1}, {-rc.Width() + 16, 0}, {-3, 1}, {-3, 3}, {-nHeight2 + 3 - 1 , (nHeight2 * 2 - 6 + 2)}};
  790. FillButton(pDC, pItem, ptsBorder, sizeof(ptsBorder) / sizeof(ptsBorder[0]), pItem->GetTabManager()->GetPosition());
  791. DrawPolyLine(pDC, clrBorder, ptsBorder, sizeof(ptsBorder) / sizeof(ptsBorder[0]));
  792. POINT ptsRightBorder[] = {{rc.right + nHeight2 - 4 - 1, rc.bottom - 1}, {-nHeight2 + 3 , - nHeight2 * 2 + 6}, {-3, -3}, {-3, -1}};
  793. DrawPolyLine(pDC, clrLeftHighlight, ptsRightBorder, sizeof(ptsRightBorder) / sizeof(ptsRightBorder[0]));
  794. POINT ptsLeftBorder[] = {{rc.right - 4 + 3 - 4 -2, rc.bottom - nHeight2 * 2 + 6 - 1-4}, {-rc.Width() + 16 -1, 0}, {-3, 1}, {-2, 2}, {-nHeight2 + 3 - 1 , (nHeight2 * 2 - 6 + 2)}};
  795. DrawPolyLine(pDC, clrTopHighlight, ptsLeftBorder, sizeof(ptsLeftBorder) / sizeof(ptsLeftBorder[0]));
  796. }
  797. break;
  798. case xtpTabPositionRight:
  799. {
  800. int nHeight2 = rc.Width() /2;
  801. POINT ptsBorder[] = {{rc.left, rc.bottom + nHeight2 - 4}, {nHeight2 * 2 -6 + 1 , -nHeight2 + 3}, {4, -4}, {+1, -3}, {0, -rc.Height() + 16}, {-1, -3}, {-3, -3}, {-nHeight2 * 2 + 6 - 2, (- nHeight2 +3 -1)}};
  802. FillButton(pDC, pItem, ptsBorder, sizeof(ptsBorder) / sizeof(ptsBorder[0]), pItem->GetTabManager()->GetPosition());
  803. DrawPolyLine(pDC, clrBorder, ptsBorder, sizeof(ptsBorder) / sizeof(ptsBorder[0]));
  804. POINT ptsRightBorder[] = {{rc.left, rc.bottom + nHeight2 - 5}, {nHeight2 * 2 -6 + 1 , -nHeight2 + 3}, {3, -3}, {+1, -3}, {0, -rc.Height() + 14}};
  805. DrawPolyLine(pDC, clrLeftHighlight, ptsRightBorder, sizeof(ptsRightBorder) / sizeof(ptsRightBorder[0]));
  806. POINT ptsLeftBorder[] = {{rc.left + nHeight2 * 2 -6 + 2 + 4 -2 , rc.bottom - 4 -4 -rc.Height() + 16 -3}, {-2, -2}, {-nHeight2 * 2 + 6 - 2, (- nHeight2 +3 -1)}};
  807. DrawPolyLine(pDC, clrTopHighlight, ptsLeftBorder, sizeof(ptsLeftBorder) / sizeof(ptsLeftBorder[0]));
  808. }
  809. break;
  810. case xtpTabPositionLeft:
  811. {
  812. int nHeight2 = rc.Width() /2;
  813. POINT ptsBorder[] = {{rc.right - 1, rc.bottom + nHeight2 - 4}, {-(nHeight2 * 2 -6), -nHeight2 + 3}, {-4, -4}, {-1, -3}, {0, -rc.Height() + 16}, {1, -3}, {3, -3}, {nHeight2 * 2 - 6 + 2, (- nHeight2 +3 -1)}};
  814. FillButton(pDC, pItem, ptsBorder, sizeof(ptsBorder) / sizeof(ptsBorder[0]), pItem->GetTabManager()->GetPosition());
  815. DrawPolyLine(pDC, clrBorder, ptsBorder, sizeof(ptsBorder) / sizeof(ptsBorder[0]));
  816. POINT ptsRightBorder[] = {{rc.right - 1, rc.bottom + nHeight2 - 5}, {-(nHeight2 * 2 -6), -nHeight2 + 3}, {-3, -3}, {-1, -3}};
  817. DrawPolyLine(pDC, clrLeftHighlight, ptsRightBorder, sizeof(ptsRightBorder) / sizeof(ptsRightBorder[0]));
  818. POINT ptsLeftBorder[] = {{rc.right - 1-(nHeight2 * 2 -6)-4-1 + 1, rc.bottom + nHeight2 - 4 -nHeight2 + 3 -4 -3}, {0, -rc.Height() + 16}, {1, -3}, {2, -2}, {nHeight2 * 2 - 6 + 2, (- nHeight2 +3 -1)}};
  819. DrawPolyLine(pDC, clrTopHighlight, ptsLeftBorder, sizeof(ptsLeftBorder) / sizeof(ptsLeftBorder[0]));
  820. }
  821. break;
  822. }
  823. m_pPaintManager->DrawSingleButtonIconAndText(pDC, pItem, pItem->GetRect(), TRUE);
  824. }
  825. //////////////////////////////////////////////////////////////////////////
  826. // CAppearanceSetFlat
  827. void CXTPTabPaintManager::CAppearanceSetFlat::DrawSingleButton(CDC* pDC, CXTPTabManagerItem* pItem)
  828. {
  829. CRect rcItem(pItem->GetRect());
  830. InflateRectEx(rcItem, CRect(0, 0, 1, 0), pItem->GetTabManager()->GetPosition());
  831. GetColorSet()->FillPropertyButton(pDC, rcItem, pItem);
  832. if (pItem->IsSelected())
  833. InflateRectEx(rcItem, CRect(0, 0, 0, 1), pItem->GetTabManager()->GetPosition());
  834. pDC->Draw3dRect(rcItem, GetColorSet()->m_clrFrameBorder, GetColorSet()->m_clrFrameBorder);
  835. m_pPaintManager->DrawSingleButtonIconAndText(pDC, pItem, pItem->GetRect(), TRUE);
  836. }
  837. CRect CXTPTabPaintManager::CAppearanceSetFlat::FillTabControl(CXTPTabManager* pTabManager, CDC* pDC, CRect rcControl)
  838. {
  839. CRect rcHeader = GetHeaderRect(rcControl, pTabManager);
  840. GetColorSet()->FillHeader(pDC, rcHeader, pTabManager);
  841. CRect rcClient = GetClientRect(rcControl, pTabManager);
  842. if (m_pPaintManager->m_clientFrame == xtpTabFrameBorder)
  843. {
  844. GetColorSet()->FillClient(pDC, rcClient, pTabManager);
  845. pDC->Draw3dRect(rcClient, GetColorSet()->m_clrFrameBorder, GetColorSet()->m_clrFrameBorder);
  846. }
  847. if (m_pPaintManager->m_clientFrame == xtpTabFrameSingleLine)
  848. {
  849. GetColorSet()->FillClient(pDC, rcClient, pTabManager);
  850. DrawSingleLineBorder(pDC, rcClient, pTabManager->GetPosition(), GetColorSet()->m_clrFrameBorder, GetColorSet()->m_clrFrameBorder);
  851. }
  852. return rcHeader;
  853. }
  854. //////////////////////////////////////////////////////////////////////////
  855. // CAppearanceSetPropertyPageFlat
  856. void CXTPTabPaintManager::CAppearanceSetPropertyPageFlat::DrawSingleButton(CDC* pDC, CXTPTabManagerItem* pItem)
  857. {
  858. CRect rcItem(pItem->GetRect());
  859. XTPTabPosition tabPosition = pItem->GetTabManager()->GetPosition();
  860. InflateRectEx(rcItem, CRect(0, 0, 1, 0), tabPosition);
  861. CRect rcTab(rcItem);
  862. CRect rcClip;
  863. pDC->GetClipBox(rcClip);
  864. CRgn rgn;
  865. rgn.CreateRectRgnIndirect(rcClip);
  866. InflateRectEx(rcTab, CRect(0, 0, 0, 1), tabPosition);
  867. XTPDrawHelpers()->ExcludeCorners(pDC, rcTab);
  868. CRect rcEntry(rcItem);
  869. InflateRectEx(rcEntry, CRect(-1, -1, -1, 0), tabPosition);
  870. if (m_bVisualStudio2005Style)
  871. {
  872. if (pItem->IsSelected())
  873. {
  874. GetColorSet()->FillPropertyButton(pDC, rcEntry, pItem);
  875. if (!pItem->IsSelected())
  876. DrawSingleLineBorder(pDC, rcItem, XTPTabPosition((tabPosition + 2) % 4), GetColorSet()->m_clrFrameBorder, GetColorSet()->m_clrFrameBorder);
  877. InflateRectEx(rcItem, CRect(0, 0, 0, 2), tabPosition);
  878. CXTPPenDC pen(*pDC, GetColorSet()->m_clrFrameBorder);
  879. CGdiObject* pOldBrush = pDC->SelectStockObject(NULL_BRUSH);
  880. pDC->RoundRect(rcItem, CPoint(6, 6));
  881. pDC->SelectObject(pOldBrush);
  882. }
  883. else
  884. {
  885. if (pItem->GetIndex() < pItem->GetTabManager()->GetItemCount() - 1)
  886. {
  887. if (IsHorizontalTabPosition(tabPosition))
  888. pDC->FillSolidRect(rcItem.right - 1, rcItem.top + 3, 1, rcItem.Height() - 6, GetColorSet()->m_clrFrameBorder);
  889. else
  890. pDC->FillSolidRect(rcItem.left + 3, rcItem.bottom - 1, rcItem.Width() - 6, 1, GetColorSet()->m_clrFrameBorder);
  891. }
  892. }
  893. }
  894. else
  895. {
  896. GetColorSet()->FillPropertyButton(pDC, rcEntry, pItem);
  897. if (m_bBlurPoints)
  898. {
  899. if (pItem->IsSelected())
  900. InflateRectEx(rcItem, CRect(0, 0, 0, 1), tabPosition);
  901. pDC->Draw3dRect(rcItem, GetColorSet()->m_clrFrameBorder, GetColorSet()->m_clrFrameBorder);
  902. }
  903. else
  904. {
  905. if (m_pPaintManager->m_clientFrame != xtpTabFrameNone)
  906. {
  907. if (!pItem->IsSelected())
  908. DrawSingleLineBorder(pDC, rcItem, XTPTabPosition((tabPosition + 2) % 4), GetColorSet()->m_clrFrameBorder, GetColorSet()->m_clrFrameBorder);
  909. }
  910. InflateRectEx(rcItem, CRect(0, 0, 0, 2), tabPosition);
  911. CXTPPenDC pen(*pDC, GetColorSet()->m_clrFrameBorder);
  912. CGdiObject* pOldBrush = pDC->SelectStockObject(NULL_BRUSH);
  913. pDC->RoundRect(rcItem, CPoint(6, 6));
  914. pDC->SelectObject(pOldBrush);
  915. }
  916. }
  917. pDC->SelectClipRgn(&rgn);
  918. if (m_bBlurPoints)
  919. switch (tabPosition)
  920. {
  921. case xtpTabPositionTop:
  922. {
  923. POINT pts[] =
  924. {
  925. {rcTab.left, rcTab.top + 1}, {0, -1}, {rcTab.left + 1, rcTab.top}, {-1, 0},
  926. {rcTab.right - 2, rcTab.top}, {+1, 0}, {rcTab.right - 1, rcTab.top + 1}, {0, -1},
  927. {rcTab.left + 1, rcTab.top + 1}, {-1, 0}, {rcTab.right - 2, rcTab.top + 1}, {+1, 0},
  928. {rcTab.left + 2, rcTab.top + 1}, {-1, 0}, {rcTab.left + 1, rcTab.top +2}, {0, -1},
  929. {rcTab.right - 3, rcTab.top + 1}, {+1, 0}, {rcTab.right - 2, rcTab.top + 2}, {0, -1},
  930. };
  931. XTPDrawHelpers()->BlurPoints(pDC, pts, _countof(pts));
  932. }
  933. break;
  934. case xtpTabPositionLeft:
  935. {
  936. POINT pts[] =
  937. {
  938. {rcTab.left, rcTab.top + 1}, {0, -1}, {rcTab.left + 1, rcTab.top}, {-1, 0},
  939. {rcTab.left, rcTab.bottom - 2}, {0, +1}, {rcTab.left + 1, rcTab.bottom}, {-1, 0},
  940. {rcTab.left + 1, rcTab.top + 1}, {-1, 0}, {rcTab.left + 1, rcTab.bottom - 2}, {-1, 0},
  941. {rcTab.left + 2, rcTab.top + 1}, {-1, 0}, {rcTab.left + 1, rcTab.top +2}, {0, -1},
  942. {rcTab.left + 2, rcTab.bottom - 2}, {-1, 0}, {rcTab.left + 1, rcTab.bottom - 3}, {0, +1},
  943. };
  944. XTPDrawHelpers()->BlurPoints(pDC, pts, _countof(pts));
  945. }
  946. break;
  947. case xtpTabPositionBottom:
  948. {
  949. POINT pts[] =
  950. {
  951. {rcTab.left, rcTab.bottom - 2}, {0, +1}, {rcTab.left + 1, rcTab.bottom -1}, {-1, 0},
  952. {rcTab.right - 1, rcTab.bottom - 2}, {0, +1}, {rcTab.right - 2, rcTab.bottom - 1}, {+1, 0},
  953. {rcTab.left + 1, rcTab.bottom - 2}, {0, +1}, {rcTab.right - 2, rcTab.bottom - 2}, {+1, 0},
  954. {rcTab.left + 2, rcTab.bottom - 2}, {-1, 0}, {rcTab.left + 1, rcTab.bottom - 3}, {0, +1},
  955. {rcTab.right - 3, rcTab.bottom - 2}, {+1, 0}, {rcTab.right - 2, rcTab.bottom - 3}, {0, +1},
  956. };
  957. XTPDrawHelpers()->BlurPoints(pDC, pts, _countof(pts));
  958. }
  959. break;
  960. case xtpTabPositionRight:
  961. {
  962. POINT pts[] =
  963. {
  964. {rcTab.right - 1, rcTab.top + 1}, {0, -1}, {rcTab.right - 2, rcTab.top}, {+1, 0},
  965. {rcTab.right - 1, rcTab.bottom - 2}, {0, +1}, {rcTab.right - 2, rcTab.bottom}, {+1, 0},
  966. {rcTab.right - 2, rcTab.top + 1}, {+1, 0}, {rcTab.right - 2, rcTab.bottom - 2}, {+1, 0},
  967. {rcTab.right - 3, rcTab.top + 1}, {+1, 0}, {rcTab.right - 2, rcTab.top +2}, {0, -1},
  968. {rcTab.right - 3, rcTab.bottom - 2}, {+1, 0}, {rcTab.right - 2, rcTab.bottom - 3}, {0, +1},
  969. };
  970. XTPDrawHelpers()->BlurPoints(pDC, pts, _countof(pts));
  971. }
  972. break;
  973. }
  974. m_pPaintManager->DrawSingleButtonIconAndText(pDC, pItem, pItem->GetRect(), TRUE);
  975. }
  976. //////////////////////////////////////////////////////////////////////////
  977. // CAppearanceExcel
  978. void CXTPTabPaintManager::CAppearanceSetExcel::DrawSingleButton(CDC* pDC, CXTPTabManagerItem* pItem)
  979. {
  980. CRect rc(pItem->GetRect());
  981. CXTPTabPaintManager::CColorSet::COLORSET_TAB_EXCEL& cs = pItem->IsSelected() ? GetColorSet()->m_csExcelSelected : GetColorSet()->m_csExcelNormal;
  982. switch (pItem->GetTabManager()->GetPosition())
  983. {
  984. case xtpTabPositionTop:
  985. {
  986. rc.bottom -= 1;
  987. int nMargin = rc.Height() / 2;
  988. rc.OffsetRect(- nMargin / 2 , 0);
  989. POINT ptsFill[] = {{rc.left, rc.bottom}, {nMargin, - nMargin * 2}, {rc.Width() - nMargin, 0}, {nMargin, nMargin * 2}};
  990. COLORREF clrDark = FillButton(pDC, pItem, ptsFill, _countof(ptsFill), pItem->GetTabManager()->GetPosition(), FALSE);
  991. LineEx(pDC, cs.clrLeftOuterBorder, rc.left + 1, rc.bottom - 1, rc.left + nMargin + 1, rc.top);
  992. LineEx(pDC, cs.clrLeftOuterBorder, rc.left + nMargin, rc.top + 1, rc.right, rc.top + 1);
  993. LineEx(pDC, cs.clrRightOuterBorder, rc.right - 1, rc.top, rc.right + nMargin - 1, rc.bottom);
  994. LineEx(pDC, cs.clrLeftInnerBorder, rc.left, rc.bottom - 1, rc.left + nMargin, rc.top);
  995. LineEx(pDC, cs.clrLeftInnerBorder, rc.left + nMargin, rc.top, rc.right, rc.top);
  996. LineEx(pDC, cs.clrRightInnerBorder, rc.right, rc.top, rc.right + nMargin, rc.bottom);
  997. if (pItem->IsSelected())
  998. HorizontalLine(pDC, rc.left, rc.bottom, rc.Width() + nMargin, clrDark);
  999. }
  1000. break;
  1001. case xtpTabPositionLeft:
  1002. {
  1003. rc.right -= 1;
  1004. int nMargin = rc.Width() / 2;
  1005. rc.OffsetRect(0, - nMargin / 2);
  1006. POINT ptsFill[] = {{rc.right, rc.top}, {-nMargin * 2, nMargin}, {0, rc.Height() - nMargin}, {nMargin * 2, nMargin}};
  1007. COLORREF clrDark = FillButton(pDC, pItem, ptsFill, _countof(ptsFill), pItem->GetTabManager()->GetPosition(), FALSE);
  1008. LineEx(pDC, cs.clrLeftOuterBorder, rc.right - 1, rc.top + 1, rc.left, rc.top + nMargin + 1);
  1009. LineEx(pDC, cs.clrLeftOuterBorder, rc.left + 1, rc.top + nMargin, rc.left + 1, rc.bottom);
  1010. LineEx(pDC, cs.clrRightOuterBorder, rc.left , rc.bottom - 1, rc.right, rc.bottom + nMargin - 1);
  1011. LineEx(pDC, cs.clrLeftInnerBorder, rc.right - 1, rc.top, rc.left, rc.top + nMargin);
  1012. LineEx(pDC, cs.clrLeftInnerBorder, rc.left, rc.top + nMargin, rc.left, rc.bottom);
  1013. LineEx(pDC, cs.clrRightInnerBorder, rc.left, rc.bottom, rc.right, rc.bottom + nMargin);
  1014. if (pItem->IsSelected())
  1015. VerticalLine(pDC, rc.right, rc.top, rc.Height() + nMargin, clrDark);
  1016. }
  1017. break;
  1018. case xtpTabPositionBottom:
  1019. {
  1020. rc.bottom -= 1;
  1021. int nMargin = rc.Height() / 2;
  1022. rc.OffsetRect(- nMargin /2 , 0);
  1023. POINT ptsFill[] = {{rc.left, rc.top + 1}, {nMargin, nMargin * 2}, {rc.Width() - nMargin, 0}, {nMargin, - nMargin * 2}};
  1024. COLORREF clrDark = FillButton(pDC, pItem, ptsFill, _countof(ptsFill), pItem->GetTabManager()->GetPosition(), FALSE);
  1025. LineEx(pDC, cs.clrLeftOuterBorder, rc.left + 1, rc.top + 1, rc.left + nMargin + 1, rc.bottom);
  1026. LineEx(pDC, cs.clrTopOuterBorder, rc.left + nMargin, rc.bottom - 1, rc.right, rc.bottom - 1);
  1027. LineEx(pDC, cs.clrRightOuterBorder, rc.right - 1, rc.bottom, rc.right + nMargin - 1, rc.top);
  1028. LineEx(pDC, cs.clrLeftInnerBorder, rc.left, rc.top + 1, rc.left + nMargin, rc.bottom);
  1029. LineEx(pDC, cs.clrTopInnerBorder, rc.left + nMargin, rc.bottom, rc.right, rc.bottom);
  1030. LineEx(pDC, cs.clrRightInnerBorder, rc.right, rc.bottom, rc.right + nMargin, rc.top);
  1031. if (pItem->IsSelected())
  1032. HorizontalLine(pDC, rc.left, rc.top, rc.Width() + nMargin, clrDark);
  1033. }
  1034. break;
  1035. case xtpTabPositionRight:
  1036. {
  1037. rc.right -= 1;
  1038. int nMargin = rc.Width() / 2;
  1039. rc.OffsetRect(0, - nMargin / 2);
  1040. POINT ptsFill[] = {{rc.left + 1, rc.top}, {nMargin * 2, nMargin}, {0, rc.Height() - nMargin}, {- nMargin * 2, nMargin}};
  1041. COLORREF clrDark = FillButton(pDC, pItem, ptsFill, _countof(ptsFill), pItem->GetTabManager()->GetPosition(), FALSE);
  1042. LineEx(pDC, cs.clrLeftOuterBorder, rc.left + 1, rc.top + 1, rc.right, rc.top + nMargin + 1);
  1043. LineEx(pDC, cs.clrLeftOuterBorder, rc.right - 1, rc.top + nMargin, rc.right - 1, rc.bottom);
  1044. LineEx(pDC, cs.clrRightOuterBorder, rc.right , rc.bottom - 1, rc.left, rc.bottom + nMargin - 1);
  1045. LineEx(pDC, cs.clrLeftInnerBorder, rc.left + 1, rc.top, rc.right, rc.top + nMargin);
  1046. LineEx(pDC, cs.clrLeftInnerBorder, rc.right, rc.top + nMargin, rc.right, rc.bottom);
  1047. LineEx(pDC, cs.clrRightInnerBorder, rc.right, rc.bottom, rc.left, rc.bottom + nMargin);
  1048. if (pItem->IsSelected())
  1049. VerticalLine(pDC, rc.left, rc.top, rc.Height() + nMargin, clrDark);
  1050. }
  1051. break;
  1052. }
  1053. m_pPaintManager->DrawSingleButtonIconAndText(pDC, pItem, pItem->GetRect(), TRUE);
  1054. }
  1055. CRect CXTPTabPaintManager::CAppearanceSetExcel::GetButtonDrawRect(const CXTPTabManagerItem* pItem)
  1056. {
  1057. CRect rc = pItem->GetRect();
  1058. return pItem->GetTabManager()->IsHorizontalPosition() ?
  1059. CRect(rc.left - rc.Height() / 2, rc.top, rc.right + rc.Height() / 2 , rc.bottom) :
  1060. CRect(rc.left, rc.top  - rc.Width() / 2, rc.right, rc.bottom  + rc.Width() / 2);
  1061. }
  1062. //////////////////////////////////////////////////////////////////////////
  1063. // CAppearanceSetVisio
  1064. void CXTPTabPaintManager::CAppearanceSetVisio::AdjustClientRect(CXTPTabManager* pTabManager, CRect& rcClient)
  1065. {
  1066. DeflateRectEx(rcClient, m_pPaintManager->m_rcControlMargin, pTabManager->GetPosition());
  1067. rcClient = GetClientRect(rcClient, pTabManager);
  1068. DeflateRectEx(rcClient, GetClientMargin(), pTabManager->GetPosition());
  1069. }
  1070. void CXTPTabPaintManager::CAppearanceSetVisio::RepositionTabControl(CXTPTabManager* pTabManager, CDC* /*pDC*/, CRect rcClient)
  1071. {
  1072. CAppearanceSet::DeflateRectEx(rcClient, m_pPaintManager->m_rcControlMargin, pTabManager->GetPosition());
  1073. if (pTabManager->GetItemCount() == 0)
  1074. return;
  1075. int nButtonHeight = GetButtonHeight(pTabManager);
  1076. CRect rc(rcClient);
  1077. if (m_pPaintManager->m_clientFrame != xtpTabFrameNone)
  1078. {
  1079. rc.left++;
  1080. }
  1081. rc.top++;
  1082. CRect rcItem(rc.left, rc.top, rc.right, rc.top);
  1083. for (int i = 0; i < pTabManager->GetItemCount(); i++)
  1084. {
  1085. CXTPTabManagerItem* pItem = pTabManager->GetItem(i);
  1086. rcItem.bottom = rcItem.top + nButtonHeight;
  1087. pItem->SetRect(rcItem);
  1088. rcItem.top += nButtonHeight;
  1089. if (pItem->IsSelected())
  1090. {
  1091. int nBottom = max(rcItem.top + nButtonHeight, rc.bottom - (pTabManager->GetItemCount() - i - 1) * nButtonHeight);
  1092. nBottom = max(rcItem.top, min(nBottom, rc.bottom - 1));
  1093. rcItem.top = nBottom;
  1094. }
  1095. }
  1096. }
  1097. CRect CXTPTabPaintManager::CAppearanceSetVisio::GetHeaderRect(CRect /*rcControl*/, CXTPTabManager* /*pTabManager*/)
  1098. {
  1099. return CXTPEmptyRect();
  1100. }
  1101. CRect CXTPTabPaintManager::CAppearanceSetVisio::GetClientRect(CRect rcControl, CXTPTabManager* pTabManager)
  1102. {
  1103. CXTPTabManagerItem* pItem = pTabManager->GetSelectedItem();
  1104. if (pItem)
  1105. {
  1106. int nButtonHeight = GetButtonHeight(pTabManager);
  1107. rcControl.top += (pItem->GetIndex() + 1) * nButtonHeight + 1;
  1108. rcControl.bottom -= (pTabManager->GetItemCount() - pItem->GetIndex() - 1) * nButtonHeight;
  1109. rcControl.bottom = max(rcControl.top + nButtonHeight, rcControl.bottom);
  1110. if (pItem->GetIndex() == pTabManager->GetItemCount() - 1 &&
  1111. m_pPaintManager->m_clientFrame != xtpTabFrameNone) rcControl.bottom--;
  1112. }
  1113. if (m_pPaintManager->m_clientFrame != xtpTabFrameNone)
  1114. {
  1115. rcControl.DeflateRect(1, 0, 1, 0);
  1116. }
  1117. return rcControl;
  1118. }
  1119. void CXTPTabPaintManager::CAppearanceSetVisio::DrawSingleButton(CDC* pDC, CXTPTabManagerItem* pItem)
  1120. {
  1121. CRect rcItem = pItem->GetRect();
  1122. GetColorSet()->FillPropertyButton(pDC, rcItem, pItem);
  1123. pDC->Draw3dRect(rcItem, GetColorSet()->m_clrBorderHighlight, GetColorSet()->m_clrFrameBorder);
  1124. for (int y = rcItem.top + 4; y < rcItem.bottom - 3; y += 2)
  1125. {
  1126. HorizontalLine(pDC, rcItem.right - 7, y, 3, GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));
  1127. }
  1128. rcItem.right -= 7;
  1129. m_pPaintManager->DrawSingleButtonIconAndText(pDC, pItem, rcItem, TRUE);
  1130. }
  1131. void CXTPTabPaintManager::CAppearanceSetVisio::DrawTabControl(CXTPTabManager* pTabManager, CDC* pDC, CRect rcClient)
  1132. {
  1133. pDC->FillSolidRect(rcClient, GetColorSet()->m_clrControlFace);
  1134. CAppearanceSet::DeflateRectEx(rcClient, m_pPaintManager->m_rcControlMargin, pTabManager->GetPosition());
  1135. CRgn rgn;
  1136. rgn.CreateRectRgnIndirect(rcClient);
  1137. pDC->SelectClipRgn(&rgn);
  1138. if (m_pPaintManager->m_clientFrame != xtpTabFrameNone)
  1139. {
  1140. pDC->Draw3dRect(rcClient, GetColorSet()->m_clrFrameBorder, GetColorSet()->m_clrFrameBorder);
  1141. }
  1142. else if (pTabManager->GetItemCount() > 0)
  1143. {
  1144. HorizontalLine(pDC, rcClient.left, rcClient.top, rcClient.Width(), GetColorSet()->m_clrFrameBorder);
  1145. }
  1146. pDC->SetBkMode(TRANSPARENT);
  1147. for (int i = pTabManager->GetItemCount() - 1; i >= 0; i--)
  1148. {
  1149. CXTPTabManagerItem* pItem = pTabManager->GetItem(i);
  1150. CRect rcItem = pItem->GetRect();
  1151. if (CRect().IntersectRect(rcClient, rcItem) && !rcItem.IsRectEmpty())
  1152. {
  1153. DrawSingleButton(pDC, pItem);
  1154. }
  1155. }
  1156. pDC->SelectClipRgn(NULL);
  1157. }