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

对话框与窗口

开发平台:

Visual C++

  1. // XTPTaskPanelPaintManager.cpp : implementation of the CXTPTaskPanelPaintManager class.
  2. //
  3. // This file is a part of the XTREME TASKPANEL 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 "Resource.h"
  22. #include "Common/XTPVC80Helpers.h"
  23. #include "Common/XTPDrawHelpers.h"
  24. #include "Common/XTPWinThemeWrapper.h"
  25. #include "Common/XTPImageManager.h"
  26. #include "Common/XTPResourceManager.h"
  27. #include "Common/XTPOffice2007Image.h"
  28. #include "XTPTaskPanel.h"
  29. #include "XTPTaskPanelGroup.h"
  30. #include "XTPTaskPanelGroupItem.h"
  31. #include "XTPTaskPanelItems.h"
  32. #include "XTPTaskPanelPaintManager.h"
  33. #ifdef _DEBUG
  34. #undef THIS_FILE
  35. static char THIS_FILE[] = __FILE__;
  36. #define new DEBUG_NEW
  37. #endif
  38. #define NORMCOLOR(a) a < 0 ? 0: a > 255 ? 255 : a
  39. #define HIGHLIGHT_OFFICE2003 2
  40. #define COLORREF_TRANSPARENT 0x1FFFFFFF
  41. const CRect CXTPTaskPanelPaintManager::rectDefault(CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT);
  42. //////////////////////////////////////////////////////////////////////
  43. // Construction/Destruction
  44. //////////////////////////////////////////////////////////////////////
  45. CXTPTaskPanelPaintManager::CXTPTaskPanelPaintManager()
  46. {
  47. m_bEmulateEplorerTheme = TRUE;
  48. m_bBoldCaption = TRUE;
  49. m_bOfficeHighlight = FALSE;
  50. m_bInvertDragRect = FALSE;
  51. m_bCaptionScrollButton = FALSE;
  52. m_bUseStandardItemsFont = TRUE;
  53. m_bUseStandardCaptionFont = TRUE;
  54. m_eGripper = xtpTaskPanelGripperPlain;
  55. m_hGripperNormal = m_hGripperSpecial = 0;
  56. m_rcGroupOuterMargins.SetRect(0, 0, 0, 0);
  57. m_rcGroupInnerMargins.SetRect(11, 8, 11, 8);
  58. m_rcItemOuterMargins.SetRect(0, 0, 0, 0);
  59. m_rcItemInnerMargins.SetRect(2, 2, 2, 2);
  60. m_rcImageLayoutIconPadding.SetRect(6, 6, 6, 6);
  61. m_rcItemIconPadding.SetRect(0, 0, 0, 0);
  62. m_rcGroupIconPadding.SetRect(0, 0, 0, 0);
  63. m_rcControlMargins.SetRect(12, 12, 12, 12);
  64. m_nGroupSpacing = 15;
  65. m_bEmbossedDisabledText = FALSE;
  66. ZeroMemory(m_bmpGrippers, sizeof(m_bmpGrippers));
  67. m_bUseBitmapGrippers = FALSE;
  68. m_bOfficeBorder = FALSE;
  69. m_bLeftRoundedCorner = m_bRightRoundedCorner = FALSE;
  70. m_nCaptionHeight = 0;
  71. m_nItemTextFormat = DT_WORDBREAK | DT_NOPREFIX;
  72. m_nCaptionTextFormat = DT_SINGLELINE | DT_LEFT | DT_END_ELLIPSIS | DT_VCENTER | DT_NOPREFIX;
  73. }
  74. XTP_TASKPANEL_GROUPCOLORS* CXTPTaskPanelPaintManager::GetGroupColors(CXTPTaskPanelGroup* pGroup)
  75. {
  76. return GetGroupColors(pGroup->IsSpecialGroup());
  77. }
  78. void CXTPTaskPanelPaintManager::FreeBitmaps()
  79. {
  80. for (int i = 0; i < 8; i++)
  81. {
  82. if (m_bmpGrippers[i])
  83. {
  84. DeleteObject(m_bmpGrippers[i]);
  85. m_bmpGrippers[i] = 0;
  86. }
  87. }
  88. }
  89. CFont* CXTPTaskPanelPaintManager::GetItemFont(CXTPTaskPanelItem* pItem)
  90. {
  91. if (!pItem)
  92. return &m_fntIcon;
  93. if (pItem->m_fntItem.GetSafeHandle())
  94. return &pItem->m_fntItem;
  95. if (pItem->GetType() == xtpTaskItemTypeGroup)
  96. return &m_fntCaption;
  97. BOOL bBold = ((CXTPTaskPanelGroupItem*)pItem)->IsBold();
  98. return (((CXTPTaskPanelGroupItem*)pItem)->IsItemHot() && (pItem->GetTaskPanel()->GetHotTrackStyle() == xtpTaskPanelHighlightText)) ?
  99. (bBold ? &m_fntIconHotBold: &m_fntIconHot) : (bBold ? &m_fntIconBold : &m_fntIcon);
  100. }
  101. CXTPTaskPanelPaintManager::~CXTPTaskPanelPaintManager()
  102. {
  103. if (m_hGripperNormal) DestroyIcon(m_hGripperNormal);
  104. if (m_hGripperSpecial) DestroyIcon(m_hGripperSpecial);
  105. FreeBitmaps();
  106. }
  107. CPoint CXTPTaskPanelPaintManager::GetHighlightOffset(CXTPTaskPanelGroupItem* pItem)
  108. {
  109. if (pItem->IsItemSelected() && !m_bOfficeHighlight)
  110. return CPoint(1, 1);
  111. return CPoint(0, 0);
  112. }
  113. void CXTPTaskPanelPaintManager::ConvertToHSL(COLORREF clr, double& h, double& s, double& l)
  114. {
  115. double r = (double)GetRValue(clr)/255;
  116. double g = (double)GetGValue(clr)/255;
  117. double b = (double)GetBValue(clr)/255;
  118. double maxcolor = __max(r, __max(g, b));
  119. double mincolor = __min(r, __min(g, b));
  120. l = (maxcolor + mincolor)/2;
  121. if (maxcolor == mincolor)
  122. {
  123. h = 0;
  124. s = 0;
  125. }
  126. else
  127. {
  128. if (l < 0.5)
  129. s = (maxcolor-mincolor)/(maxcolor + mincolor);
  130. else
  131. s = (maxcolor-mincolor)/(2.0-maxcolor-mincolor);
  132. if (r == maxcolor)
  133. h = (g-b)/(maxcolor-mincolor);
  134. else if (g == maxcolor)
  135. h = 2.0+(b-r)/(maxcolor-mincolor);
  136. else
  137. h = 4.0+(r-g)/(maxcolor-mincolor);
  138. h /= 6.0;
  139. if (h < 0.0) h += 1;
  140. }
  141. }
  142. double CXTPTaskPanelPaintManager::ConvertHueToRGB(double temp1, double temp2, double temp3)
  143. {
  144. if (temp3 < 0)
  145. temp3 = temp3 + 1.0;
  146. if (temp3 > 1)
  147. temp3 = temp3-1.0;
  148. if (6.0*temp3 < 1)
  149. return (temp1+(temp2-temp1)*temp3 * 6.0);
  150. else if (2.0*temp3 < 1)
  151. return temp2;
  152. else if (3.0*temp3 < 2.0)
  153. return (temp1+(temp2-temp1)*((2.0/3.0)-temp3)*6.0);
  154. return temp1;
  155. }
  156. COLORREF  CXTPTaskPanelPaintManager::ConvertFromHSL(double h, double s, double l)
  157. {
  158. double r, g, b;
  159. double temp1, temp2;
  160. if (s == 0)
  161. {
  162. r = g = b = l;
  163. }
  164. else
  165. {
  166. if (l < 0.5)
  167. temp2 = l*(1.0 + s);
  168. else
  169. temp2 = l + s-l*s;
  170. temp1 = 2.0*l-temp2;
  171. r = ConvertHueToRGB(temp1, temp2, h + 1.0/3.0);
  172. g = ConvertHueToRGB(temp1, temp2, h);
  173. b = ConvertHueToRGB(temp1, temp2, h-1.0/3.0);
  174. }
  175. return RGB((BYTE)(r * 255), (BYTE)(g * 255), (BYTE)(b * 255));
  176. }
  177. void CXTPTaskPanelPaintManager::Triangle(CDC* pDC, CPoint pt0, CPoint pt1, CPoint pt2, COLORREF clr)
  178. {
  179. CXTPPenDC pen (*pDC, clr);
  180. CXTPBrushDC brush (*pDC, clr);
  181. CPoint pts[3];
  182. pts[0] = pt0;
  183. pts[1] = pt1;
  184. pts[2] = pt2;
  185. pDC->Polygon(pts, 3);
  186. }
  187. void CXTPTaskPanelPaintManager::DrawScrollArrow(CDC* pDC, CPoint pt0, CPoint pt1, CPoint pt2, BOOL bEnabled)
  188. {
  189. if (bEnabled)
  190. {
  191. Triangle(pDC, pt0, pt1, pt2, 0);
  192. }
  193. else
  194. {
  195. CPoint pt(1, 1);
  196. Triangle(pDC, pt0 + pt, pt1 + pt, pt2 + pt, GetXtremeColor(COLOR_3DHIGHLIGHT));
  197. Triangle(pDC, pt0, pt1, pt2, GetXtremeColor(COLOR_3DSHADOW));
  198. }
  199. }
  200. void CXTPTaskPanelPaintManager::DrawScrollButton(CDC* pDC, CXTPTaskPanelScrollButton* pScrollButton)
  201. {
  202. if (!pScrollButton->IsVisible())
  203. return;
  204. CRect rc = pScrollButton->rcButton;
  205. if (m_bOfficeHighlight && !m_bCaptionScrollButton)
  206. {
  207. COLORREF clrNormal = GetGroupColors(pScrollButton->pGroupScroll)->clrClient.clrLight;
  208. COLORREF clrBrush = pScrollButton->bPressed ? (COLORREF)m_clrHighlightPressed :
  209. pScrollButton->bHot ? (COLORREF)m_clrHighlightHot : (clrNormal == COLORREF_TRANSPARENT ? (COLORREF)m_clrBackground : clrNormal);
  210. Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, clrBrush);
  211. }
  212. else
  213. {
  214. pDC->FillSolidRect(rc, GetXtremeColor(COLOR_3DFACE));
  215. if (!pScrollButton->bPressed)
  216. pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DHIGHLIGHT), GetXtremeColor(COLOR_3DSHADOW));
  217. else
  218. pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_3DHIGHLIGHT));
  219. }
  220. CPoint pt = rc.CenterPoint();
  221. if (!pScrollButton->bScrollUp)
  222. DrawScrollArrow(pDC, CPoint(pt.x - 5, pt.y - 2), CPoint(pt.x - 1, pt.y + 2), CPoint(pt.x + 3, pt.y - 2), pScrollButton->bEnabled);
  223. else
  224. DrawScrollArrow(pDC, CPoint(pt.x - 5, pt.y + 1), CPoint(pt.x - 1, pt.y - 3), CPoint(pt.x + 3, pt.y + 1), pScrollButton->bEnabled);
  225. }
  226. void CXTPTaskPanelPaintManager::CreateGripperIcon(HICON& hIcon, UINT nIDResource, COLORREF clrGripperBack)
  227. {
  228. if (hIcon)
  229. {
  230. DestroyIcon(hIcon);
  231. hIcon = 0;
  232. }
  233. CBitmap bmpGripper;
  234. double hueBack, satBack, lumBack;
  235. ConvertToHSL(clrGripperBack, hueBack, satBack, lumBack);
  236. CBitmap bmp;
  237. if (XTPResourceManager()->LoadBitmap(&bmp, nIDResource))
  238. {
  239. BITMAP bmpInfo;
  240. bmp.GetBitmap(&bmpInfo);
  241. CWindowDC dc(CWnd::GetDesktopWindow());
  242. if (bmpGripper.CreateCompatibleBitmap(&dc, bmpInfo.bmWidth, m_nCaptionHeight))
  243. {
  244. CXTPCompatibleDC dcTemplate(&dc, &bmp);
  245. CXTPCompatibleDC dcGripper(&dc, &bmpGripper);
  246. COLORREF clrTemplateBack = dcTemplate.GetPixel(0, 0);
  247. double hueTrans, satTrans, lumTrans;
  248. ConvertToHSL(clrTemplateBack, hueTrans, satTrans, lumTrans);
  249. for (int x = 0; x < bmpInfo.bmWidth; x++)
  250. for (int y = 0; y < bmpInfo.bmWidth; y++)
  251. {
  252. COLORREF clrTemplate = dcTemplate.GetPixel(x, y);
  253. if (clrTemplate == clrTemplateBack)
  254. {
  255. clrTemplate = RGB(0, 0xFF, 0);
  256. }
  257. else
  258. {
  259. double huePixel, satPixel, lumPixel;
  260. ConvertToHSL(clrTemplate, huePixel, satPixel, lumPixel);
  261. double fLumOffset = lumPixel / lumTrans;
  262. if (lumPixel <= 0.9 || lumBack > 0.9)
  263. {
  264. lumPixel = min(1.0, lumBack * fLumOffset);
  265. }
  266. clrTemplate = ConvertFromHSL(hueBack, satBack, lumPixel);
  267. }
  268. dcGripper.SetPixel(x, y, clrTemplate);
  269. }
  270. }
  271. CImageList il;
  272. il.Create(bmpInfo.bmWidth, bmpInfo.bmHeight, ILC_COLOR24 | ILC_MASK, 0, 1);
  273. il.Add(&bmpGripper, RGB(0, 0xFF, 0));
  274. hIcon = il.ExtractIcon(0);
  275. }
  276. }
  277. void CXTPTaskPanelPaintManager::PremultplyAlpha(HBITMAP& bmp)
  278. {
  279. HBITMAP hBitmap = bmp;
  280. bmp = CXTPImageManagerIcon::PreMultiplyAlphaBitmap(hBitmap);
  281. DeleteObject(hBitmap);
  282. }
  283. void CXTPTaskPanelPaintManager::CreateGripperBitmaps()
  284. {
  285. m_bUseBitmapGrippers = FALSE;
  286. XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();
  287. if (systemTheme != xtpSystemThemeUnknown)
  288. {
  289. WCHAR pszThemeFileName[MAX_PATH];
  290. pszThemeFileName[0] = 0;
  291. CString strShellPath;
  292. CXTPWinThemeWrapper theme;
  293. if (SUCCEEDED(theme.GetCurrentThemeName(pszThemeFileName, MAX_PATH, NULL, MAX_PATH, NULL, 0))
  294. && wcsstr(WCSLWR_S(pszThemeFileName, MAX_PATH), L"luna.msstyles"))
  295. {
  296. CString strThemeFileName(pszThemeFileName);
  297. strShellPath = strThemeFileName.Left(strThemeFileName.ReverseFind(_T('\')) + 1);
  298. }
  299. else
  300. {
  301. CString strThemeFileName;
  302. if (GetWindowsDirectory(strThemeFileName.GetBufferSetLength(MAX_PATH), MAX_PATH) > 0)
  303. {
  304. strThemeFileName.ReleaseBuffer();
  305. strShellPath = strThemeFileName + _T("\Resources\Themes\Luna\");
  306. }
  307. }
  308. CString strColorName = systemTheme == xtpSystemThemeOlive ?
  309. _T("Homestead"): systemTheme == xtpSystemThemeSilver ? _T("Metallic") : _T("NormalColor");
  310. strShellPath = strShellPath + _T("shell\") + strColorName + _T("\shellstyle.dll");
  311. HMODULE hLib = LoadLibraryEx(strShellPath, 0, LOAD_LIBRARY_AS_DATAFILE);
  312. if (hLib)
  313. {
  314. FreeBitmaps();
  315. m_bUseBitmapGrippers = TRUE;
  316. for (int i = 0; i < 8; i++)
  317. {
  318. m_bmpGrippers[i] = (HBITMAP)LoadImage(hLib, MAKEINTRESOURCE(100 + i), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
  319. if (m_bmpGrippers[i] && m_bUseBitmapGrippers)
  320. {
  321. PremultplyAlpha(m_bmpGrippers[i]);
  322. }
  323. else m_bUseBitmapGrippers = FALSE;
  324. }
  325. FreeLibrary(hLib);
  326. }
  327. }
  328. if (!m_bUseBitmapGrippers)
  329. {
  330. CreateGripperIcon(m_hGripperSpecial, XTP_IDB_TASKPANEL_GRIPPER_SPECIAL, m_groupSpecial.clrHead.clrDark);
  331. CreateGripperIcon(m_hGripperNormal, XTP_IDB_TASKPANEL_GRIPPER, m_groupNormal.clrHead.clrDark);
  332. }
  333. }
  334. void CXTPTaskPanelPaintManager::DrawCaptionGripperSigns(CDC* pDC, CPoint pt, COLORREF clr, BOOL bExpanded)
  335. {
  336. CXTPPenDC  pen(*pDC, clr);
  337. if (bExpanded)
  338. {
  339. pDC->MoveTo(pt.x - 3, pt.y - 2); pDC->LineTo(pt.x, pt.y - 3- 2); pDC->LineTo(pt.x + 4, pt.y + 1- 2);
  340. pDC->MoveTo(pt.x - 2, pt.y - 2); pDC->LineTo(pt.x, pt.y - 2- 2); pDC->LineTo(pt.x + 3, pt.y + 1- 2);
  341. pDC->MoveTo(pt.x - 3, pt.y + 2); pDC->LineTo(pt.x, pt.y - 3 + 2); pDC->LineTo(pt.x + 4, pt.y + 1 + 2);
  342. pDC->MoveTo(pt.x - 2, pt.y + 2); pDC->LineTo(pt.x, pt.y - 2 + 2); pDC->LineTo(pt.x + 3, pt.y + 1 + 2);
  343. }
  344. else
  345. {
  346. pDC->MoveTo(pt.x - 3, pt.y - 4); pDC->LineTo(pt.x, pt.y + 3- 4); pDC->LineTo(pt.x + 4, pt.y - 1- 4);
  347. pDC->MoveTo(pt.x - 2, pt.y - 4); pDC->LineTo(pt.x, pt.y + 2- 4); pDC->LineTo(pt.x + 3, pt.y - 1- 4);
  348. pDC->MoveTo(pt.x - 3, pt.y + 0); pDC->LineTo(pt.x, pt.y + 3 + 0); pDC->LineTo(pt.x + 4, pt.y - 1 + 0);
  349. pDC->MoveTo(pt.x - 2, pt.y + 0); pDC->LineTo(pt.x, pt.y + 2 + 0); pDC->LineTo(pt.x + 3, pt.y - 1 + 0);
  350. }
  351. }
  352. CRect CXTPTaskPanelPaintManager::DrawCaptionGripperBitmap(CDC* pDC, CXTPTaskPanelGroup* pGroup, BOOL bExpanded, BOOL bHot, CRect rc)
  353. {
  354. int nTop = max(rc.top, rc.CenterPoint().y - 10);
  355. CRect rcGripper(rc.right - 3 - 20, nTop, rc.right - 3, nTop + 20);
  356. if (m_bUseBitmapGrippers)
  357. {
  358. int nIndex = pGroup->IsSpecialGroup() ? 4 : 0;
  359. nIndex += bExpanded ? 0 : 2;
  360. nIndex += bHot ? 1 : 0;
  361. CXTPCompatibleDC dcGripper(NULL, CBitmap::FromHandle(m_bmpGrippers[nIndex]));
  362. if (XTPDrawHelpers()->m_pfnAlphaBlend)
  363. {
  364. BITMAP bmpInfo;
  365. GetObject(m_bmpGrippers[nIndex], sizeof(BITMAP), &bmpInfo);
  366. BLENDFUNCTION bf = {AC_SRC_OVER, 0, 255, 1};
  367. XTPDrawHelpers()->m_pfnAlphaBlend(pDC->GetSafeHdc(), rcGripper.left, rcGripper.top, bmpInfo.bmWidth, bmpInfo.bmHeight, dcGripper, 0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, bf);
  368. }
  369. }
  370. else
  371. {
  372. HICON hIcon = pGroup->IsSpecialGroup() ? m_hGripperSpecial : m_hGripperNormal;
  373. pDC->DrawState(rcGripper.TopLeft(), CSize(19, 19), hIcon, DST_ICON, (CBrush*)NULL);
  374. XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);
  375. DrawCaptionGripperSigns(pDC, CPoint(rcGripper.CenterPoint().x - 1, rcGripper.CenterPoint().y), bHot ? pGroupColors->clrHeadTextHot : pGroupColors->clrHeadTextNormal, bExpanded);
  376. }
  377. rc.right = rcGripper.left;
  378. return rc;
  379. }
  380. int CXTPTaskPanelPaintManager::GetCaptionGripperWidth(CXTPTaskPanelGroup* pGroup, CRect rc)
  381. {
  382. if (!pGroup->IsExpandable())
  383. return 0;
  384. if (rc.Width() < 20 + 6)
  385. return 0;
  386. if (m_eGripper == xtpTaskPanelGripperBitmap)
  387. return 23;
  388. if (m_eGripper == xtpTaskPanelGripperPlain)
  389. return 23;
  390. if (m_eGripper == xtpTaskPanelGripperTriangle)
  391. return 19;
  392. return 0;
  393. }
  394. CRect CXTPTaskPanelPaintManager::DrawCaptionGripper(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  395. {
  396. if (!pGroup->IsExpandable())
  397. return rc;
  398. if (rc.Width() < 20 + 6)
  399. return rc;
  400. if (m_eGripper == xtpTaskPanelGripperBitmap)
  401. {
  402. return DrawCaptionGripperBitmap(pDC, pGroup, pGroup->IsExpanded(), pGroup->IsItemHot() , rc);
  403. }
  404. if (m_eGripper == xtpTaskPanelGripperPlain)
  405. {
  406. XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);
  407. CRect rcGripper(rc.right - 6 - 17, rc.CenterPoint().y - 8, rc.right - 6, rc.CenterPoint().y + 8);
  408. if (pGroup->IsItemHot())
  409. {
  410. pDC->Draw3dRect(rcGripper, GetXtremeColor(COLOR_3DHIGHLIGHT), GetXtremeColor(COLOR_3DSHADOW));
  411. }
  412. DrawCaptionGripperSigns(pDC, rcGripper.CenterPoint(), pGroup->IsItemHot() ? pGroupColors->clrHeadTextHot : pGroupColors->clrHeadTextNormal, pGroup->IsExpanded());
  413. rc.right = rcGripper.left;
  414. }
  415. if (m_eGripper == xtpTaskPanelGripperTriangle)
  416. {
  417. COLORREF clr = m_groupNormal.clrClientText;
  418. CPoint pt(rc.right - 6 - 8 - 5, rc.CenterPoint().y + 2);
  419. if (pGroup->IsExpanded())
  420. CXTPDrawHelpers::Triangle(pDC, CPoint(pt.x, pt.y - 2), CPoint(pt.x + 10, pt.y - 2), CPoint(pt.x + 5, pt.y + 5 - 2), clr);
  421. else
  422. CXTPDrawHelpers::Triangle(pDC, CPoint(pt.x + 3, pt.y - 5), CPoint(pt.x + 3 + 5, pt.y), CPoint(pt.x + 3, pt.y + 5), clr);
  423. rc.right = pt.x;
  424. }
  425. return rc;
  426. }
  427. COLORREF CXTPTaskPanelPaintManager::BlendColor(COLORREF clrFrom, COLORREF clrTo, int nAlpha)
  428. {
  429. return RGB(
  430. NORMCOLOR((GetRValue(clrFrom) * nAlpha + GetRValue(clrTo) * (255 - nAlpha)) / 255),
  431. NORMCOLOR((GetGValue(clrFrom) * nAlpha + GetGValue(clrTo) * (255 - nAlpha)) / 255),
  432. NORMCOLOR((GetBValue(clrFrom) * nAlpha + GetBValue(clrTo) * (255 - nAlpha)) / 255));
  433. }
  434. void CXTPTaskPanelPaintManager::SetItemsFontIndirect(LOGFONT* pLogFont, BOOL bUseStandardItemsFont /*= FALSE*/)
  435. {
  436. m_bUseStandardItemsFont = bUseStandardItemsFont;
  437. if (!pLogFont)
  438. return;
  439. m_fntIcon.DeleteObject();
  440. m_fntIconBold.DeleteObject();
  441. m_fntIconHot.DeleteObject();
  442. m_fntIconHotBold.DeleteObject();
  443. pLogFont->lfWeight = FW_NORMAL;
  444. m_fntIcon.CreateFontIndirect(pLogFont);
  445. pLogFont->lfUnderline = TRUE;
  446. m_fntIconHot.CreateFontIndirect(pLogFont);
  447. pLogFont->lfUnderline = FALSE;
  448. pLogFont->lfWeight = FW_BOLD;
  449. m_fntIconBold.CreateFontIndirect(pLogFont);
  450. pLogFont->lfUnderline = TRUE;
  451. m_fntIconHotBold.CreateFontIndirect(pLogFont);
  452. }
  453. void CXTPTaskPanelPaintManager::SetCaptionFontIndirect(LOGFONT* pLogFont, BOOL bUseStandardCaptionFont /*= FALSE*/)
  454. {
  455. m_bUseStandardCaptionFont = bUseStandardCaptionFont;
  456. if (!pLogFont)
  457. return;
  458. m_fntCaption.DeleteObject();
  459. m_fntCaption.CreateFontIndirect(pLogFont);
  460. CWindowDC dc(CWnd::GetDesktopWindow());
  461. CXTPFontDC fnt(&dc, &m_fntCaption);
  462. m_nCaptionHeight = max(25, dc.GetTextExtent(_T(" "), 1).cy);
  463. }
  464. void CXTPTaskPanelPaintManager::RefreshMetrics()
  465. {
  466. RefreshXtremeColors();
  467. LOGFONT lfIcon;
  468. ::ZeroMemory(&lfIcon, sizeof(LOGFONT));
  469. VERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lfIcon, 0));
  470. if (m_bUseStandardItemsFont)
  471. {
  472. SetItemsFontIndirect(&lfIcon, TRUE);
  473. }
  474. if (m_bUseStandardCaptionFont)
  475. {
  476. lfIcon.lfWeight = m_bBoldCaption ? FW_BOLD : FW_NORMAL;
  477. lfIcon.lfUnderline = FALSE;
  478. SetCaptionFontIndirect(&lfIcon, TRUE);
  479. }
  480. m_bOfficeBorder = FALSE;
  481. m_groupSpecial.dHeadGradientFactor = m_groupNormal.dHeadGradientFactor = 0;
  482. m_groupSpecial.clrClientBorder.SetStandardValue(RGB(255, 255, 255));
  483. m_groupNormal.clrClientBorder.SetStandardValue(RGB(255, 255, 255));
  484. m_clrBackground.SetStandardValue(GetXtremeColor(COLOR_WINDOW), GetXtremeColor(COLOR_WINDOW));
  485. m_groupSpecial.clrHead.SetStandardValue(GetXtremeColor(COLOR_ACTIVECAPTION), GetXtremeColor(COLOR_ACTIVECAPTION));
  486. m_groupSpecial.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_ACTIVECAPTION));
  487. m_groupSpecial.clrHeadTextHot.SetStandardValue(GetXtremeColor(COLOR_CAPTIONTEXT));
  488. m_groupSpecial.clrHeadTextNormal.SetStandardValue(GetXtremeColor(COLOR_CAPTIONTEXT));
  489. m_groupSpecial.clrClient.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
  490. m_groupNormal.clrHead.SetStandardValue(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_3DFACE));
  491. m_groupNormal.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
  492. m_groupNormal.clrHeadTextHot.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  493. m_groupNormal.clrHeadTextNormal.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  494. m_groupNormal.clrClient.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
  495. m_groupSpecial.clrClientText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  496. m_groupNormal.clrClientText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  497. m_groupSpecial.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  498. m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  499. m_groupSpecial.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));
  500. m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));
  501. m_groupSpecial.clrClientLinkSelected.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  502. m_groupNormal.clrClientLinkSelected.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  503. m_bLeftRoundedCorner = m_bRightRoundedCorner = FALSE;
  504. if (m_bOfficeHighlight)
  505. {
  506. m_clrHighlightHot.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT));
  507. m_clrHighlightSelected.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_CHECKED));
  508. m_clrHighlightPressed.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED));
  509. m_clrHighlightBorder.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER));
  510. if (m_bOfficeHighlight == HIGHLIGHT_OFFICE2003)
  511. {
  512. XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();
  513. if (systemTheme != xtpSystemThemeUnknown)
  514. {
  515. m_clrHighlightHot.SetStandardValue(RGB(255, 238, 194));
  516. m_clrHighlightPressed.SetStandardValue(RGB(254, 128, 62));
  517. m_clrHighlightSelected.SetStandardValue(RGB(255, 192, 111));
  518. }
  519. switch (systemTheme)
  520. {
  521. case xtpSystemThemeBlue:
  522. case xtpSystemThemeRoyale:
  523. case xtpSystemThemeAero:
  524. m_clrHighlightBorder.SetStandardValue(RGB(0, 0, 128)); break;
  525. case xtpSystemThemeOlive:
  526. m_clrHighlightBorder.SetStandardValue(RGB(63, 93, 56)); break;
  527. case xtpSystemThemeSilver:
  528. m_clrHighlightBorder.SetStandardValue(RGB(75, 75, 111)); break;
  529. }
  530. }
  531. }
  532. else
  533. {
  534. m_clrHighlightHot.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
  535. m_clrHighlightBorder.SetStandardValue(RGB(128, 128, 128), RGB(198, 198, 198));
  536. }
  537. }
  538. void CXTPTaskPanelPaintManager::FillTaskPanel(CDC* pDC, CXTPTaskPanel* pTaskPanel)
  539. {
  540. CXTPClientRect rc(pTaskPanel);
  541. CRect rcFill(rc.left, 0, rc.right, max(rc.bottom, pTaskPanel->GetClientHeight()));
  542. XTPDrawHelpers()->GradientFill(pDC, rcFill, m_clrBackground, FALSE);
  543. }
  544. CRect CXTPTaskPanelPaintManager::MergeRect(CRect rc, CRect rcDefault)
  545. {
  546. if (rc.left == CW_USEDEFAULT) rc.left = rcDefault.left;
  547. if (rc.top == CW_USEDEFAULT) rc.top = rcDefault.top;
  548. if (rc.right == CW_USEDEFAULT) rc.right = rcDefault.right;
  549. if (rc.bottom == CW_USEDEFAULT) rc.bottom = rcDefault.bottom;
  550. return rc;
  551. }
  552. CRect CXTPTaskPanelPaintManager::GetItemIconPadding(const CXTPTaskPanelItem* pItem)
  553. {
  554. return MergeRect(const_cast<CXTPTaskPanelItem*>(pItem)->GetIconPadding(),
  555. pItem->IsGroup() ? m_rcGroupIconPadding : m_rcItemIconPadding);
  556. }
  557. CRect CXTPTaskPanelPaintManager::GetItemOuterMargins(const CXTPTaskPanelGroupItem* pItem)
  558. {
  559. return MergeRect(const_cast<CXTPTaskPanelGroupItem*>(pItem)->GetMargins(), m_rcItemOuterMargins);
  560. }
  561. CRect CXTPTaskPanelPaintManager::GetItemInnerMargins(const CXTPTaskPanelGroupItem* /*pItem*/)
  562. {
  563. return m_rcItemInnerMargins;
  564. }
  565. CRect CXTPTaskPanelPaintManager::GetGroupOuterMargins(const CXTPTaskPanelGroup* pGroup)
  566. {
  567. return MergeRect(const_cast<CXTPTaskPanelGroup*>(pGroup)->GetOuterMargins(), m_rcGroupOuterMargins);
  568. }
  569. CRect CXTPTaskPanelPaintManager::GetGroupInnerMargins(const CXTPTaskPanelGroup* pGroup)
  570. {
  571. return MergeRect(const_cast<CXTPTaskPanelGroup*>(pGroup)->GetInnerMargins(), m_rcGroupInnerMargins);
  572. }
  573. CRect CXTPTaskPanelPaintManager::GetControlMargins(const CXTPTaskPanel* pPanel)
  574. {
  575. return MergeRect(const_cast<CXTPTaskPanel*>(pPanel)->GetMargins(), m_rcControlMargins);
  576. }
  577. int CXTPTaskPanelPaintManager::GetGroupSpacing(const CXTPTaskPanel* pPanel)
  578. {
  579. return pPanel->m_nGroupSpacing == CW_USEDEFAULT ? m_nGroupSpacing : pPanel->m_nGroupSpacing;
  580. }
  581. void CXTPTaskPanelPaintManager::Rectangle(CDC* pDC, CRect rc, COLORREF clrPen, COLORREF clrBrush)
  582. {
  583. pDC->FillSolidRect(rc, clrBrush);
  584. pDC->Draw3dRect(rc, clrPen, clrPen);
  585. }
  586. void CXTPTaskPanelPaintManager::DrawGroupItemFrame(CDC* pDC, CXTPTaskPanelGroupItem* pItem, CRect rc)
  587. {
  588. if (m_bOfficeHighlight)
  589. {
  590. if (pItem->IsItemSelected() && !pItem->IsItemHot() && !pItem->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightSelected);
  591. else if (pItem->IsItemSelected() && pItem->IsItemHot() && !pItem->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightPressed);
  592. else if (pItem->IsItemHot() && pItem->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightPressed);
  593. else if (pItem->IsItemHot() || pItem->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightHot);
  594. }
  595. else
  596. {
  597. if (pItem->IsItemSelected() && (!pItem->IsItemHot() || pItem->IsItemPressed()))
  598. pDC->FillSolidRect(rc, m_clrHighlightHot);
  599. if (pItem->IsItemSelected() || (pItem->IsItemPressed() && pItem->IsItemHot()))
  600. pDC->Draw3dRect(rc, m_clrHighlightBorder.clrLight, m_clrHighlightBorder.clrDark);
  601. else if (pItem->IsItemHot() || pItem->IsItemPressed())
  602. pDC->Draw3dRect(rc, m_clrHighlightBorder.clrDark, m_clrHighlightBorder.clrLight);
  603. }
  604. }
  605. void CXTPTaskPanelPaintManager::DrawDragArrow(CDC* pDC, CXTPTaskPanelItem* pItem, CRect rc, BOOL bAfter)
  606. {
  607. if (m_bInvertDragRect)
  608. {
  609. pDC->InvertRect(rc);
  610. }
  611. else
  612. {
  613. if (!pItem->IsGroup() && pItem->GetItemGroup()->GetItemLayout() != xtpTaskItemLayoutImages)
  614. {
  615. CRect rcMargin = GetControlMargins(pItem->GetTaskPanel());
  616. rcMargin.InflateRect(GetGroupOuterMargins(pItem->GetItemGroup()));
  617. CXTPClientRect rcControl(pItem->GetTaskPanel());
  618. rc.left = rcControl.left + rcMargin.left + 2;
  619. rc.right = rcControl.right - rcMargin.right - 2;
  620. }
  621. int y = bAfter ? rc.bottom - 1 : rc.top - 1;
  622. COLORREF clr = RGB(0 /*xFF*/, 0, 0);
  623. pDC->FillSolidRect(rc.left, y, rc.Width(), 1, clr);
  624. pDC->FillSolidRect(rc.left + 0, y - 3 , 1, 7, clr);
  625. pDC->FillSolidRect(rc.left + 1, y - 2 , 1, 5, clr);
  626. pDC->FillSolidRect(rc.left + 2, y - 1 , 1, 3, clr);
  627. pDC->FillSolidRect(rc.right - 1, y - 3 , 1, 7, clr);
  628. pDC->FillSolidRect(rc.right - 2, y - 2 , 1, 5, clr);
  629. pDC->FillSolidRect(rc.right - 3, y - 1 , 1, 3, clr);
  630. }
  631. }
  632. CRect CXTPTaskPanelPaintManager::DrawGroupItem(CDC* pDC, CXTPTaskPanelGroupItem* pItem, CRect rc, BOOL bDraw)
  633. {
  634. XTPTaskPanelItemLayout itemLayout = pItem->GetItemGroup()->GetItemLayout();
  635. CRect rcItem = itemLayout == xtpTaskItemLayoutImagesWithTextBelow ? DrawGroupItemImageWithTextBelow(pDC, pItem, rc, bDraw) :
  636. itemLayout == xtpTaskItemLayoutImages ? DrawGroupItemImage(pDC, pItem, rc, bDraw) :  DrawGroupItemImageWithText(pDC, pItem, rc, bDraw);
  637. if (bDraw && pItem->IsItemDragOver() && !pItem->IsItemDragging())
  638. {
  639. DrawDragArrow(pDC, pItem, rc);
  640. }
  641. if (bDraw && pItem->GetItemGroup()->IsItemDragOver() &&
  642. pItem->GetParentItems()->GetLastVisibleItem() == pItem)
  643. {
  644. DrawDragArrow(pDC, pItem, rc, TRUE);
  645. }
  646. return rcItem;
  647. }
  648. void CXTPTaskPanelPaintManager::DrawFocusRect(CDC* pDC, CRect rc)
  649. {
  650. pDC->SetTextColor(0);
  651. pDC->SetBkColor(0xFFFFFF);
  652. pDC->DrawFocusRect(rc);
  653. }
  654. CRect CXTPTaskPanelPaintManager::DrawGroupItemImageWithText(CDC* pDC, CXTPTaskPanelGroupItem* pItem, CRect rc, BOOL bDraw)
  655. {
  656. CXTPTaskPanelGroup* pGroup = pItem->GetItemGroup();
  657. ASSERT(pGroup);
  658. if (!pGroup)
  659. return 0;
  660. XTPTaskPanelHotTrackStyle hotTrackStyle = pItem->GetTaskPanel()->GetHotTrackStyle();
  661. CSize szIcon = pGroup->GetItemIconSize();
  662. CXTPFontDC font(pDC, GetItemFont(pItem));
  663. CXTPImageManagerIcon* pImage = pItem->GetImage(szIcon.cx);
  664. BOOL bDrawIcon = pItem->GetType() != xtpTaskItemTypeControl && pImage;
  665. CRect rcInnerMargins = GetItemInnerMargins(pItem);
  666. if (bDraw)
  667. {
  668. if (hotTrackStyle == xtpTaskPanelHighlightItem)
  669. {
  670. DrawGroupItemFrame(pDC, pItem, rc);
  671. }
  672. rc.DeflateRect(rcInnerMargins.left, rcInnerMargins.top, rcInnerMargins.right, rcInnerMargins.bottom);
  673. CRect rcText(rc);
  674. if (hotTrackStyle == xtpTaskPanelHighlightItem)
  675. rcText.OffsetRect(GetHighlightOffset(pItem));
  676. CRect rcIconPadding(GetItemIconPadding(pItem));
  677. if (bDrawIcon)
  678. {
  679. if (hotTrackStyle == xtpTaskPanelHighlightImage)
  680. {
  681. CRect rcImage(rc.left - rcInnerMargins.left, rc.top - rcInnerMargins.top,
  682. rc.left + szIcon.cx + 2 + rcIconPadding.left + rcIconPadding.right,
  683. rc.top + szIcon.cy + 2 + rcIconPadding.top + rcIconPadding.bottom);
  684. DrawGroupItemFrame(pDC, pItem, rcImage);
  685. }
  686. CPoint ptIcon(rc.TopLeft());
  687. if (hotTrackStyle == xtpTaskPanelHighlightImage || hotTrackStyle == xtpTaskPanelHighlightItem)
  688. ptIcon.Offset(GetHighlightOffset(pItem));
  689. ptIcon.Offset(rcIconPadding.left, rcIconPadding.top);
  690. DrawItemImage(pDC, pItem, ptIcon, pImage, szIcon);
  691. }
  692. if (bDrawIcon || pItem->GetType() == xtpTaskItemTypeLink)
  693. {
  694. rcText.left += szIcon.cx + 7 + rcIconPadding.left + rcIconPadding.right;
  695. }
  696. if (rcText.Width() > 0)
  697. {
  698. DrawItemCaption(pDC, pItem, rcText, m_nItemTextFormat | DT_LEFT);
  699. }
  700. if (pItem->IsItemFocused() && pItem->GetTaskPanel()->IsDrawFocusRect())
  701. {
  702. DrawFocusRect(pDC, rc);
  703. }
  704. return 0;
  705. }
  706. else
  707. {
  708. CRect rcText(rc);
  709. rcText.bottom = rcText.top;
  710. rcText.DeflateRect(rcInnerMargins.left, 0, rcInnerMargins.right, 0);
  711. CRect rcIconPadding(GetItemIconPadding(pItem));
  712. if (pItem->GetType() == xtpTaskItemTypeLink || bDrawIcon)
  713. {
  714. rcText.left += szIcon.cx + 7 + rcIconPadding.left + rcIconPadding.right;
  715. }
  716. if (rcText.Width() > 0)
  717. {
  718. CSize szText = pItem->GetCaptionTextSize(pDC, rcText, (m_nItemTextFormat | DT_LEFT) & ~(DT_VCENTER | DT_CENTER));
  719. rcText.bottom = rcText.top + szText.cy;
  720. rcText.right = rcText.left + szText.cx;
  721. }
  722. int nImageHeight = bDrawIcon ? szIcon.cy + rcIconPadding.top + rcIconPadding.bottom : 0;
  723. return CRect(rc.left, rc.top, hotTrackStyle == xtpTaskPanelHighlightItem ? rc.right : min(rc.right, (rcText.right + rcInnerMargins.right)),
  724. rc.top + max(nImageHeight, rcText.Height()) + rcInnerMargins.top + rcInnerMargins.bottom);
  725. }
  726. }
  727. CRect CXTPTaskPanelPaintManager::DrawGroupItemImageWithTextBelow(CDC* pDC, CXTPTaskPanelGroupItem* pItem, CRect rc, BOOL bDraw)
  728. {
  729. CXTPTaskPanelGroup* pGroup = pItem->GetItemGroup();
  730. ASSERT(pGroup);
  731. if (!pGroup)
  732. return 0;
  733. XTPTaskPanelHotTrackStyle hotTrackStyle = pItem->GetTaskPanel()->GetHotTrackStyle();
  734. CSize szIcon = pGroup->GetItemIconSize();
  735. CXTPFontDC font(pDC, GetItemFont(pItem));
  736. CXTPImageManagerIcon* pImage = pItem->GetImage(szIcon.cx);
  737. BOOL bDrawIcon = pItem->GetType() == xtpTaskItemTypeLink && pImage;
  738. CRect rcInnerMargins = GetItemInnerMargins(pItem);
  739. if (bDraw)
  740. {
  741. if (hotTrackStyle == xtpTaskPanelHighlightItem)
  742. {
  743. DrawGroupItemFrame(pDC, pItem, rc);
  744. }
  745. rc.DeflateRect(rcInnerMargins.left, rcInnerMargins.top, rcInnerMargins.right, rcInnerMargins.bottom);
  746. CRect rcText(rc);
  747. if (hotTrackStyle == xtpTaskPanelHighlightItem)
  748. rcText.OffsetRect(GetHighlightOffset(pItem));
  749. if (pItem->GetType() == xtpTaskItemTypeLink)
  750. {
  751. if (bDrawIcon)
  752. {
  753. CPoint ptIcon((rc.right + rc.left + 1 - szIcon.cx) /2, rc.top);
  754. if (hotTrackStyle == xtpTaskPanelHighlightImage)
  755. {
  756. CRect rcImage(ptIcon.x - 2, rc.top - 2, ptIcon.x + szIcon.cx + 2, rc.top + szIcon.cy + 2);
  757. DrawGroupItemFrame(pDC, pItem, rcImage);
  758. }
  759. if (hotTrackStyle == xtpTaskPanelHighlightImage || hotTrackStyle == xtpTaskPanelHighlightItem)
  760. ptIcon.Offset(GetHighlightOffset(pItem));
  761. DrawItemImage(pDC, pItem, ptIcon, pImage, szIcon);
  762. }
  763. rcText.top += szIcon.cy + 3;
  764. }
  765. if (rcText.Width() > 0)
  766. {
  767. DrawItemCaption(pDC, pItem, rcText, m_nItemTextFormat | DT_CENTER);
  768. }
  769. if (pItem->IsItemFocused() && pItem->GetTaskPanel()->IsDrawFocusRect())
  770. {
  771. DrawFocusRect(pDC, rc);
  772. }
  773. return 0;
  774. }
  775. else
  776. {
  777. CRect rcText(rc);
  778. rcText.bottom = rcText.top;
  779. rcText.DeflateRect(rcInnerMargins.left, 0, rcInnerMargins.right, 0);
  780. if (rcText.Width() > 0)
  781. {
  782. CSize szText = pItem->GetCaptionTextSize(pDC, rcText, m_nItemTextFormat | DT_LEFT);
  783. rcText.bottom = rcText.top + szText.cy;
  784. rcText.right = rcText.left + szText.cx;
  785. }
  786. int nHeight = rcText.Height() + (bDrawIcon ? (szIcon.cy + 3) : 0);
  787. int nWidth = max(bDrawIcon ? (szIcon.cx + 4) : 0, rcText.Width()) + rcInnerMargins.right + + rcInnerMargins.left;
  788. nWidth = min(nWidth, rc.Width());
  789. if (hotTrackStyle != xtpTaskPanelHighlightItem)
  790. return CRect(rc.CenterPoint().x - nWidth + nWidth /2, rc.top, rc.CenterPoint().x + nWidth /2, rc.top + nHeight + rcInnerMargins.top + rcInnerMargins.bottom);
  791. return CRect(rc.left, rc.top, rc.right, rc.top + nHeight + rcInnerMargins.top + rcInnerMargins.bottom);
  792. }
  793. }
  794. CRect CXTPTaskPanelPaintManager::DrawGroupItemImage(CDC* pDC, CXTPTaskPanelGroupItem* pItem, CRect rc, BOOL bDraw)
  795. {
  796. CXTPTaskPanelGroup* pGroup = pItem->GetItemGroup();
  797. ASSERT(pGroup);
  798. if (!pGroup)
  799. return 0;
  800. XTPTaskPanelHotTrackStyle hotTrackStyle = pItem->GetTaskPanel()->GetHotTrackStyle();
  801. CSize szIcon = pGroup->GetItemIconSize();
  802. CXTPImageManagerIcon* pImage = pItem->GetImage(szIcon.cx);
  803. CRect rcInnerMargins = GetItemInnerMargins(pItem);
  804. BOOL bDrawIcon = pImage != NULL;
  805. if (bDraw)
  806. {
  807. CPoint ptIcon(rc.left + m_rcImageLayoutIconPadding.left, rc.top + m_rcImageLayoutIconPadding.top);
  808. if (hotTrackStyle != xtpTaskPanelHighlightNone)
  809. {
  810. DrawGroupItemFrame(pDC, pItem, rc);
  811. ptIcon.Offset(GetHighlightOffset(pItem));
  812. }
  813. rc.DeflateRect(rcInnerMargins.left, rcInnerMargins.top, rcInnerMargins.right, rcInnerMargins.bottom);
  814. if (bDrawIcon)
  815. {
  816. DrawItemImage(pDC, pItem, ptIcon, pImage, szIcon);
  817. }
  818. if (pItem->IsItemFocused() && pItem->GetTaskPanel()->IsDrawFocusRect())
  819. {
  820. DrawFocusRect(pDC, rc);
  821. }
  822. return 0;
  823. }
  824. else
  825. {
  826. int nHeight = szIcon.cy + rcInnerMargins.top + rcInnerMargins.bottom;
  827. int nWidth = szIcon.cx + rcInnerMargins.right + rcInnerMargins.left;
  828. return CRect(rc.CenterPoint().x - nWidth /2, rc.top, rc.CenterPoint().x - nWidth /2 + nWidth, rc.top + nHeight);
  829. }
  830. }
  831. void CXTPTaskPanelPaintManager::DrawGroupClientItems(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  832. {
  833. int nOffset = rc.top - pGroup->GetScrollOffsetPos();
  834. for (int i = pGroup->GetOffsetItem(); i < pGroup->GetItemCount(); i++)
  835. {
  836. CXTPTaskPanelGroupItem* pItem = pGroup->GetAt(i);
  837. if (!pItem->IsVisible())
  838. continue;
  839. CRect rcItem = pItem->GetItemRect();
  840. rcItem.OffsetRect(0, nOffset);
  841. pItem->OnDrawItem(pDC, rcItem);
  842. }
  843. }
  844. void CXTPTaskPanelPaintManager::FillGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  845. {
  846. XTPDrawHelpers()->GradientFill(pDC, rc, GetGroupColors(pGroup)->clrClient, FALSE);
  847. }
  848. void CXTPTaskPanelPaintManager::DrawGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  849. {
  850. XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);
  851. CXTPPenDC pen(*pDC, pGroupColors->clrClientBorder);
  852. pDC->MoveTo(rc.TopLeft());
  853. pDC->LineTo(rc.left, rc.bottom - 1);
  854. if (m_bOfficeBorder) pDC->LineTo(rc.right, rc.bottom - 1); else pDC->LineTo(rc.right - 1, rc.bottom - 1);
  855. if (!m_bOfficeBorder) pDC->LineTo(rc.right - 1, rc.top - 1); else pDC->MoveTo(rc.right - 1, rc.top);
  856. if (m_bOfficeBorder) pDC->LineTo(rc.TopLeft());
  857. DrawGroupClientItems(pDC, pGroup, rc);
  858. }
  859. void CXTPTaskPanelPaintManager::DrawGroupClient(CDC* pDC, CXTPTaskPanelGroup* pGroup)
  860. {
  861. CRect rc = pGroup->GetClientRect();
  862. if (rc.IsRectEmpty())
  863. return;
  864. int nExpandedClientHeight = pGroup->GetExpandedClientHeight();
  865. int nOffset = pGroup->IsExpanding() ? nExpandedClientHeight - rc.Height() : 0;
  866. CRect rcExpaded(rc);
  867. if (nOffset)
  868. rcExpaded.bottom = rcExpaded.top + nExpandedClientHeight;
  869. CDC dc;
  870. dc.CreateCompatibleDC(pDC);
  871. CBitmap bmp;
  872. bmp.CreateCompatibleBitmap(pDC, rc.right + 1, rcExpaded.Height());
  873. CGdiObject* pOldBitmap = dc.SelectObject(&bmp);
  874. dc.SetWindowOrg(0, rc.top);
  875. int nAlpha = pGroup->IsExpanding() ? (255 * rc.Height()) / max(1, nExpandedClientHeight) : 255;
  876. if (GetGroupColors(pGroup)->clrClient == COLORREF_TRANSPARENT)
  877. {
  878. dc.BitBlt(rc.left, rc.top + nOffset, rc.Width(), rc.Height(), pDC, rc.left, rc.top, SRCCOPY);
  879. }
  880. else
  881. {
  882. FillGroupClientFace(&dc, pGroup, rcExpaded);
  883. }
  884. pGroup->OnFillClient(&dc, rc);
  885. if (pGroup->IsExpanded() || pGroup->IsExpanding())
  886. {
  887. DrawGroupClientFace(&dc, pGroup, rcExpaded);
  888. }
  889. dc.SetWindowOrg(0, 0);
  890. if (nAlpha != 255)
  891. {
  892. if (!XTPDrawHelpers()->m_pfnAlphaBlend || (XTPDrawHelpers()->IsContextRTL(pDC) && XTPSystemVersion()->IsWin9x()))
  893. {
  894. pDC->BitBlt(rc.left, rc.top, rc.Width(), rcExpaded.Height() - nOffset, &dc, rc.left, nOffset, SRCCOPY);
  895. }
  896. else
  897. {
  898. BLENDFUNCTION bf = {AC_SRC_OVER, 0, (BYTE)nAlpha, 0};
  899. XTPDrawHelpers()->m_pfnAlphaBlend(pDC->GetSafeHdc(), rc.left, rc.top, rc.Width(), rc.Height(), dc, rc.left, nOffset, rc.Width(), rcExpaded.Height() - nOffset, bf);
  900. }
  901. }
  902. else
  903. {
  904. pDC->BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &dc, rc.left, nOffset, SRCCOPY);
  905. }
  906. dc.SelectObject(pOldBitmap);
  907. }
  908. void CXTPTaskPanelPaintManager::DrawItemCaption(CDC* pDC, CXTPTaskPanelItem* pItem, CRect rcText, UINT nFormat)
  909. {
  910. if (!pItem->IsGroup())
  911. {
  912. XTPTaskPanelHotTrackStyle hotTrackStyle = pItem->GetTaskPanel()->GetHotTrackStyle();
  913. CXTPTaskPanelGroup* pGroup = pItem->GetItemGroup();
  914. XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);
  915. pDC->SetBkMode(TRANSPARENT);
  916. if (m_bEmbossedDisabledText && !pItem->GetEnabled())
  917. {
  918. pDC->SetTextColor(GetXtremeColor(COLOR_3DHIGHLIGHT));
  919. pItem->DrawCaptionText(pDC, rcText + CPoint(1, 1), nFormat);
  920. }
  921. COLORREF clrNormal = ((CXTPTaskPanelGroupItem*)pItem)->GetTextColor();
  922. if (clrNormal == COLORREF_NULL)
  923. clrNormal = pItem->GetType() == xtpTaskItemTypeLink ? pGroupColors->clrClientLink : pGroupColors->clrClientText;
  924. pDC->SetTextColor(!pItem->GetEnabled() ? GetXtremeColor(COLOR_GRAYTEXT) : pItem->GetType() == xtpTaskItemTypeLink ?
  925. ((hotTrackStyle == xtpTaskPanelHighlightText) && pItem->IsItemHot() ? pGroupColors->clrClientLinkHot :
  926. (hotTrackStyle == xtpTaskPanelHighlightItem) && (((CXTPTaskPanelGroupItem*)pItem)->IsItemSelected() || (pItem->IsItemHot())) ? pGroupColors->clrClientLinkSelected :
  927. clrNormal) : clrNormal);
  928. }
  929. pItem->DrawCaptionText(pDC, rcText, nFormat);
  930. pItem->SetTextRect(pDC, rcText, nFormat);
  931. }
  932. void CXTPTaskPanelPaintManager::DrawItemImage(CDC* pDC, CXTPTaskPanelItem* pItem, CPoint ptIcon, CXTPImageManagerIcon* pImage, CSize szIcon)
  933. {
  934. BOOL bHighlight = pItem->IsItemHot() || pItem->IsItemPressed();
  935. BOOL bChecked = (!pItem->IsGroup() && ((CXTPTaskPanelGroupItem*)pItem)->IsItemSelected());
  936. pImage->Draw(pDC, ptIcon, !pItem->GetEnabled() ? pImage->GetDisabledIcon(): bHighlight ? pImage->GetHotIcon(): bChecked ? pImage->GetCheckedIcon() : pImage->GetIcon(), szIcon);
  937. }
  938. int CXTPTaskPanelPaintManager::DrawGroupCaption(CDC* pDC, CXTPTaskPanelGroup* pGroup, BOOL bDraw)
  939. {
  940. if (bDraw)
  941. {
  942. CRect rc = pGroup->GetCaptionRect();
  943. if (rc.IsRectEmpty())
  944. return 0;
  945. XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);
  946. if (pGroup->IsCaptionVisible())
  947. {
  948. if (m_bLeftRoundedCorner)
  949. {
  950. pDC->ExcludeClipRect(rc.left, rc.top, rc.left + 2, rc.top + 1);
  951. pDC->ExcludeClipRect(rc.left, rc.top + 1, rc.left + 1, rc.top + 2);
  952. }
  953. if (m_bRightRoundedCorner)
  954. {
  955. pDC->ExcludeClipRect(rc.right, rc.top, rc.right - 2, rc.top + 1);
  956. pDC->ExcludeClipRect(rc.right, rc.top + 1, rc.right - 1, rc.top + 2);
  957. }
  958. pDC->FillSolidRect(rc, pGroupColors->clrHead.clrLight);
  959. CRect rcGradient(rc);
  960. rcGradient.left += int (rc.Width() * pGroupColors->dHeadGradientFactor);
  961. XTPDrawHelpers()->GradientFill(pDC, rcGradient, pGroupColors->clrHead, TRUE);
  962. if (pGroup->IsItemFocused() && pGroup->GetTaskPanel()->IsDrawFocusRect())
  963. {
  964. CRect rcFocus(rc);
  965. rcFocus.DeflateRect(2, 2);
  966. DrawFocusRect(pDC, rcFocus);
  967. }
  968. CXTPFontDC fnt(pDC, GetItemFont(pGroup));
  969. CRect rcText = DrawCaptionGripper(pDC, pGroup, rc);
  970. CSize szIcon = pGroup->GetTaskPanel()->GetGroupIconSize();
  971. CXTPImageManagerIcon* pImage = pGroup->GetImage(szIcon.cx);
  972. if (rcText.Width() > szIcon.cx && pImage)
  973. {
  974. szIcon.cy = pImage->GetHeight() * szIcon.cx / pImage->GetWidth();
  975. CRect rcIconPadding(GetItemIconPadding(pGroup));
  976. CPoint ptIcon(rcText.left + rcIconPadding.left,
  977. min(rcText.CenterPoint().y + szIcon.cy/2, rcText.bottom) - szIcon.cy - rcIconPadding.bottom + rcIconPadding.top);
  978. DrawItemImage(pDC, pGroup, ptIcon, pImage, szIcon);
  979. rcText.left += szIcon.cx - 12 + rcIconPadding.right + rcIconPadding.left;
  980. }
  981. rcText.left += 13;
  982. rcText.bottom += 2;
  983. pDC->SetBkMode(TRANSPARENT);
  984. pDC->SetTextColor(!pGroup->GetEnabled() ? GetXtremeColor(COLOR_GRAYTEXT) :
  985. pGroup->IsItemHot() ? pGroupColors->clrHeadTextHot : pGroupColors->clrHeadTextNormal);
  986. DrawItemCaption(pDC, pGroup, rcText, m_nCaptionTextFormat);
  987. }
  988. else
  989. {
  990. pDC->FillSolidRect(rc, pGroupColors->clrClientBorder);
  991. }
  992. if (pGroup->IsItemDragOver() && !(pGroup->IsExpanded() && pGroup->GetItems()->GetFirstVisibleItem() != NULL))
  993. {
  994. DrawDragArrow(pDC, pGroup, rc, TRUE);
  995. }
  996. }
  997. return pGroup->IsCaptionVisible() ? m_nCaptionHeight: m_bOfficeBorder ? 0 : 1;
  998. }
  999. //////////////////////////////////////////////////////////////////////////
  1000. /// CXTPTaskPanelExplorerTheme
  1001. CXTPTaskPanelExplorerTheme::CXTPTaskPanelExplorerTheme()
  1002. {
  1003. m_bOfficeHighlight = HIGHLIGHT_OFFICE2003;
  1004. m_eGripper = xtpTaskPanelGripperBitmap;
  1005. m_bExplorerTheme = FALSE;
  1006. }
  1007. void CXTPTaskPanelExplorerTheme::RefreshMetrics()
  1008. {
  1009. CXTPTaskPanelPaintManager::RefreshMetrics();
  1010. XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();
  1011. m_bExplorerTheme = FALSE;
  1012. if (!m_bEmulateEplorerTheme && (systemTheme == xtpSystemThemeUnknown))
  1013. {
  1014. m_eGripper = xtpTaskPanelGripperPlain;
  1015. return ;
  1016. }
  1017. m_bExplorerTheme = TRUE;
  1018. m_bRightRoundedCorner = m_bLeftRoundedCorner = TRUE;
  1019. m_groupNormal.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
  1020. m_groupSpecial.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
  1021. switch (systemTheme)
  1022. {
  1023. case xtpSystemThemeBlue:
  1024. {
  1025. m_clrBackground.SetStandardValue(RGB(123, 162, 231), RGB(99, 117, 214));
  1026. m_groupSpecial.clrHead.SetStandardValue(RGB(0, 73, 181), RGB(41, 93, 206));
  1027. m_groupSpecial.clrHeadTextNormal.SetStandardValue(RGB(255, 255, 255));
  1028. m_groupSpecial.clrHeadTextHot.SetStandardValue(RGB(66, 142, 255));
  1029. m_groupSpecial.clrClient.SetStandardValue(RGB(239, 243, 255));
  1030. m_groupNormal.clrHead.SetStandardValue(RGB(255, 255, 255), RGB(198, 211, 247));
  1031. m_groupNormal.dHeadGradientFactor = 0.5;
  1032. m_groupNormal.clrHeadTextNormal.SetStandardValue(RGB(33, 93, 198));
  1033. m_groupNormal.clrHeadTextHot.SetStandardValue(RGB(66, 142, 255));
  1034. m_groupNormal.clrClient.SetStandardValue(RGB(214, 223, 247));
  1035. m_groupSpecial.clrClientLink.SetStandardValue(RGB(33, 93, 198));
  1036. m_groupNormal.clrClientLink.SetStandardValue(RGB(33, 93, 198));
  1037. m_groupSpecial.clrClientLinkHot.SetStandardValue(RGB(66, 142, 255));
  1038. m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(66, 142, 255));
  1039. break;
  1040. }
  1041. case xtpSystemThemeOlive:
  1042. {
  1043. m_clrBackground.SetStandardValue(RGB(204, 217, 173), RGB(165, 189, 132));
  1044. m_groupSpecial.clrHead.SetStandardValue(RGB(119, 140, 64), RGB(150, 168, 103));
  1045. m_groupSpecial.clrHeadTextNormal.SetStandardValue(RGB(255, 255, 255));
  1046. m_groupSpecial.clrHeadTextHot.SetStandardValue(RGB(224, 231, 184));
  1047. m_groupSpecial.clrClient.SetStandardValue(RGB(246, 246, 236));
  1048. m_groupNormal.clrHead.SetStandardValue(RGB(255, 252, 236), RGB(224, 231, 184));
  1049. m_groupNormal.clrHeadTextNormal.SetStandardValue(RGB(86, 102, 45));
  1050. m_groupNormal.clrHeadTextHot.SetStandardValue(RGB(114, 146, 29));
  1051. m_groupNormal.clrClient.SetStandardValue(RGB(246, 246, 236));
  1052. m_groupSpecial.clrClientLink.SetStandardValue(RGB(86, 102, 45));
  1053. m_groupNormal.clrClientLink.SetStandardValue(RGB(86, 102, 45));
  1054. m_groupSpecial.clrClientLinkHot.SetStandardValue(RGB(114, 146, 29));
  1055. m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(114, 146, 29));
  1056. break;
  1057. }
  1058. case xtpSystemThemeSilver:
  1059. {
  1060. m_clrBackground.SetStandardValue(RGB(196, 200, 212), RGB(177, 179, 200));
  1061. m_groupSpecial.clrHead.SetStandardValue(RGB(119, 119, 146), RGB(180, 182, 199));
  1062. m_groupSpecial.clrHeadTextNormal.SetStandardValue(RGB(255, 255, 255));
  1063. m_groupSpecial.clrHeadTextHot.SetStandardValue(RGB(230, 230, 230));
  1064. m_groupSpecial.clrClient.SetStandardValue(RGB(240, 241, 245));
  1065. m_groupNormal.clrHead.SetStandardValue(RGB(255, 255, 255), RGB(214, 215, 224));
  1066. m_groupNormal.clrHeadTextNormal.SetStandardValue(RGB(63, 61, 61));
  1067. m_groupNormal.clrHeadTextHot.SetStandardValue(RGB(126, 124, 124));
  1068. m_groupNormal.clrClient.SetStandardValue(RGB(240, 241, 245));
  1069. m_groupSpecial.clrClientLink.SetStandardValue(RGB(63, 61, 61));
  1070. m_groupNormal.clrClientLink.SetStandardValue(RGB(63, 61, 61));
  1071. m_groupSpecial.clrClientLinkHot.SetStandardValue(RGB(126, 124, 124));
  1072. m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(126, 124, 124));
  1073. break;
  1074. }
  1075. default:
  1076. {
  1077. m_clrBackground.SetStandardValue(
  1078. BlendColor(GetXtremeColor(COLOR_INACTIVECAPTION), GetXtremeColor(COLOR_WINDOW), 128),
  1079. BlendColor(GetXtremeColor(COLOR_ACTIVECAPTION), GetXtremeColor(COLOR_WINDOW), 192));
  1080. COLORREF clrClient = BlendColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 24);
  1081. m_groupSpecial.clrHead.SetStandardValue(GetXtremeColor(COLOR_ACTIVECAPTION), BlendColor(GetXtremeColor(COLOR_ACTIVECAPTION), GetXtremeColor(COLOR_WINDOW), 92));
  1082. m_groupSpecial.clrHeadTextNormal.SetStandardValue(GetXtremeColor(COLOR_CAPTIONTEXT));
  1083. m_groupSpecial.clrHeadTextHot.SetStandardValue(BlendColor(GetXtremeColor(COLOR_3DHIGHLIGHT), GetXtremeColor(COLOR_HIGHLIGHT), 128));
  1084. m_groupSpecial.clrClient.SetStandardValue(clrClient);
  1085. m_groupNormal.clrHead.SetStandardValue(GetXtremeColor(COLOR_WINDOW), BlendColor(GetXtremeColor(COLOR_INACTIVECAPTION), GetXtremeColor(COLOR_WINDOW), 92));
  1086. m_groupNormal.clrHeadTextNormal.SetStandardValue(BlendColor(GetXtremeColor(COLOR_HIGHLIGHT), GetXtremeColor(COLOR_BTNTEXT), 192));
  1087. m_groupNormal.clrHeadTextHot.SetStandardValue(BlendColor(GetXtremeColor(COLOR_HIGHLIGHT), GetXtremeColor(COLOR_BTNTEXT), 240));
  1088. m_groupNormal.clrClient.SetStandardValue(BlendColor(clrClient, GetXtremeColor(COLOR_ACTIVECAPTION), 230));
  1089. m_groupSpecial.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  1090. m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  1091. m_groupSpecial.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));
  1092. m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));
  1093. }
  1094. }
  1095. CreateGripperBitmaps();
  1096. }
  1097. //////////////////////////////////////////////////////////////////////////
  1098. /// CXTPTaskPanelOffice2003Theme
  1099. CXTPTaskPanelOffice2003Theme::CXTPTaskPanelOffice2003Theme()
  1100. {
  1101. m_bOfficeHighlight = HIGHLIGHT_OFFICE2003;
  1102. m_rcControlMargins = CRect(8, 8, 0, 8);
  1103. m_nGroupSpacing = 15;
  1104. m_eGripper = xtpTaskPanelGripperNone;
  1105. }
  1106. void CXTPTaskPanelOffice2003Theme::RefreshMetrics()
  1107. {
  1108. CXTPTaskPanelPaintManager::RefreshMetrics();
  1109. if (m_bUseStandardCaptionFont)
  1110. {
  1111. m_fntCaption.DeleteObject();
  1112. LOGFONT lfIcon;
  1113. VERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lfIcon, 0));
  1114. lfIcon.lfUnderline = FALSE;
  1115. lfIcon.lfWeight = FW_BOLD;
  1116. lfIcon.lfHeight = 18;
  1117. CString strOfficeFont(_T("Tahoma"));
  1118. if (CXTPDrawHelpers::FontExists(strOfficeFont))
  1119. {
  1120. STRCPY_S(lfIcon.lfFaceName, LF_FACESIZE, strOfficeFont);
  1121. }
  1122. m_fntCaption.CreateFontIndirect(&lfIcon);
  1123. CWindowDC dc(CWnd::GetDesktopWindow());
  1124. CXTPFontDC fnt(&dc, &m_fntCaption);
  1125. m_nCaptionHeight = max(20, dc.GetTextExtent(_T(" "), 1).cy);
  1126. }
  1127. XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();
  1128. switch (systemTheme)
  1129. {
  1130. case xtpSystemThemeBlue:
  1131. case xtpSystemThemeRoyale:
  1132. case xtpSystemThemeAero:
  1133. m_clrBackground.SetStandardValue(RGB(221, 236, 254), RGB(74, 122, 201));
  1134. m_groupNormal.clrHead.SetStandardValue(RGB(196, 219, 249), RGB(101, 143, 224));
  1135. m_groupNormal.clrHeadTextHot.SetStandardValue(RGB(0, 45, 134));
  1136. m_groupNormal.clrHeadTextNormal.SetStandardValue(RGB(0, 45, 134));
  1137. m_groupNormal.clrClient.SetStandardValue(RGB(221, 236, 254));
  1138. m_groupNormal.clrClientLink.SetStandardValue(RGB(0, 61, 178));
  1139. m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(0, 61, 178));
  1140. break;
  1141. case xtpSystemThemeOlive:
  1142. m_clrBackground.SetStandardValue(RGB(243, 242, 231), RGB(190, 198, 152));
  1143. m_groupNormal.clrHead.SetStandardValue(RGB(210, 223, 174), RGB(161, 176, 128));
  1144. m_groupNormal.clrHeadTextHot.SetStandardValue(RGB(90, 107, 70));
  1145. m_groupNormal.clrHeadTextNormal.SetStandardValue(RGB(90, 107, 70));
  1146. m_groupNormal.clrClient.SetStandardValue(RGB(243, 242, 231));
  1147. m_groupNormal.clrClientLink.SetStandardValue(RGB(0, 61, 178));
  1148. m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(0, 61, 178));
  1149. break;
  1150. case xtpSystemThemeSilver:
  1151. m_clrBackground.SetStandardValue(RGB(238, 238, 244), RGB(177, 176, 195));
  1152. m_groupNormal.clrHead.SetStandardValue(RGB(207, 207, 222), RGB(169, 168, 191));
  1153. m_groupNormal.clrHeadTextHot.SetStandardValue(RGB(92, 91, 121));
  1154. m_groupNormal.clrHeadTextNormal.SetStandardValue(RGB(92, 91, 121));
  1155. m_groupNormal.clrClient.SetStandardValue(RGB(238, 238, 244));
  1156. m_groupNormal.clrClientLink.SetStandardValue(RGB(0, 61, 178));
  1157. m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(0, 61, 178));
  1158. break;
  1159. default:
  1160. m_clrBackground.SetStandardValue(XTPColorManager()->LightColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 50), GetXtremeColor(COLOR_3DFACE));
  1161. m_groupNormal.clrHead.SetStandardValue(XTPColorManager()->LightColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 39),
  1162. XTPColorManager()->LightColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 70));
  1163. m_groupNormal.clrHeadTextHot.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  1164. m_groupNormal.clrHeadTextNormal.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  1165. m_groupNormal.clrClient.SetStandardValue(XTPColorManager()->LightColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 49));
  1166. m_groupNormal.clrClientLink.SetStandardValue(RGB(0, 0, 0xFF));
  1167. m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(0, 0, 0xFF));
  1168. }
  1169. m_groupNormal.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
  1170. m_groupSpecial = m_groupNormal;
  1171. m_bLeftRoundedCorner = TRUE;
  1172. m_bRightRoundedCorner = FALSE;
  1173. m_bOfficeBorder = TRUE;
  1174. }
  1175. //////////////////////////////////////////////////////////////////////////
  1176. /// CXTPTaskPanelPaintManagerPlain
  1177. CXTPTaskPanelPaintManagerPlain::CXTPTaskPanelPaintManagerPlain()
  1178. {
  1179. m_bRoundedFrame = TRUE;
  1180. m_bOfficeCaption = FALSE;
  1181. m_nCaptionTextFormat = DT_WORDBREAK | DT_LEFT | DT_NOPREFIX;
  1182. m_rcGroupIconPadding.SetRect(0, 0, 3, 0);
  1183. m_eGripper = xtpTaskPanelGripperTriangle;
  1184. }
  1185. void CXTPTaskPanelPaintManagerPlain::RefreshMetrics()
  1186. {
  1187. CXTPTaskPanelPaintManager::RefreshMetrics();
  1188. m_clrBackground.SetStandardValue(GetXtremeColor(COLOR_BACKGROUND), GetXtremeColor(COLOR_BACKGROUND));
  1189. m_groupNormal.clrClient.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
  1190. m_groupNormal.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  1191. m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  1192. m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));
  1193. m_groupSpecial = m_groupNormal;
  1194. }
  1195. void CXTPTaskPanelPaintManagerPlain::FillGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  1196. {
  1197. pDC->FillSolidRect(rc, GetGroupColors(pGroup)->clrClient);
  1198. }
  1199. void CXTPTaskPanelPaintManagerPlain::DrawGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  1200. {
  1201. DrawGroupClientItems(pDC, pGroup, rc);
  1202. }
  1203. void CXTPTaskPanelPaintManagerPlain::FillTaskPanel(CDC* pDC, CXTPTaskPanel* pTaskPanel)
  1204. {
  1205. CXTPClientRect rc(pTaskPanel);
  1206. CRect rcFill(rc.left, 0, rc.right, max(rc.bottom, pTaskPanel->GetClientHeight()));
  1207. XTPDrawHelpers()->GradientFill(pDC, rcFill, m_clrBackground, FALSE);
  1208. CXTPTaskPanelItems* pItems = pTaskPanel->GetGroups();
  1209. if (pItems->GetFirstVisibleItem() == NULL)
  1210. return;
  1211. if (m_bRoundedFrame)
  1212. {
  1213. CRect rcFace (((CXTPTaskPanelGroup*)pItems->GetFirstVisibleItem())->GetCaptionRect());
  1214. rcFace.bottom = ((CXTPTaskPanelGroup*)pItems->GetLastVisibleItem())->GetClientRect().bottom;
  1215. rcFace.InflateRect(1, 3, 1, 8);
  1216. CXTPPenDC pen(*pDC, m_groupNormal.clrClientBorder);
  1217. CXTPBrushDC brush(*pDC, m_groupNormal.clrClient);
  1218. pDC->RoundRect(rcFace.left, rcFace.top, rcFace.right, rcFace.bottom, 10, 10);
  1219. }
  1220. }
  1221. int CXTPTaskPanelPaintManagerPlain::DrawGroupCaption(CDC* pDC, CXTPTaskPanelGroup* pGroup, BOOL bDraw)
  1222. {
  1223. CXTPFontDC fnt(pDC, GetItemFont(pGroup));
  1224. if (bDraw)
  1225. {
  1226. CRect rc = pGroup->GetCaptionRect();
  1227. if (rc.IsRectEmpty())
  1228. return 0;
  1229. XTP_TASKPANEL_GROUPCOLORS& groupColors = m_groupNormal;
  1230. if (pGroup->IsCaptionVisible())
  1231. {
  1232. //CRect rcText(rc);
  1233. CRect rcText = DrawCaptionGripper(pDC, pGroup, rc);
  1234. if (!m_bOfficeCaption)
  1235. rcText.DeflateRect(13, 5, 13, 0);
  1236. CSize szIcon = pGroup->GetTaskPanel()->GetGroupIconSize();
  1237. CXTPImageManagerIcon* pImage = pGroup->GetImage(szIcon.cx);
  1238. if (rcText.Width() > szIcon.cx && pImage)
  1239. {
  1240. szIcon.cy = pImage->GetHeight() * szIcon.cx / pImage->GetWidth();
  1241. CRect rcIconPadding(GetItemIconPadding(pGroup));
  1242. CPoint ptIcon(rcText.left + rcIconPadding.left,
  1243. min(rcText.CenterPoint().y + szIcon.cy/2, rcText.bottom) - szIcon.cy - rcIconPadding.bottom + rcIconPadding.top);
  1244. DrawItemImage(pDC, pGroup, ptIcon, pImage, szIcon);
  1245. rcText.left += szIcon.cx + rcIconPadding.right + rcIconPadding.left;
  1246. }
  1247. pDC->SetBkMode(TRANSPARENT);
  1248. pDC->SetTextColor(!pGroup->GetEnabled() ? GetXtremeColor(COLOR_GRAYTEXT) : groupColors.clrClientText);
  1249. DrawItemCaption(pDC, pGroup, rcText, m_nCaptionTextFormat);
  1250. if (m_bOfficeCaption)
  1251. {
  1252. pDC->FillSolidRect(rc.left, rc.bottom - 1, rc.Width(), 1, groupColors.clrHead.clrLight);
  1253. }
  1254. if (pGroup->IsItemFocused() && pGroup->GetTaskPanel()->IsDrawFocusRect())
  1255. {
  1256. CSize szText = pGroup->GetCaptionTextSize(pDC, rcText, m_nCaptionTextFormat);
  1257. DrawFocusRect(pDC, CRect(rcText.TopLeft(), szText));
  1258. }
  1259. }
  1260. return 0;
  1261. }
  1262. else
  1263. {
  1264. if (!pGroup->IsCaptionVisible())
  1265. return 0;
  1266. CRect rcText(pGroup->GetTargetCaptionRect());
  1267. rcText.right -= GetCaptionGripperWidth(pGroup, rcText);
  1268. if (!m_bOfficeCaption)
  1269. rcText.DeflateRect(13, 0, 13, 0);
  1270. rcText.top = rcText.bottom = 0;
  1271. CSize szIcon = pGroup->GetTaskPanel()->GetGroupIconSize();
  1272. CXTPImageManagerIcon* pImage = pGroup->GetImage(szIcon.cx);
  1273. if (pImage)
  1274. {
  1275. CRect rcIconPadding(GetItemIconPadding(pGroup));
  1276. rcText.left += szIcon.cx + rcIconPadding.right + rcIconPadding.left;
  1277. }
  1278. CSize szText = pGroup->GetCaptionTextSize(pDC, rcText, m_nCaptionTextFormat);
  1279. return szText.cy + 5;
  1280. }
  1281. }
  1282. //////////////////////////////////////////////////////////////////////////
  1283. /// CXTPTaskPanelExplorerThemePlain
  1284. CXTPTaskPanelExplorerThemePlain::CXTPTaskPanelExplorerThemePlain()
  1285. {
  1286. m_bOfficeHighlight = HIGHLIGHT_OFFICE2003;
  1287. m_eGripper = xtpTaskPanelGripperBitmap;
  1288. }
  1289. CRect CXTPTaskPanelExplorerThemePlain::DrawCaptionGripper(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  1290. {
  1291. if (!m_bExplorerTheme)
  1292. return DrawCaptionGripper(pDC, pGroup, rc);
  1293. if (!pGroup->IsExpandable())
  1294. return rc;
  1295. if (rc.Width() < 20 + 6)
  1296. return rc;
  1297. return DrawCaptionGripperBitmap(pDC, pGroup, pGroup->IsExpanded(), pGroup->IsItemHot(), rc);
  1298. }
  1299. void CXTPTaskPanelExplorerThemePlain::RefreshMetrics()
  1300. {
  1301. CXTPTaskPanelPaintManagerPlain::RefreshMetrics();
  1302. XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();
  1303. m_bExplorerTheme = FALSE;
  1304. if (!m_bEmulateEplorerTheme && (systemTheme == xtpSystemThemeUnknown))
  1305. {
  1306. m_eGripper = xtpTaskPanelGripperPlain;
  1307. return ;
  1308. }
  1309. m_bExplorerTheme = TRUE;
  1310. m_groupNormal.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
  1311. m_groupSpecial.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
  1312. switch (systemTheme)
  1313. {
  1314. case xtpSystemThemeBlue:
  1315. {
  1316. m_clrBackground.SetStandardValue(RGB(123, 162, 231), RGB(99, 117, 214));
  1317. m_groupNormal.clrClient.SetStandardValue(RGB(214, 223, 247));
  1318. m_groupNormal.clrClientLink.SetStandardValue(RGB(33, 93, 198));
  1319. m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(66, 142, 255));
  1320. break;
  1321. }
  1322. case xtpSystemThemeOlive:
  1323. {
  1324. m_clrBackground.SetStandardValue(RGB(204, 217, 173), RGB(165, 189, 132));
  1325. m_groupNormal.clrClient.SetStandardValue(RGB(246, 246, 236));
  1326. m_groupNormal.clrClientLink.SetStandardValue(RGB(86, 102, 45));
  1327. m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(114, 146, 29));
  1328. break;
  1329. }
  1330. case xtpSystemThemeSilver:
  1331. {
  1332. m_clrBackground.SetStandardValue(RGB(196, 200, 212), RGB(177, 179, 200));
  1333. m_groupNormal.clrClient.SetStandardValue(RGB(240, 241, 245));
  1334. m_groupNormal.clrClientLink.SetStandardValue(RGB(63, 61, 61));
  1335. m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(126, 124, 124));
  1336. break;
  1337. }
  1338. default:
  1339. {
  1340. m_clrBackground.SetStandardValue(
  1341. BlendColor(GetXtremeColor(COLOR_INACTIVECAPTION), GetXtremeColor(COLOR_WINDOW), 128),
  1342. BlendColor(GetXtremeColor(COLOR_ACTIVECAPTION), GetXtremeColor(COLOR_WINDOW), 192));
  1343. COLORREF clrClient = BlendColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 24);
  1344. m_groupNormal.clrClient.SetStandardValue(BlendColor(clrClient, GetXtremeColor(COLOR_ACTIVECAPTION), 230));
  1345. m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  1346. m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));
  1347. }
  1348. }
  1349. m_groupSpecial = m_groupNormal;
  1350. CreateGripperBitmaps();
  1351. }
  1352. //////////////////////////////////////////////////////////////////////////
  1353. /// CXTPTaskPanelOfficeXPThemePlain
  1354. CXTPTaskPanelOfficeXPThemePlain::CXTPTaskPanelOfficeXPThemePlain()
  1355. {
  1356. m_bRoundedFrame = FALSE;
  1357. m_bOfficeCaption = TRUE;
  1358. m_bOfficeHighlight = TRUE;
  1359. m_eGripper = xtpTaskPanelGripperNone;
  1360. }
  1361. void CXTPTaskPanelOfficeXPThemePlain::RefreshMetrics()
  1362. {
  1363. CXTPTaskPanelPaintManager::RefreshMetrics();
  1364. COLORREF clrBackground = GetXtremeColor(XPCOLOR_MENUBAR_FACE);
  1365. COLORREF clr3DShadow = GetXtremeColor(COLOR_3DSHADOW);
  1366. m_clrBackground.SetStandardValue(clrBackground, clrBackground);
  1367. m_groupNormal.clrClient.SetStandardValue(clrBackground);
  1368. m_groupNormal.clrHead.SetStandardValue(clr3DShadow, clr3DShadow);
  1369. m_groupNormal.clrClientLink.SetStandardValue(RGB(0, 0, 0xFF));
  1370. m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(0, 0, 0xFF));
  1371. m_groupSpecial = m_groupNormal;
  1372. }
  1373. //////////////////////////////////////////////////////////////////////////
  1374. /// CXTPTaskPanelOffice2003ThemePlain
  1375. CXTPTaskPanelOffice2003ThemePlain::CXTPTaskPanelOffice2003ThemePlain()
  1376. {
  1377. m_bOfficeHighlight = HIGHLIGHT_OFFICE2003;
  1378. m_eGripper = xtpTaskPanelGripperNone;
  1379. }
  1380. void CXTPTaskPanelOffice2003ThemePlain::RefreshMetrics()
  1381. {
  1382. CXTPTaskPanelPaintManager::RefreshMetrics();
  1383. XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();
  1384. COLORREF clrBackground;
  1385. COLORREF clr3DShadow;
  1386. switch (systemTheme)
  1387. {
  1388. case xtpSystemThemeBlue:
  1389. case xtpSystemThemeRoyale:
  1390. case xtpSystemThemeAero:
  1391. clrBackground = RGB(221, 236, 254);
  1392. clr3DShadow = RGB(123, 164, 224);
  1393. break;
  1394. case xtpSystemThemeOlive:
  1395. clrBackground = RGB(243, 242, 231);
  1396. clr3DShadow = RGB(188, 187, 177);
  1397. break;
  1398. case xtpSystemThemeSilver:
  1399. clrBackground = RGB(238, 238, 244);
  1400. clr3DShadow = RGB(161, 160, 187);
  1401. break;
  1402. default:
  1403. clrBackground = XTPColorManager()->LightColor(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_WINDOW), 50);
  1404. clr3DShadow = GetXtremeColor(COLOR_3DSHADOW);
  1405. }
  1406. m_clrBackground.SetStandardValue(clrBackground, clrBackground);
  1407. m_groupNormal.clrClient.SetStandardValue(clrBackground);
  1408. m_groupNormal.clrHead.SetStandardValue(clr3DShadow, clr3DShadow);
  1409. m_groupNormal.clrClientLink.SetStandardValue(RGB(0, 0, 0xFF));
  1410. m_groupNormal.clrClientLinkHot.SetStandardValue(RGB(0, 0, 0xFF));
  1411. m_groupSpecial = m_groupNormal;
  1412. }
  1413. //////////////////////////////////////////////////////////////////////////
  1414. // CXTPTaskPanelToolboxTheme
  1415. CXTPTaskPanelToolboxTheme::CXTPTaskPanelToolboxTheme()
  1416. {
  1417. m_bBoldCaption = FALSE;
  1418. m_bRoundedFrame = FALSE;
  1419. m_bOfficeHighlight = FALSE;
  1420. m_bInvertDragRect = TRUE;
  1421. m_bCaptionScrollButton = TRUE;
  1422. m_eGripper = xtpTaskPanelGripperNone;
  1423. m_rcGroupInnerMargins = CRect(0, 4, 0, 2);
  1424. m_rcControlMargins = CRect(2, 2, 2, 2);
  1425. m_nGroupSpacing = 1;
  1426. m_rcGroupIconPadding.SetRect(2, 2, 0, 2);
  1427. m_nCaptionTextFormat = DT_SINGLELINE | DT_VCENTER | DT_LEFT | DT_END_ELLIPSIS;
  1428. }
  1429. void CXTPTaskPanelToolboxTheme::RefreshMetrics()
  1430. {
  1431. CXTPTaskPanelPaintManager::RefreshMetrics();
  1432. m_clrBackground.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
  1433. m_groupNormal.clrClient.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
  1434. m_groupNormal.clrClientBorder.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
  1435. m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  1436. m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_HIGHLIGHT));
  1437. m_groupNormal.clrHead.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
  1438. m_groupNormal.clrHeadTextNormal.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  1439. m_groupNormal.clrHeadTextHot.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  1440. m_groupSpecial = m_groupNormal;
  1441. CWindowDC dc(CWnd::GetDesktopWindow());
  1442. CXTPFontDC fnt(&dc, &m_fntCaption);
  1443. m_nCaptionHeight = max(18, dc.GetTextExtent(_T(" "), 1).cy + 5);
  1444. if (!m_bOfficeHighlight)
  1445. {
  1446. COLORREF clr3DFace = GetXtremeColor(COLOR_3DFACE);
  1447. COLORREF clr3DHightlight = GetXtremeColor(COLOR_3DHIGHLIGHT);
  1448. int r = GetRValue(clr3DFace), g = GetGValue(clr3DFace), b = GetBValue(clr3DFace);
  1449. int nDelta = max(max(r, g), b);
  1450. if (r < nDelta) nDelta = min(min(r, g), b);
  1451. m_clrHighlightHot.SetStandardValue(RGB(
  1452. (r + GetRValue(clr3DHightlight))/2,
  1453. (2 * g - nDelta + GetGValue(clr3DHightlight))/2,
  1454. (2 * b - nDelta + GetBValue(clr3DHightlight))/2));
  1455. m_clrHighlightBorder.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_3DHIGHLIGHT));
  1456. }
  1457. }
  1458. CRect CXTPTaskPanelToolboxTheme::DrawGroupCaptionBackground(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  1459. {
  1460. COLORREF clrFace = GetGroupColors(pGroup)->clrHead.clrDark;
  1461. CRect rcText(rc);
  1462. pDC->FillSolidRect(rc, clrFace);
  1463. if (pGroup->IsItemHot() && pGroup->IsItemPressed())
  1464. {
  1465. pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DDKSHADOW), GetXtremeColor(COLOR_3DHILIGHT));
  1466. rc.DeflateRect(1, 1);
  1467. pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DSHADOW), clrFace);
  1468. rcText.OffsetRect(1, 1);
  1469. }
  1470. else
  1471. {
  1472. pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DHILIGHT), GetXtremeColor(COLOR_3DSHADOW));
  1473. }
  1474. return rcText;
  1475. }
  1476. int CXTPTaskPanelToolboxTheme::DrawGroupCaption(CDC* pDC, CXTPTaskPanelGroup* pGroup, BOOL bDraw)
  1477. {
  1478. CXTPFontDC fnt(pDC, GetItemFont(pGroup));
  1479. if (bDraw)
  1480. {
  1481. CRect rc = pGroup->GetCaptionRect();
  1482. if (rc.IsRectEmpty())
  1483. return 0;
  1484. XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);
  1485. if (pGroup->IsCaptionVisible())
  1486. {
  1487. CRect rcText = DrawGroupCaptionBackground(pDC, pGroup, rc);
  1488. rcText = DrawCaptionGripper(pDC, pGroup, rcText);
  1489. CSize szIcon = pGroup->GetTaskPanel()->GetGroupIconSize();
  1490. CXTPImageManagerIcon* pImage = pGroup->GetImage(szIcon.cx);
  1491. if (rcText.Width() > szIcon.cx && pImage)
  1492. {
  1493. szIcon.cy = pImage->GetHeight() * szIcon.cx / pImage->GetWidth();
  1494. CRect rcIconPadding(GetItemIconPadding(pGroup));
  1495. CPoint ptIcon(rcText.left + rcIconPadding.left,
  1496. min(rcText.CenterPoint().y + szIcon.cy/2, rcText.bottom) - szIcon.cy - rcIconPadding.bottom + rcIconPadding.top);
  1497. DrawItemImage(pDC, pGroup, ptIcon, pImage, szIcon);
  1498. rcText.left += szIcon.cx + rcIconPadding.right + rcIconPadding.left;
  1499. }
  1500. rcText.DeflateRect(3, 0);
  1501. pDC->SetBkMode(TRANSPARENT);
  1502. pDC->SetTextColor(!pGroup->GetEnabled() ? GetXtremeColor(COLOR_GRAYTEXT) : pGroupColors->clrHeadTextNormal);
  1503. DrawItemCaption(pDC, pGroup, rcText, m_nCaptionTextFormat);
  1504. if (pGroup->IsItemDragging())
  1505. {
  1506. pDC->InvertRect(rc);
  1507. }
  1508. if (pGroup->IsItemDragOver() && (m_bInvertDragRect || !(pGroup->IsExpanded() && pGroup->GetItems()->GetFirstVisibleItem() != NULL)))
  1509. {
  1510. DrawDragArrow(pDC, pGroup, rc, TRUE);
  1511. }
  1512. if (pGroup->IsChildItemDragOver() && m_bInvertDragRect)
  1513. {
  1514. pDC->InvertRect(rc);
  1515. }
  1516. if (pGroup->IsItemFocused() && pGroup->GetTaskPanel()->IsDrawFocusRect())
  1517. {
  1518. rcText.DeflateRect(-1, 2);
  1519. DrawFocusRect(pDC, rcText);
  1520. }
  1521. }
  1522. return 0;
  1523. }
  1524. else
  1525. {
  1526. if (!pGroup->IsCaptionVisible())
  1527. return 0;
  1528. int nIconSize = 0;
  1529. CSize szIcon = pGroup->GetTaskPanel()->GetGroupIconSize();
  1530. CXTPImageManagerIcon* pImage = pGroup->GetImage(szIcon.cx);
  1531. if (pImage)
  1532. {
  1533. CRect rcIconPadding(GetItemIconPadding(pGroup));
  1534. nIconSize = pImage->GetHeight() * szIcon.cx / pImage->GetWidth()
  1535. + rcIconPadding.top + rcIconPadding.bottom;
  1536. }
  1537. return max(m_nCaptionHeight, nIconSize);
  1538. }
  1539. }
  1540. //////////////////////////////////////////////////////////////////////////
  1541. // CXTPTaskPanelToolboxWhidbeyTheme
  1542. CXTPTaskPanelToolboxWhidbeyTheme::CXTPTaskPanelToolboxWhidbeyTheme()
  1543. {
  1544. m_bOfficeHighlight = TRUE;
  1545. m_bBoldCaption = TRUE;
  1546. m_bInvertDragRect = FALSE;
  1547. m_bCaptionScrollButton = FALSE;
  1548. }
  1549. void CXTPTaskPanelToolboxWhidbeyTheme::RefreshMetrics()
  1550. {
  1551. CXTPTaskPanelToolboxTheme::RefreshMetrics();
  1552. m_clrBackground.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
  1553. switch (XTPColorManager()->GetCurrentSystemTheme())
  1554. {
  1555. case xtpSystemThemeBlue:
  1556. m_groupNormal.clrHead.SetStandardValue(RGB(222, 220, 203), RGB(196, 193, 176));
  1557. m_clrBackground.SetStandardValue(RGB(243, 241, 230), RGB(228, 225, 208));
  1558. break;
  1559. case xtpSystemThemeOlive:
  1560. m_groupNormal.clrHead.SetStandardValue(RGB(223, 228, 209), RGB(222, 227, 206));
  1561. m_clrBackground.SetStandardValue(RGB(243, 241, 230), RGB(228, 225, 208));
  1562. m_clrHighlightHot.SetStandardValue(RGB(182, 198, 141));
  1563. m_clrHighlightPressed.SetStandardValue(RGB(147, 160, 112));
  1564. m_clrHighlightSelected.SetStandardValue(RGB(194, 207, 158));
  1565. break;
  1566. case xtpSystemThemeSilver:
  1567. m_groupNormal.clrHead.SetStandardValue(RGB(233, 232, 237), RGB(223, 224, 227));
  1568. m_clrBackground.SetStandardValue(RGB(234, 233, 238), RGB(215, 213, 218));
  1569. m_clrHighlightHot.SetStandardValue(RGB(255, 238, 194));
  1570. m_clrHighlightPressed.SetStandardValue(RGB(254, 128, 062));
  1571. m_clrHighlightSelected.SetStandardValue(RGB(255, 192, 111));
  1572. m_clrHighlightBorder.SetStandardValue(RGB(75, 75, 111));
  1573. break;
  1574. default:
  1575. m_groupNormal.clrHead.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_3DFACE));
  1576. }
  1577. m_groupNormal.clrClient.SetStandardValue(m_clrBackground);
  1578. m_groupSpecial = m_groupNormal;
  1579. }
  1580. CRect CXTPTaskPanelToolboxWhidbeyTheme::DrawGroupCaptionBackground(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  1581. {
  1582. XTP_TASKPANEL_GROUPCOLORS* pGroupColors = GetGroupColors(pGroup);
  1583. COLORREF clrFace = pGroupColors->clrHead.clrLight;
  1584. CRect rcText(rc);
  1585. if (pGroup->IsItemFocused())
  1586. {
  1587. if (!pGroup->IsItemHot() && !pGroup->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightSelected);
  1588. else if (pGroup->IsItemHot() && !pGroup->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightPressed);
  1589. else if (pGroup->IsItemHot() && pGroup->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightPressed);
  1590. else if (pGroup->IsItemHot() || pGroup->IsItemPressed()) Rectangle(pDC, rc, m_clrHighlightBorder.clrLight, m_clrHighlightHot);
  1591. }
  1592. else
  1593. {
  1594. XTPDrawHelpers()->GradientFill(pDC,
  1595. CRect(rc.left, rc.top, rc.right, rc.bottom - 2), pGroupColors->clrHead, FALSE);
  1596. pDC->FillSolidRect(rc.left, rc.bottom - 1, rc.Width(), 1, clrFace);
  1597. }
  1598. rcText.DeflateRect(19, 0, 0, 2);
  1599. CRect rcButton(rc.left + 6, rc.CenterPoint().y - 6, rc.left + 6 + 9, rc.CenterPoint().y + 3);
  1600. COLORREF clrButton = clrFace;
  1601. COLORREF clrFrame = GetXtremeColor(COLOR_3DSHADOW);
  1602. pDC->FillSolidRect(rcButton, clrButton);
  1603. pDC->FillSolidRect(rcButton.left + 1, rcButton.top + 1, rcButton.Width() - 2, rcButton.Height() - 2, GetXtremeColor(COLOR_3DFACE));
  1604. pDC->FillSolidRect(rcButton.left + 1, rcButton.top, rcButton.Width() - 2, 1, clrFrame);
  1605. pDC->FillSolidRect(rcButton.left + 1, rcButton.bottom - 1, rcButton.Width() - 2, 1, clrFrame);
  1606. pDC->FillSolidRect(rcButton.left, rcButton.top + 1, 1, rcButton.Height() - 2, clrFrame);
  1607. pDC->FillSolidRect(rcButton.right - 1, rcButton.top + 1, 1, rcButton.Height() - 2, clrFrame);
  1608. pDC->FillSolidRect(rcButton.left + 1, rcButton.top + 1, rcButton.Width() - 2, 3, 0xFFFFFF);
  1609. pDC->FillSolidRect(rcButton.left + 1, rcButton.top + 4, rcButton.Width() - 4, 2, 0xFFFFFF);
  1610. pDC->FillSolidRect(rcButton.left + 2, rcButton.top + 4, rcButton.Width() - 4, 1, 0);
  1611. if (!pGroup->IsExpanded())
  1612. pDC->FillSolidRect(rcButton.left + 4, rcButton.top + 2, 1, rcButton.Height() - 4, 0);
  1613. return rcText;
  1614. }
  1615. void CXTPTaskPanelToolboxWhidbeyTheme::FillTaskPanel(CDC* pDC, CXTPTaskPanel* pTaskPanel)
  1616. {
  1617. CXTPClientRect rc(pTaskPanel);
  1618. CRect rcFill(rc.left, 0, rc.right, max(rc.bottom, pTaskPanel->GetClientHeight()));
  1619. XTPDrawHelpers()->GradientFill(pDC, rcFill, m_clrBackground, TRUE);
  1620. }
  1621. void CXTPTaskPanelToolboxWhidbeyTheme::FillGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  1622. {
  1623. XTPDrawHelpers()->GradientFill(pDC, rc, GetGroupColors(pGroup)->clrClient, TRUE);
  1624. }
  1625. void CXTPTaskPanelToolboxWhidbeyTheme::DrawGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  1626. {
  1627. DrawGroupClientItems(pDC, pGroup, rc);
  1628. }
  1629. //////////////////////////////////////////////////////////////////////////
  1630. // CXTPTaskPanelListViewTheme
  1631. CXTPTaskPanelListViewTheme::CXTPTaskPanelListViewTheme()
  1632. {
  1633. m_rcGroupInnerMargins.SetRect(8, 6, 8, 6);
  1634. m_rcControlMargins.SetRectEmpty();
  1635. m_nGroupSpacing = 0;
  1636. m_bOfficeHighlight = FALSE;
  1637. m_bInvertDragRect = FALSE;
  1638. m_bCaptionScrollButton = FALSE;
  1639. m_bEmbossedDisabledText = TRUE;
  1640. }
  1641. void CXTPTaskPanelListViewTheme::RefreshMetrics()
  1642. {
  1643. CXTPTaskPanelToolboxTheme::RefreshMetrics();
  1644. m_clrBackground.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW));
  1645. m_groupNormal.clrClient.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW));
  1646. m_groupNormal.clrClientText.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
  1647. m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
  1648. m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
  1649. m_groupNormal.clrClientLinkSelected.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
  1650. m_nCaptionHeight = max(20, m_nCaptionHeight);
  1651. if (!m_bOfficeHighlight)
  1652. {
  1653. m_clrHighlightHot.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW));
  1654. m_clrHighlightBorder.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT), GetXtremeColor(COLOR_3DFACE));
  1655. }
  1656. m_groupSpecial = m_groupNormal;
  1657. }
  1658. //////////////////////////////////////////////////////////////////////////
  1659. // CXTPTaskPanelListViewOfficeXPTheme
  1660. CXTPTaskPanelListViewOfficeXPTheme::CXTPTaskPanelListViewOfficeXPTheme()
  1661. {
  1662. m_bOfficeHighlight = TRUE;
  1663. m_bEmbossedDisabledText = FALSE;
  1664. }
  1665. void CXTPTaskPanelListViewOfficeXPTheme::RefreshMetrics()
  1666. {
  1667. CXTPTaskPanelListViewTheme::RefreshMetrics();
  1668. m_clrBackground.SetStandardValue(GetXtremeColor(XPCOLOR_TOOLBAR_FACE));
  1669. m_groupNormal.clrClient.SetStandardValue(GetXtremeColor(XPCOLOR_TOOLBAR_FACE));
  1670. m_groupNormal.clrClientText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  1671. m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  1672. m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  1673. m_groupNormal.clrClientLinkSelected.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_TEXT));
  1674. m_nCaptionHeight = max(20, m_nCaptionHeight);
  1675. m_groupSpecial = m_groupNormal;
  1676. }
  1677. //////////////////////////////////////////////////////////////////////////
  1678. // CXTPTaskPanelListViewOffice2003Theme
  1679. CXTPTaskPanelListViewOffice2003Theme::CXTPTaskPanelListViewOffice2003Theme()
  1680. {
  1681. m_bOfficeHighlight = HIGHLIGHT_OFFICE2003;
  1682. m_bEmbossedDisabledText = FALSE;
  1683. }
  1684. void CXTPTaskPanelListViewOffice2003Theme::RefreshMetrics()
  1685. {
  1686. CXTPTaskPanelListViewOfficeXPTheme::RefreshMetrics();
  1687. m_grcPushed.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED));
  1688. m_grcHot.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT));
  1689. if (!XTPColorManager()->IsLunaColorsDisabled())
  1690. {
  1691. XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();
  1692. switch (systemTheme)
  1693. {
  1694. case xtpSystemThemeBlue:
  1695. case xtpSystemThemeRoyale:
  1696. case xtpSystemThemeAero:
  1697. m_clrBackground.SetStandardValue(RGB(216, 231, 252));
  1698. m_groupNormal.clrClient.SetStandardValue(RGB(216, 231, 252));
  1699. break;
  1700. case xtpSystemThemeOlive:
  1701. m_clrBackground.SetStandardValue(RGB(226, 231, 191));
  1702. m_groupNormal.clrClient.SetStandardValue(RGB(226, 231, 191));
  1703. break;
  1704. case xtpSystemThemeSilver:
  1705. m_clrBackground.SetStandardValue(RGB(223, 223, 234));
  1706. m_groupNormal.clrClient.SetStandardValue(RGB(223, 223, 234));
  1707. break;
  1708. }
  1709. if (systemTheme != xtpSystemThemeUnknown)
  1710. {
  1711. m_grcPushed.SetStandardValue(RGB(232, 127, 8), RGB(247, 218, 124));
  1712. m_grcHot.SetStandardValue(RGB(255, 255, 220), RGB(247, 192, 91));
  1713. }
  1714. }
  1715. m_groupNormal.clrHead.SetStandardValue(XTPColorManager()->grcDockBar.clrDark, XTPColorManager()->grcDockBar.clrLight);
  1716. m_groupSpecial = m_groupNormal;
  1717. }
  1718. CRect CXTPTaskPanelListViewOffice2003Theme::DrawGroupCaptionBackground(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  1719. {
  1720. if (pGroup->IsItemHot() || pGroup->IsItemPressed())
  1721. {
  1722. XTPDrawHelpers()->GradientFill(pDC, rc, pGroup->IsItemPressed() ? m_grcPushed : m_grcHot, FALSE);
  1723. }
  1724. else
  1725. {
  1726. XTPDrawHelpers()->GradientFill(pDC, rc, GetGroupColors(pGroup)->clrHead, FALSE);
  1727. }
  1728. pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DHILIGHT), GetXtremeColor(XPCOLOR_FRAME));
  1729. return rc;
  1730. }
  1731. //////////////////////////////////////////////////////////////////////////
  1732. // CXTPTaskPanelShortcutBarOffice2003Theme
  1733. CXTPTaskPanelShortcutBarOffice2003Theme::CXTPTaskPanelShortcutBarOffice2003Theme()
  1734. {
  1735. m_nCaptionTextFormat = DT_SINGLELINE | DT_VCENTER | DT_CENTER | DT_END_ELLIPSIS;
  1736. }
  1737. void CXTPTaskPanelShortcutBarOffice2003Theme::RefreshMetrics()
  1738. {
  1739. CXTPTaskPanelListViewOffice2003Theme::RefreshMetrics();
  1740. CWindowDC dc(CWnd::GetDesktopWindow());
  1741. CXTPFontDC fnt(&dc, &m_fntCaption);
  1742. m_nCaptionHeight = max(22, dc.GetTextExtent(_T(" "), 1).cy + 3);
  1743. m_groupNormal.clrClient.SetStandardValue(XTPColorManager()->grcCaption);
  1744. m_groupNormal.clrClientText.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
  1745. m_groupNormal.clrClientLink.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
  1746. m_groupNormal.clrClientLinkHot.SetStandardValue(GetXtremeColor(COLOR_WINDOW));
  1747. m_groupNormal.clrHead.SetStandardValue(XTPColorManager()->grcToolBar);
  1748. m_clrBackground.SetStandardValue(XTPColorManager()->grcCaption);
  1749. m_groupSpecial = m_groupNormal;
  1750. }
  1751. CRect CXTPTaskPanelShortcutBarOffice2003Theme::DrawGroupCaptionBackground(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  1752. {
  1753. if (pGroup->IsItemHot() || pGroup->IsItemPressed())
  1754. {
  1755. XTPDrawHelpers()->GradientFill(pDC, rc, pGroup->IsItemPressed() ? m_grcPushed : m_grcHot, FALSE);
  1756. }
  1757. else
  1758. {
  1759. XTPDrawHelpers()->GradientFill(pDC, rc, GetGroupColors(pGroup)->clrHead, FALSE);
  1760. }
  1761. if (pGroup->GetIndex() != 0)
  1762. pDC->FillSolidRect(rc.left, rc.top, rc.Width(), 1, GetXtremeColor(XPCOLOR_FRAME));
  1763. return rc;
  1764. }
  1765. void CXTPTaskPanelShortcutBarOffice2003Theme::FillGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  1766. {
  1767. XTPDrawHelpers()->GradientFill(pDC, rc, GetGroupColors(pGroup)->clrClient, FALSE);
  1768. }
  1769. void CXTPTaskPanelShortcutBarOffice2003Theme::DrawGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  1770. {
  1771. DrawGroupClientItems(pDC, pGroup, rc);
  1772. pDC->FillSolidRect(rc.left, rc.top, rc.Width(), 1, GetXtremeColor(XPCOLOR_FRAME));
  1773. }
  1774. void CXTPTaskPanelShortcutBarOffice2003Theme::FillTaskPanel(CDC* pDC, CXTPTaskPanel* pTaskPanel)
  1775. {
  1776. CXTPClientRect rc(pTaskPanel);
  1777. rc.bottom = max(rc.bottom, pTaskPanel->GetClientHeight());
  1778. XTPDrawHelpers()->GradientFill(pDC, rc, m_clrBackground, FALSE);
  1779. }
  1780. //////////////////////////////////////////////////////////////////////////
  1781. // CXTPTaskPanelShortcutBarOffice2007Theme
  1782. CXTPTaskPanelShortcutBarOffice2007Theme::CXTPTaskPanelShortcutBarOffice2007Theme()
  1783. {
  1784. m_nCaptionTextFormat = DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
  1785. m_bBoldCaption = TRUE;
  1786. }
  1787. void CXTPTaskPanelShortcutBarOffice2007Theme::RefreshMetrics()
  1788. {
  1789. CXTPTaskPanelShortcutBarOffice2003Theme::RefreshMetrics();
  1790. CWindowDC dc(CWnd::GetDesktopWindow());
  1791. CXTPFontDC fnt(&dc, &m_fntCaption);
  1792. m_nCaptionHeight = max(22, dc.GetTextExtent(_T(" "), 1).cy + 3);
  1793. m_groupNormal.clrClient.SetStandardValue(0xFFFFFF);
  1794. m_groupNormal.clrHead.SetStandardValue(RGB(227, 239, 255), RGB(192, 219, 255), 0.25f);
  1795. m_clrBackground.SetStandardValue(0xFFFFFF);
  1796. m_groupSpecial = m_groupNormal;
  1797. CXTPOffice2007Image* pImage = XTPOffice2007Images()->LoadFile(_T("SHORTCUTBARITEMS"));
  1798. if (pImage)
  1799. {
  1800. m_clrShortcutItemShadow = XTPOffice2007Images()->GetImageColor(_T("ShortcutBar"), _T("FrameBorder"));
  1801. COLORREF clrText = XTPOffice2007Images()->GetImageColor(_T("ShortcutBar"), _T("NormalText"));
  1802. m_groupNormal.clrHeadTextNormal.SetStandardValue(clrText);
  1803. m_groupNormal.clrHeadTextHot.SetStandardValue(clrText);
  1804. }
  1805. else
  1806. {
  1807. m_clrShortcutItemShadow = RGB(101, 147, 207);
  1808. m_groupNormal.clrHeadTextNormal.SetStandardValue(RGB(32, 77, 137));
  1809. m_groupNormal.clrHeadTextHot.SetStandardValue(RGB(32, 77, 137));
  1810. }
  1811. m_groupNormal.clrClientText.SetStandardValue(m_groupNormal.clrHeadTextNormal);
  1812. m_groupNormal.clrClientLink.SetStandardValue(m_groupNormal.clrHeadTextNormal);
  1813. m_groupNormal.clrClientLinkHot.SetStandardValue(m_groupNormal.clrHeadTextNormal);
  1814. m_grcPushed.SetStandardValue(RGB(232, 127, 8), RGB(247, 218, 124));
  1815. m_grcHot.SetStandardValue(RGB(255, 255, 220), RGB(247, 192, 91));
  1816. m_groupNormal.clrHead.SetStandardValue(RGB(227, 239, 255), RGB(192, 219, 255), 0.25f);
  1817. m_clrHighlightHot.SetStandardValue(RGB(255, 231, 162));
  1818. m_clrHighlightPressed.SetStandardValue(RGB(255, 171, 63));
  1819. m_clrHighlightSelected.SetStandardValue(RGB(255,189,105));
  1820. m_clrHighlightBorder.SetStandardValue(RGB(255, 171, 63));
  1821. m_groupSpecial = m_groupNormal;
  1822. }
  1823. CRect CXTPTaskPanelShortcutBarOffice2007Theme::DrawGroupCaptionBackground(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  1824. {
  1825. CXTPOffice2007Image* pImage = XTPOffice2007Images()->LoadFile(_T("SHORTCUTBARITEMS"));
  1826. if (!pImage)
  1827. return CXTPTaskPanelShortcutBarOffice2003Theme::DrawGroupCaptionBackground(pDC, pGroup, rc);
  1828. if (pGroup->IsItemPressed())
  1829. {
  1830. pImage->DrawImage(pDC, rc, pImage->GetSource(3, 4));
  1831. }
  1832. else if (pGroup->IsItemHot())
  1833. {
  1834. pImage->DrawImage(pDC, rc, pImage->GetSource(2, 4));
  1835. }
  1836. else
  1837. {
  1838. pImage->DrawImage(pDC, rc, pImage->GetSource(0, 4));
  1839. }
  1840. pDC->FillSolidRect(rc.left, rc.bottom - 1, rc.Width(), 1, m_clrShortcutItemShadow);
  1841. return rc;
  1842. }
  1843. void CXTPTaskPanelShortcutBarOffice2007Theme::FillGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  1844. {
  1845. XTPDrawHelpers()->GradientFill(pDC, rc, GetGroupColors(pGroup)->clrClient, FALSE);
  1846. }
  1847. void CXTPTaskPanelShortcutBarOffice2007Theme::DrawGroupClientFace(CDC* pDC, CXTPTaskPanelGroup* pGroup, CRect rc)
  1848. {
  1849. DrawGroupClientItems(pDC, pGroup, rc);
  1850. pDC->FillSolidRect(rc.left, rc.bottom - 1, rc.Width(), 1, m_clrShortcutItemShadow);
  1851. }
  1852. void CXTPTaskPanelShortcutBarOffice2007Theme::FillTaskPanel(CDC* pDC, CXTPTaskPanel* pTaskPanel)
  1853. {
  1854. CXTPClientRect rc(pTaskPanel);
  1855. rc.bottom = max(rc.bottom, pTaskPanel->GetClientHeight());
  1856. XTPDrawHelpers()->GradientFill(pDC, rc, m_clrBackground, FALSE);
  1857. }
  1858. void CXTPTaskPanelShortcutBarOffice2007Theme::DrawGroupItemFrame(CDC* pDC, CXTPTaskPanelGroupItem* pItem, CRect rc)
  1859. {
  1860. CXTPOffice2007Image* pImage = XTPOffice2007Images()->LoadFile(rc.Height() > 22 ? _T("TOOLBARBUTTONS50") : _T("TOOLBARBUTTONS22"));
  1861. if (!pImage)
  1862. {
  1863. CXTPTaskPanelShortcutBarOffice2003Theme::DrawGroupItemFrame(pDC, pItem, rc);
  1864. return;
  1865. }
  1866. int nState = -1;
  1867. if (pItem->IsItemSelected() && !pItem->IsItemHot() && !pItem->IsItemPressed()) nState = 2;
  1868. else if (pItem->IsItemSelected() && pItem->IsItemHot() && !pItem->IsItemPressed())  nState = 3;
  1869. else if (pItem->IsItemHot() && pItem->IsItemPressed()) nState = 1;
  1870. else if (pItem->IsItemHot() || pItem->IsItemPressed()) nState = 0;
  1871. if (nState != -1)
  1872. {
  1873. pImage->DrawImage(pDC, rc, pImage->GetSource(nState, 4), CRect(8, 8, 8, 8), COLORREF_NULL);
  1874. }
  1875. }