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

对话框与窗口

开发平台:

Visual C++

  1. // XTPPaintManager.cpp : implementation of the CXTPPaintManager class.
  2. //
  3. // This file is a part of the XTREME COMMANDBARS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include <math.h>
  22. #include "Common/XTPVC80Helpers.h"
  23. #include "Common/XTPImageManager.h"
  24. #include "Common/XTPColorManager.h"
  25. #include "Common/XTPDrawHelpers.h"
  26. #include "Common/XTPResourceManager.h"
  27. #include "Common/XTPHookManager.h"
  28. #include "Common/XTPMarkupRender.h"
  29. #include "XTPPaintManager.h"
  30. #include "XTPControlButton.h"
  31. #include "XTPControlPopup.h"
  32. #include "XTPControlGallery.h"
  33. #include "XTPToolBar.h"
  34. #include "XTPCommandBars.h"
  35. #include "XTPPopupBar.h"
  36. #include "XTPControlComboBox.h"
  37. #include "XTPControlEdit.h"
  38. #include "XTPControls.h"
  39. #include "XTPStatusBar.h"
  40. #include "XTPMessageBar.h"
  41. #include "XTPControlProgress.h"
  42. #include "XTPOffice2007Theme.h"
  43. #ifdef _XTP_INCLUDE_RIBBON
  44. #include "Ribbon/XTPRibbonTheme.h"
  45. #endif
  46. #ifdef _DEBUG
  47. #define new DEBUG_NEW
  48. #undef THIS_FILE
  49. static char THIS_FILE[] = __FILE__;
  50. #endif
  51. CXTPPaintManager* CXTPPaintManager::s_pInstance = NULL;
  52. //////////////////////////////////////////////////////////////////////
  53. // CXTPPaintManager::CXTPPaintManagerDestructor
  54. static class CXTPPaintManager::CPaintManagerDestructor
  55. {
  56. public:
  57. ~CPaintManagerDestructor()
  58. {
  59. CXTPPaintManager::Done();
  60. }
  61. } __xtpPaintManagerDestructor;
  62. ///////////////////////////////////////////////////////////////////////////////
  63. // CXTPDockingPanePaintManager::CLogFont
  64. CXTPPaintManager::CLogFont::CLogFont()
  65. {
  66. ::ZeroMemory(this, sizeof(LOGFONT));
  67. }
  68. ///////////////////////////////////////////////////////////////////////////////
  69. // CXTPDockingPanePaintManager::CNonClientMetrics
  70. CXTPPaintManager::CNonClientMetrics::CNonClientMetrics()
  71. {
  72. ::ZeroMemory(this, sizeof(NONCLIENTMETRICS));
  73. cbSize = sizeof(NONCLIENTMETRICS);
  74. VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
  75. sizeof(NONCLIENTMETRICS), this, 0));
  76. }
  77. CXTPPaintManager::CXTPPaintManager()
  78. {
  79. m_bFlatToolBar = FALSE;
  80. m_bFlatMenuBar = FALSE;
  81. m_nTextHeight = 0;
  82. m_bUseOfficeFont = FALSE;
  83. m_strOfficeFont = _T("Tahoma");
  84. m_bUseStandardFont = TRUE;
  85. m_bShowShadow = TRUE;
  86. m_bEmbossedDisabledText = TRUE;
  87. m_nStatusBarMinHeight = 20;
  88. m_bThemedStatusBar = FALSE;
  89. m_bThemedCheckBox = FALSE;
  90. m_iconsInfo.bUseFadedIcons = FALSE;
  91. m_iconsInfo.bIconsWithShadow = FALSE;
  92. m_iconsInfo.bUseDisabledIcons = FALSE;
  93. m_iconsInfo.bOfficeStyleDisabledIcons = FALSE;
  94. m_nAnimationSteps = 10;
  95. m_nAnimationTime = 100;
  96. m_bThickCheckMark = FALSE;
  97. m_bClearTypeTextQuality = FALSE;
  98. m_systemTheme = xtpSystemThemeDefault;
  99. m_bShowKeyboardCues = -1;
  100. m_nSplitButtonDropDownWidth = 11;
  101. m_nPopupBarTextPadding = 4;
  102. m_nSplitButtonPopupWidth = 20;
  103. m_bSelectImageInPopupBar = FALSE;
  104. m_bEnableAnimation = FALSE;
  105. m_bOffice2007Padding = FALSE;
  106. m_bOffsetPopupLabelText = TRUE;
  107. m_nEditHeight = 0;
  108. m_bAutoResizeIcons = FALSE;
  109. m_bWrapCaptionBelowText = TRUE;
  110. m_bResourceCharSet = FALSE;
  111. m_rcStatusBarBorder.SetRect(0, 0, 0, 0);
  112. XTPImageManager()->RefreshAll();
  113. m_pGalleryPaintManager = new CXTPControlGalleryPaintManager(this);
  114. m_pSliderPaintManager = new CXTPSliderPaintManager(this);
  115. m_pProgressPaintManager = new CXTPProgressPaintManager(this);
  116. m_pfnSetLayeredWindowAttributes = NULL;
  117. //init layered function  (for Win98 compatible)
  118. HMODULE hLib = GetModuleHandle(_T("USER32"));
  119. if (hLib)
  120. {
  121. m_pfnSetLayeredWindowAttributes = (PVOID) ::GetProcAddress(hLib, "SetLayeredWindowAttributes");
  122. }
  123. m_pShadowManager = new CXTPShadowManager();
  124. }
  125. XTPCurrentSystemTheme CXTPPaintManager::GetCurrentSystemTheme()
  126. {
  127. if (m_systemTheme == xtpSystemThemeDefault)
  128. return XTPColorManager()->IsLunaColorsDisabled() ? xtpSystemThemeUnknown :
  129. XTPColorManager()->GetCurrentSystemTheme();
  130. if (m_systemTheme == xtpSystemThemeAuto)
  131. return XTPColorManager()->GetWinThemeWrapperTheme();
  132. return m_systemTheme;
  133. }
  134. void CXTPPaintManager::SetLunaTheme(XTPCurrentSystemTheme systemTheme)
  135. {
  136. m_systemTheme = systemTheme;
  137. RefreshMetrics();
  138. }
  139. COLORREF CXTPPaintManager::GetXtremeColor(UINT nIndex)
  140. {
  141. if (nIndex > XPCOLOR_LAST) return nIndex;
  142. return m_arrColor[nIndex];
  143. }
  144. void CXTPPaintManager::SetColors(int cElements, CONST INT* lpaElements, CONST COLORREF* lpaRgbValues)
  145. {
  146. for (int i = 0; i < cElements; i++)
  147. m_arrColor[lpaElements[i]].SetStandardValue(lpaRgbValues[i]);
  148. }
  149. CXTPPaintManager::~CXTPPaintManager()
  150. {
  151. SAFE_DELETE(m_pGalleryPaintManager);
  152. SAFE_DELETE(m_pSliderPaintManager);
  153. SAFE_DELETE(m_pProgressPaintManager);
  154. CMDTARGET_RELEASE(m_pShadowManager);
  155. }
  156. int CXTPPaintManager::GetShadowOptions() const
  157. {
  158. return m_pShadowManager->GetShadowOptions();
  159. }
  160. XTP_COMMANDBARS_ICONSINFO* CXTPPaintManager::GetIconsInfo()
  161. {
  162. return &m_iconsInfo;
  163. }
  164. void CXTPPaintManager::UpdateColors()
  165. {
  166. RefreshXtremeColors();
  167. CXTPColorManager* pColorManager = XTPColorManager();
  168. for (int i = 0; i <= XPCOLOR_LAST; i++)
  169. m_arrColor[i].SetStandardValue(pColorManager->GetColor(i));
  170. }
  171. void CXTPPaintManager::RefreshMetrics()
  172. {
  173. UpdateFonts();
  174. UpdateColors();
  175. m_pShadowManager->SetShadowColor(0);
  176. m_clrStatusTextColor = GetXtremeColor(COLOR_BTNTEXT);
  177. m_clrMessageBarText = GetXtremeColor(COLOR_INFOTEXT);
  178. m_clrFloatingGripper.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW));
  179. m_clrFloatingGripperText.SetStandardValue(GetXtremeColor(COLOR_3DHIGHLIGHT));
  180. m_clrDisabledIcon.SetStandardValue(GetXtremeColor(COLOR_3DFACE), GetXtremeColor(COLOR_3DSHADOW));
  181. m_themeStatusBar.CloseTheme();
  182. if (m_bThemedStatusBar)
  183. {
  184. m_themeStatusBar.OpenThemeData(NULL, L"STATUS");
  185. if (m_themeStatusBar.IsAppThemed())
  186. m_themeStatusBar.GetThemeColor(SP_PANE, 0, TMT_TEXTCOLOR, &m_clrStatusTextColor);
  187. }
  188. m_themeButton.CloseTheme();
  189. if (m_bThemedCheckBox)
  190. {
  191. m_themeButton.OpenTheme(NULL, L"BUTTON");
  192. }
  193. m_pGalleryPaintManager->RefreshMetrics();
  194. m_pSliderPaintManager->RefreshMetrics();
  195. m_pProgressPaintManager->RefreshMetrics();
  196. }
  197. int CXTPPaintManager::GetControlHeight() const
  198. {
  199. return max(22, m_nTextHeight);
  200. }
  201. CXTPPaintManager* CXTPPaintManager::CreateTheme(XTPPaintTheme paintTheme)
  202. {
  203. CXTPPaintManager* pInstance = NULL;
  204. if (paintTheme == xtpThemeOfficeXP) pInstance = new CXTPOfficeTheme();
  205. else if (paintTheme == xtpThemeOffice2003) pInstance = new CXTPOffice2003Theme();
  206. else if (paintTheme == xtpThemeNativeWinXP) pInstance = new CXTPNativeXPTheme();
  207. else if (paintTheme == xtpThemeWhidbey) pInstance = new CXTPWhidbeyTheme();
  208. else if (paintTheme == xtpThemeVisualStudio2008) pInstance = new CXTPVisualStudio2008Theme();
  209. else if (paintTheme == xtpThemeOffice2007) pInstance = new CXTPOffice2007Theme();
  210. #ifdef _XTP_INCLUDE_RIBBON
  211. else if (paintTheme == xtpThemeRibbon) pInstance = new CXTPRibbonTheme();
  212. #endif
  213. else pInstance = new CXTPDefaultTheme();
  214. ASSERT(pInstance);
  215. pInstance->m_themeCurrent = paintTheme;
  216. return pInstance;
  217. }
  218. void CXTPPaintManager::SetTheme(XTPPaintTheme paintTheme)
  219. {
  220. SetCustomTheme(CreateTheme(paintTheme));
  221. s_pInstance->m_themeCurrent = paintTheme;
  222. }
  223. void CXTPPaintManager::SetCustomTheme(CXTPPaintManager* pTheme)
  224. {
  225. if (s_pInstance != NULL)
  226. s_pInstance->InternalRelease();
  227. s_pInstance = pTheme;
  228. s_pInstance->m_themeCurrent = xtpThemeCustom;
  229. s_pInstance->RefreshMetrics();
  230. }
  231. void CXTPPaintManager::Done()
  232. {
  233. if (s_pInstance != NULL)
  234. s_pInstance->InternalRelease();
  235. s_pInstance = NULL;
  236. }
  237. void CXTPPaintManager::Triangle(CDC* pDC, CPoint pt0, CPoint pt1, CPoint pt2, COLORREF clr)
  238. {
  239. CXTPPenDC pen (*pDC, clr);
  240. CXTPBrushDC brush (*pDC, clr);
  241. CPoint pts[3];
  242. pts[0] = pt0;
  243. pts[1] = pt1;
  244. pts[2] = pt2;
  245. pDC->Polygon(pts, 3);
  246. }
  247. void CXTPPaintManager::Rectangle(CDC* pDC, CRect rc, int nPen, int nBrush)
  248. {
  249. if (nBrush != -1) pDC->FillSolidRect(rc, GetXtremeColor(nBrush));
  250. if (nPen != nBrush && nPen != -1) pDC->Draw3dRect(rc, GetXtremeColor(nPen), GetXtremeColor(nPen));
  251. }
  252. void CXTPPaintManager::Draw3dRect(CDC* pDC, CRect rc, int nTopLeft, int nBottomRight)
  253. {
  254. pDC->Draw3dRect(&rc, GetXtremeColor(nTopLeft), GetXtremeColor(nBottomRight));
  255. }
  256. void CXTPPaintManager::_DrawCheckMark(CDC* pDC, CRect rc, COLORREF clr, BOOL bLayoutRTL /*= FALSE*/)
  257. {
  258. CRect rcCheck(CPoint(rc.left + rc.Width()/2 - 10, rc.top + rc.Height()/2 - 10), CSize(20, 20));
  259. CXTPPenDC pen(*pDC, clr);
  260. if (bLayoutRTL)
  261. {
  262. pDC->MoveTo(rcCheck.left + 6, rcCheck.top + 7);
  263. pDC->LineTo(rcCheck.left + 10, rcCheck.top + 11);
  264. pDC->LineTo(rcCheck.left + 13, rcCheck.top + 8);
  265. pDC->MoveTo(rcCheck.left + 6, rcCheck.top + 8);
  266. pDC->LineTo(rcCheck.left + 10, rcCheck.top + 12);
  267. pDC->LineTo(rcCheck.left + 13, rcCheck.top + 9);
  268. }
  269. else
  270. {
  271. pDC->MoveTo(rcCheck.left + 6, rcCheck.top + 9);
  272. pDC->LineTo(rcCheck.left + 8, rcCheck.top + 11);
  273. pDC->LineTo(rcCheck.left + 13, rcCheck.top + 6);
  274. pDC->MoveTo(rcCheck.left + 6, rcCheck.top + 10);
  275. pDC->LineTo(rcCheck.left + 8, rcCheck.top + 12);
  276. pDC->LineTo(rcCheck.left + 13, rcCheck.top + 7);
  277. }
  278. }
  279. AFX_INLINE COLORREF Mix(CDC* pDC, int x, int y, COLORREF clrBorder, COLORREF clrFace, double a)
  280. {
  281. COLORREF clr = clrFace;
  282. if (a < 0)
  283. a = -a;
  284. else
  285. {
  286. clr = pDC->GetPixel(x, y);
  287. }
  288. int r = int(GetRValue(clrBorder) + a * double(GetRValue(clr) -  GetRValue(clrBorder)));
  289. int g = int(GetGValue(clrBorder) + a * double(GetGValue(clr) -  GetGValue(clrBorder)));
  290. int b = int(GetBValue(clrBorder) + a * double(GetBValue(clr) -  GetBValue(clrBorder)));
  291. return RGB(r, g, b);
  292. }
  293. void CXTPPaintManager::AlphaEllipse(CDC* pDC, CRect rc, COLORREF clrBorder, COLORREF clrFace)
  294. {
  295. ASSERT(rc.Width() == rc.Height());
  296. double x0 = double(rc.left + rc.right - 1) / 2;
  297. double y0 = double(rc.top + rc.bottom - 1) / 2;
  298. double radius = double(rc.right - rc.left - 1) / 2 - 0.25;
  299. for (int x = rc.left; x < rc.right; x++)
  300. for (int y = rc.top; y < rc.bottom; y++)
  301. {
  302. double distance = sqrt(pow(x0 - x, 2) + pow(y0 - y, 2));
  303. if (distance >= radius - 1 && distance <= radius + 1)
  304. {
  305. pDC->SetPixel(x, y, Mix(pDC, x, y, clrBorder, clrFace, distance - radius));
  306. }
  307. else if (distance < radius - 1)
  308. {
  309. pDC->SetPixel(x, y, clrFace);
  310. }
  311. }
  312. }
  313. void CXTPPaintManager::DrawPopupBarRadioMark(CDC* pDC, CRect rcCheck, BOOL /*bEnabled*/, COLORREF clr)
  314. {
  315. CPoint pt(rcCheck.CenterPoint());
  316. CRect rcRadio(pt.x - 3, pt.y - 3, pt.x + 3, pt.y + 3);
  317. AlphaEllipse(pDC, rcRadio, clr, clr);
  318. }
  319. void CXTPPaintManager::DrawPopupBarCheckMark(CDC* pDC, CRect rc, BOOL /*bEnabled*/, COLORREF clr)
  320. {
  321. BOOL bLayoutRTL = CXTPDrawHelpers::IsContextRTL(pDC);
  322. _DrawCheckMark(pDC, rc, clr, bLayoutRTL);
  323. if (m_bThickCheckMark)
  324. {
  325. rc.OffsetRect(0, 1);
  326. _DrawCheckMark(pDC, rc, clr, bLayoutRTL);
  327. }
  328. }
  329. void CXTPPaintManager::DrawComboExpandMark(CDC* pDC, CRect rc, COLORREF clr)
  330. {
  331. CPoint pt(rc.CenterPoint());
  332. int nWidth = max(2, rc.Width() / 2 - 4);
  333. Triangle(pDC, CPoint(pt.x - nWidth, pt.y - nWidth/2), CPoint(pt.x + nWidth, pt.y - nWidth/2), CPoint (pt.x , pt.y - nWidth/2 + nWidth), clr);
  334. }
  335. void CXTPPaintManager::HorizontalLine(CDC* pDC, int x0, int y, int x1, COLORREF clrPen)
  336. {
  337. pDC->FillSolidRect(x0, y, x1 - x0, 1, clrPen);
  338. }
  339. void CXTPPaintManager::VerticalLine(CDC* pDC, int x, int y0, int y1, COLORREF clrPen)
  340. {
  341. pDC->FillSolidRect(x, y0, 1, y1 - y0, clrPen);
  342. }
  343. void CXTPPaintManager::Line(CDC* pDC, CPoint p0, CPoint p1)
  344. {
  345. pDC->MoveTo(p0);
  346. pDC->LineTo(p1);
  347. }
  348. void CXTPPaintManager::Line(CDC* pDC, int x0, int y0, int x1, int y1, int nPen)
  349. {
  350. CXTPPenDC pen(*pDC, GetXtremeColor(nPen));
  351. pDC->MoveTo(x0, y0);
  352. pDC->LineTo(x1, y1);
  353. }
  354. void CXTPPaintManager::Pixel(CDC* pDC, int x, int y, int nPen)
  355. {
  356. pDC->SetPixel(x, y, GetXtremeColor(nPen));
  357. }
  358. void CXTPPaintManager::StripMnemonics(CString& strClear)
  359. {
  360. CXTPDrawHelpers::StripMnemonics(strClear);
  361. }
  362. void CXTPPaintManager::SplitString(const CString& str, CString& strFirstRow, CString& strSecondRow)
  363. {
  364. strFirstRow = str;
  365. strSecondRow.Empty();
  366. int nIndex = str.Find(_T(' '));
  367. if (nIndex < 1)
  368. return;
  369. int nCenter = str.GetLength() / 2;
  370. for (int i = 0; i < nCenter - 1; i++)
  371. {
  372. ASSERT(nCenter - i >= 0 && nCenter + i + 1 < str.GetLength());
  373. if (str[nCenter - i] == _T(' '))
  374. {
  375. strFirstRow = str.Left(nCenter - i);
  376. strSecondRow = str.Mid(nCenter - i + 1);
  377. return;
  378. }
  379. if (str[nCenter + i + 1] == _T(' '))
  380. {
  381. strFirstRow = str.Left(nCenter + i + 1);
  382. strSecondRow = str.Mid(nCenter + i + 2);
  383. return;
  384. }
  385. }
  386. }
  387. #define XTP_DTT_COMPOSITED      (1UL << 13)     // Draws text with antialiased alpha (needs a DIB section)
  388. #define XTP_DTT_TEXTCOLOR       (1UL << 0)
  389. void CXTPPaintManager::DrawTextApi(CDC* pDC, const CString& str, LPRECT lpRect, UINT format, BOOL bComposited)
  390. {
  391. if (!bComposited)
  392. {
  393. pDC->DrawText(str, lpRect, format);
  394. }
  395. else
  396. {
  397. CXTPWinThemeWrapper wrapper(FALSE);
  398. wrapper.OpenTheme(0, L"GLOBALS");
  399. if (!wrapper.IsAppThemed())
  400. {
  401. pDC->DrawText(str, lpRect, format);
  402. return;
  403. }
  404. CRect rcBuffer(lpRect);
  405. HDC hDC = 0;
  406. HPAINTBUFFER pb = wrapper.BeginBufferedPaint(pDC->GetSafeHdc(), rcBuffer, XTP_BPBF_TOPDOWNDIB, 0, &hDC);
  407. if (hDC != NULL)
  408. {
  409. ::BitBlt(hDC, rcBuffer.left, rcBuffer.top, rcBuffer.Width(), rcBuffer.Height(), pDC->GetSafeHdc(), rcBuffer.left, rcBuffer.top, SRCCOPY);
  410. XTP_UX_DTTOPTS op;
  411. op.dwSize = sizeof(op);
  412. op.dwFlags = XTP_DTT_COMPOSITED | XTP_DTT_TEXTCOLOR;
  413. op.crText = pDC->GetTextColor();
  414. CXTPFontDC font(CDC::FromHandle(hDC), pDC->GetCurrentFont());
  415. wrapper.DrawThemeTextEx(hDC, 0, 0, XTP_CT2CW(str), -1,
  416. format,  rcBuffer, &op);
  417. }
  418. wrapper.EndBufferedPaint(pb, TRUE);
  419. }
  420. }
  421. void CXTPPaintManager::DrawControlText3(CDC* pDC, CXTPControl* pButton, const CString& str, const CString& strClear, CRect rcText, BOOL bVert, BOOL bCentered)
  422. {
  423. BOOL bEmbossed = !pButton->GetEnabled() && m_bEmbossedDisabledText;
  424. BOOL bShowKeyboardCues = pButton->GetParent()->IsKeyboardCuesVisible();
  425. if (m_bShowKeyboardCues > -1)
  426. bShowKeyboardCues = m_bShowKeyboardCues;
  427. int nFormat = DT_SINGLELINE | (bCentered ? DT_CENTER : DT_LEFT);
  428. if (!bVert)
  429. {
  430. if (bEmbossed)
  431. {
  432. COLORREF clrText = pDC->GetTextColor();
  433. pDC->SetTextColor(GetXtremeColor(COLOR_3DHIGHLIGHT));
  434. pDC->DrawText(strClear, rcText + CPoint(1, 1), nFormat | DT_VCENTER | DT_NOPREFIX);
  435. pDC->SetTextColor(clrText);
  436. }
  437. if (bShowKeyboardCues)
  438. DrawTextApi(pDC, str, &rcText, nFormat | DT_VCENTER, pButton->HasDwmCompositedRect());
  439. else
  440. DrawTextApi(pDC, strClear, &rcText, nFormat | DT_VCENTER | DT_NOPREFIX, pButton->HasDwmCompositedRect());
  441. }
  442. else
  443. {
  444. if (bEmbossed)
  445. {
  446. COLORREF clrText = pDC->GetTextColor();
  447. pDC->SetTextColor(GetXtremeColor(COLOR_3DHIGHLIGHT));
  448. pDC->DrawText(strClear, rcText + CPoint(1, 1), nFormat | DT_NOPREFIX | DT_NOCLIP);
  449. pDC->SetTextColor(clrText);
  450. }
  451. pDC->DrawText(strClear, &rcText, nFormat | DT_NOPREFIX | DT_NOCLIP);
  452. }
  453. }
  454. void CXTPPaintManager::DrawDropDownGlyph(CDC* pDC, CXTPControl* /*pControl*/, CPoint pt, BOOL bSelected, BOOL bPopuped, BOOL bEnabled, BOOL bVert)
  455. {
  456. COLORREF clr = GetRectangleTextColor(bSelected, FALSE, bEnabled, FALSE, bPopuped, xtpBarTypeNormal, xtpBarTop);
  457. if (bVert)
  458. {
  459. Triangle(pDC, CPoint(pt.x + 2 , pt.y - 2), CPoint(pt.x + 2, pt.y + 2), CPoint (pt.x, pt.y), clr);
  460. }
  461. else
  462. {
  463. Triangle(pDC, CPoint(pt.x - 2 , pt.y - 1), CPoint(pt.x + 2, pt.y - 1), CPoint (pt.x, pt.y + 1), clr);
  464. }
  465. }
  466. CSize CXTPPaintManager::DrawControlText2(CDC* pDC, CXTPControl* pButton, CRect rcText, BOOL bDraw, BOOL bVert, BOOL bTrangled)
  467. {
  468. CString str = pButton->GetCaption();
  469. CString strClear(str);
  470. StripMnemonics(strClear);
  471. CString strFirstRow, strSecondRow;
  472. if (m_bWrapCaptionBelowText)
  473. SplitString(str, strFirstRow, strSecondRow);
  474. else strFirstRow = str;
  475. CString strFirstRowClear(strFirstRow), strSecondRowClear(strSecondRow);
  476. StripMnemonics(strFirstRowClear);
  477. StripMnemonics(strSecondRowClear);
  478. if (!bDraw)
  479. {
  480. CSize szFirstRow = pDC->GetTextExtent(strClear.IsEmpty() ? _T(" ") : strFirstRowClear);
  481. CSize szSecondRow = pDC->GetTextExtent(strClear.IsEmpty() ? _T(" ") : strSecondRowClear);
  482. if (bTrangled) szSecondRow.cx += 8;
  483. CSize sz(max(szFirstRow.cx, szSecondRow.cx), 24);
  484. return bVert ? CSize(sz.cy, sz.cx) : sz;
  485. }
  486. if (!bVert)
  487. {
  488. CRect rcFirstRowText(rcText.left, rcText.top, rcText.right, rcText.CenterPoint().y + 1);
  489. CRect rcSecondRowText(rcText.left, rcText.CenterPoint().y, rcText.right, rcText.bottom);
  490. DrawControlText3(pDC, pButton, strFirstRow, strFirstRowClear, rcFirstRowText, bVert, TRUE);
  491. int nWidth = pDC->GetTextExtent(strSecondRowClear).cx + (bTrangled ? 9 : 0);
  492. rcSecondRowText.left += (rcText.Width() - nWidth) /2;
  493. DrawControlText3(pDC, pButton, strSecondRow, strSecondRowClear, rcSecondRowText, bVert, FALSE);
  494. if (bTrangled)
  495. {
  496. CPoint pt = CPoint(strSecondRow.IsEmpty() ? rcText.CenterPoint().x - 1:
  497. rcSecondRowText.left + nWidth - 4, rcSecondRowText.CenterPoint().y);
  498. DrawDropDownGlyph(pDC, pButton, pt, pButton->GetSelected(), pButton->GetPopuped(), pButton->GetEnabled(), bVert);
  499. }
  500. }
  501. else
  502. {
  503. CRect rcSecondRowText(rcText.left + 1, rcText.top, rcText.CenterPoint().x + 1, rcText.bottom);
  504. CRect rcFirstRowText(rcText.CenterPoint().x, rcText.top, rcText.right - 1, rcText.bottom);
  505. CSize szText = pDC->GetTextExtent (strFirstRowClear);
  506. rcFirstRowText.left = rcFirstRowText.right - (rcFirstRowText.Width() - szText.cy + 1) / 2;
  507. rcFirstRowText.top = rcFirstRowText.top + (rcFirstRowText.Height() - szText.cx + 1) / 2;
  508. DrawControlText3(pDC, pButton, strFirstRow, strFirstRowClear, rcFirstRowText, bVert, FALSE);
  509. szText = pDC->GetTextExtent (strSecondRowClear);
  510. szText.cx += (bTrangled ? 8 : 0);
  511. CRect rcSecondRow(rcSecondRowText);
  512. rcSecondRowText.left = rcSecondRowText.right - (rcSecondRowText.Width() - szText.cy + 1) / 2;
  513. rcSecondRowText.top = rcSecondRowText.top + (rcSecondRowText.Height() - szText.cx + 1) / 2;
  514. DrawControlText3(pDC, pButton, strSecondRow, strSecondRowClear, rcSecondRowText, bVert, FALSE);
  515. if (bTrangled)
  516. {
  517. CPoint pt = CPoint(rcSecondRow.CenterPoint().x - 2, rcSecondRowText.top + szText.cx - 4);
  518. DrawDropDownGlyph(pDC, pButton, pt, pButton->GetSelected(), pButton->GetPopuped(), pButton->GetEnabled(), bVert);
  519. }
  520. }
  521. return 0;
  522. }
  523. CSize CXTPPaintManager::DrawControlText(CDC* pDC, CXTPControl* pButton, CRect rcText, BOOL bDraw, BOOL bVert, BOOL bCentered, BOOL bTriangled)
  524. {
  525. CString str = pButton->GetCaption();
  526. CString strClear(str);
  527. StripMnemonics(strClear);
  528. if (!bDraw)
  529. {
  530. CSize sz = pDC->GetTextExtent(strClear.IsEmpty() ? _T(" ") : strClear);
  531. if (bTriangled) sz.cx += m_bOffice2007Padding ? 8 : 10;
  532. return bVert ? CSize(sz.cy, sz.cx) : sz;
  533. }
  534. if (!bVert)
  535. {
  536. int nWidth = pDC->GetTextExtent(strClear).cx + (bTriangled ? 5 : 0);
  537. if (bCentered)
  538. {
  539. rcText.left += (rcText.Width() - nWidth) /2;
  540. }
  541. DrawControlText3(pDC, pButton, str, strClear, rcText, bVert, FALSE);
  542. if (bTriangled)
  543. {
  544. CPoint pt = CPoint(rcText.left + nWidth, rcText.CenterPoint().y);
  545. DrawDropDownGlyph(pDC, pButton, pt, pButton->GetSelected(), pButton->GetPopuped(), pButton->GetEnabled(), bVert);
  546. }
  547. }
  548. else
  549. {
  550. CRect rc(rcText);
  551. CSize szText = pDC->GetTextExtent (strClear);
  552. szText.cx += (bTriangled ? 5 : 0);
  553. rcText.left = rcText.right - (rcText.Width() - szText.cy + 1) / 2;
  554. if (bCentered)
  555. {
  556. rcText.top = rcText.top + (rcText.Height() - szText.cx + 1) / 2;
  557. }
  558. DrawControlText3(pDC, pButton, str, strClear, rcText, bVert, FALSE);
  559. if (bTriangled)
  560. {
  561. CPoint pt = CPoint(rc.CenterPoint().x, rcText.top + szText.cx - 1);
  562. DrawDropDownGlyph(pDC, pButton, pt, pButton->GetSelected(), pButton->GetPopuped(), pButton->GetEnabled(), bVert);
  563. }
  564. }
  565. return 0;
  566. }
  567. void CXTPPaintManager::UseOfficeFont(bool bUseOfficeFont)
  568. {
  569. m_bUseOfficeFont = bUseOfficeFont;
  570. RefreshMetrics();
  571. }
  572. BOOL CXTPPaintManager::FontExists(LPCTSTR strFaceName)
  573. {
  574. return CXTPDrawHelpers::FontExists(strFaceName);
  575. }
  576. void CXTPPaintManager::SetCommandBarsFontIndirect(LOGFONT* pLogFont, BOOL bUseStandardFont /*= FALSE*/)
  577. {
  578. m_bUseStandardFont = bUseStandardFont;
  579. if (!pLogFont)
  580. return;
  581. if (m_bClearTypeTextQuality && XTPSystemVersion()->IsClearTypeTextQualitySupported())
  582. {
  583. pLogFont->lfQuality = 5;
  584. }
  585. m_fontRegular.DeleteObject();
  586. m_fontRegularBold.DeleteObject();
  587. m_fontVert.DeleteObject();
  588. m_fontVertBold.DeleteObject();
  589. m_fontIconBold.DeleteObject();
  590. // see if the Tahoma font was found.
  591. BOOL bTahomaExists = FontExists(m_strOfficeFont);
  592. // see if the system font is set to the Tahoma font, if so set the office font flag to true.
  593. bool bTahomaLF = m_strOfficeFont.CompareNoCase(pLogFont->lfFaceName) == 0;
  594. if (bTahomaLF)
  595. {
  596. m_bUseOfficeFont = true;
  597. }
  598. // set the office font if applicable.
  599. //BOOL bUseSystemFont = (pLogFont->lfCharSet > SYMBOL_CHARSET);
  600. if (bUseStandardFont)
  601. {
  602. if (m_bUseOfficeFont && bTahomaExists)
  603. STRCPY_S(pLogFont->lfFaceName, LF_FACESIZE, m_strOfficeFont);
  604. }
  605. m_fontRegular.CreateFontIndirect (pLogFont);
  606. int nWeight = pLogFont->lfWeight;
  607. pLogFont->lfWeight = FW_BOLD;
  608. m_fontRegularBold.CreateFontIndirect (pLogFont);
  609. pLogFont->lfOrientation = 900;
  610. pLogFont->lfEscapement = 2700;
  611. pLogFont->lfWeight = nWeight;
  612. STRCPY_S(pLogFont->lfFaceName, LF_FACESIZE, CXTPDrawHelpers::GetVerticalFontName(m_bUseOfficeFont));
  613. m_fontVert.CreateFontIndirect (pLogFont);
  614. pLogFont->lfWeight = FW_BOLD;
  615. m_fontVertBold.CreateFontIndirect (pLogFont);
  616. CWindowDC dc (NULL);
  617. CXTPFontDC font(&dc, &m_fontRegular);
  618. m_nTextHeight = dc.GetTextExtent(_T(" "), 1).cy + 6;
  619. }
  620. void CXTPPaintManager::UpdateFonts()
  621. {
  622. CNonClientMetrics ncm;
  623. BYTE lfCharSet = m_bResourceCharSet ? XTPResourceManager()->GetLanguageInfo()->nFontCharSet : ncm.lfMenuFont.lfCharSet;
  624. if (m_bUseStandardFont)
  625. {
  626. CLogFont lf;
  627. lf.lfHeight = ncm.lfMenuFont.lfHeight < 0 ? min(-11, ncm.lfMenuFont.lfHeight) : ncm.lfMenuFont.lfHeight;
  628. lf.lfWeight = ncm.lfMenuFont.lfWeight;
  629. lf.lfItalic = ncm.lfMenuFont.lfItalic;
  630. lf.lfCharSet = lfCharSet;
  631. lf.lfQuality = ncm.lfMenuFont.lfQuality;
  632. STRCPY_S(lf.lfFaceName, LF_FACESIZE, ncm.lfMenuFont.lfFaceName);
  633. if (m_bClearTypeTextQuality && XTPSystemVersion()->IsClearTypeTextQualitySupported())
  634. {
  635. lf.lfQuality = 5;
  636. }
  637. SetCommandBarsFontIndirect(&lf, TRUE);
  638. }
  639. LOGFONT lfIcon;
  640. VERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(lfIcon), &lfIcon, 0));
  641. if (m_bClearTypeTextQuality && XTPSystemVersion()->IsClearTypeTextQualitySupported())
  642. {
  643. lfIcon.lfQuality = 5;
  644. ncm.lfSmCaptionFont.lfQuality = 5;
  645. ncm.lfStatusFont.lfQuality = 5;
  646. }
  647. lfIcon.lfCharSet = lfCharSet;
  648. ncm.lfSmCaptionFont.lfCharSet = lfCharSet;
  649. ncm.lfStatusFont.lfCharSet = lfCharSet;
  650. m_fontSmCaption.SetStandardFont(&ncm.lfSmCaptionFont);
  651. VERIFY(m_fontIcon.SetStandardFont(&lfIcon));
  652. lfIcon.lfWeight = FW_BOLD;
  653. VERIFY(m_fontIconBold.SetStandardFont(&lfIcon));
  654. m_fontToolTip.SetStandardFont(&ncm.lfStatusFont);
  655. }
  656. void CXTPPaintManager::DrawControlEntry(CDC* pDC, CXTPControl* pButton)
  657. {
  658. DrawRectangle(pDC, pButton->GetRect(), pButton->GetSelected(), pButton->GetPressed(), pButton->GetEnabled(), pButton->GetChecked(),
  659. pButton->GetPopuped(), pButton->GetParent()->GetType(), pButton->GetParent()->GetPosition());
  660. }
  661. COLORREF CXTPPaintManager::GetControlTextColor(CXTPControl* pButton)
  662. {
  663. BOOL bEnabled = pButton->GetType() == xtpControlSplitButtonPopup ? (pButton->GetStyle() != xtpButtonIconAndCaptionBelow ?
  664. IsControlCommandEnabled(pButton->GetEnabled()) : IsControlDropDownEnabled(pButton->GetEnabled())) : pButton->GetEnabled();
  665. BOOL bCheckBoxStyle = (pButton->GetType() == xtpControlCheckBox || pButton->GetType() == xtpControlRadioButton)
  666. && (pButton->GetParent()->GetType() != xtpBarTypePopup);
  667. if (bCheckBoxStyle)
  668. return GetRectangleTextColor(FALSE, FALSE, bEnabled, FALSE, FALSE, pButton->GetParent()->GetType(), pButton->GetParent()->GetPosition());
  669. return GetRectangleTextColor(pButton->GetSelected(), pButton->GetPressed(), bEnabled, pButton->GetChecked(),
  670. pButton->GetPopuped(), pButton->GetParent()->GetType(), pButton->GetParent()->GetPosition());
  671. }
  672. int CXTPPaintManager::GetPopupBarGripperWidth(CXTPCommandBar* pBar)
  673. {
  674. if (pBar->GetType() != xtpBarTypePopup)
  675. return 0;
  676. int nDoubleGripper = pBar->IsPopupBar() && ((CXTPPopupBar*)pBar)->IsDoubleGripper() ? 2 : 1;
  677. CSize szImage(GetPopupBarImageSize(pBar));
  678. return szImage.cx * nDoubleGripper + 1;
  679. }
  680. COLORREF CXTPPaintManager::GetControlEditBackColor(CXTPControl* pControl)
  681. {
  682. return GetXtremeColor(pControl->GetEnabled() ? COLOR_WINDOW : COLOR_3DFACE);
  683. }
  684. CSize CXTPPaintManager::DrawControlEdit(CDC* pDC, CXTPControlEdit* pControlEdit, BOOL bDraw)
  685. {
  686. if (bDraw)
  687. {
  688. if (pControlEdit->GetParent()->GetType() == xtpBarTypePopup)
  689. {
  690. DrawControlPopupParent(pDC, pControlEdit, TRUE);
  691. }
  692. else
  693. {
  694. CRect rc = pControlEdit->GetRect();
  695. CRect rcLabelText(rc);
  696. rcLabelText.left += 2;
  697. BOOL bEnabled = pControlEdit->GetEnabled();
  698. if (pControlEdit->IsImageVisible())
  699. {
  700. CSize szIcon = pControlEdit->GetIconSize();
  701. CXTPImageManagerIcon* pImage = pControlEdit->GetImage(szIcon.cx);
  702. szIcon.cy = pImage->GetHeight() * szIcon.cx / pImage->GetWidth();
  703. CPoint pt = CPoint(rc.left + 3, rc.CenterPoint().y - szIcon.cy/2);
  704. DrawImage(pDC, pt, szIcon, pImage, FALSE, FALSE, bEnabled, FALSE, FALSE);
  705. rcLabelText.left = rc.left + szIcon.cx + 6;
  706. }
  707. if (pControlEdit->IsCaptionVisible())
  708. {
  709. CXTPFontDC fontLabel(pDC, GetRegularFont());
  710. pDC->SetTextColor(GetRectangleTextColor(FALSE, FALSE, bEnabled, FALSE, FALSE, pControlEdit->GetParent()->GetType(), pControlEdit->GetParent()->GetPosition()));
  711. DrawControlText(pDC, pControlEdit, rcLabelText, TRUE, FALSE, FALSE, FALSE);
  712. }
  713. }
  714. return 0;
  715. }
  716. BOOL bPopupBar = pControlEdit->GetParent()->GetType() == xtpBarTypePopup;
  717. CString strCaption(pControlEdit->GetCaption());
  718. StripMnemonics(strCaption);
  719. CXTPFontDC font(pDC, GetIconFont());
  720. int nHeight = m_nEditHeight > 0 ? m_nEditHeight : pDC->GetTextExtent(_T(" "), 1).cy + 7;
  721. font.SetFont(GetRegularFont());
  722. BOOL bCaptionVisible = pControlEdit->IsCaptionVisible();
  723. if (bCaptionVisible && m_nEditHeight == 0)
  724. nHeight = max(nHeight, pDC->GetTextExtent(_T(" "), 1).cy + 7);
  725. int nCaptionWidth = pDC->GetTextExtent(strCaption).cx + 5;
  726. if (bPopupBar)
  727. {
  728. int nGripperWidth = GetPopupBarGripperWidth(pControlEdit->GetParent());
  729. pControlEdit->SetLabelWidth(nCaptionWidth + nGripperWidth + m_nPopupBarTextPadding);
  730. return CSize(pControlEdit->GetWidth() + nGripperWidth, nHeight);
  731. }
  732. BOOL bImageVisible = pControlEdit->IsImageVisible();
  733. int nLabelWidth = (bImageVisible ? pControlEdit->GetIconSize().cx  + 4 : 0) +
  734. (bCaptionVisible ? nCaptionWidth : 0);
  735. if (bImageVisible)
  736. nHeight = max(nHeight, pControlEdit->GetButtonSize().cy);
  737. pControlEdit->SetLabelWidth(nLabelWidth);
  738. return CSize(pControlEdit->GetWidth(), nHeight);
  739. }
  740. CSize CXTPPaintManager::DrawControlComboBox(CDC* pDC, CXTPControlComboBox* pControlCombo, BOOL bDraw)
  741. {
  742. if (bDraw)
  743. {
  744. if (pControlCombo->GetParent()->GetType() == xtpBarTypePopup)
  745. {
  746. DrawControlPopupParent(pDC, pControlCombo, TRUE);
  747. }
  748. else
  749. {
  750. CRect rc = pControlCombo->GetRect();
  751. CRect rcLabelText(rc);
  752. rcLabelText.left += 2;
  753. BOOL bEnabled = pControlCombo->GetEnabled();
  754. if (pControlCombo->IsImageVisible())
  755. {
  756. CSize szIcon = pControlCombo->GetIconSize();
  757. CXTPImageManagerIcon* pImage = pControlCombo->GetImage(szIcon.cx);
  758. szIcon.cy = pImage->GetHeight() * szIcon.cx / pImage->GetWidth();
  759. CPoint pt = CPoint(rc.left + 3, rc.CenterPoint().y - szIcon.cy/2);
  760. DrawImage(pDC, pt, szIcon, pImage, FALSE, FALSE, bEnabled, FALSE, FALSE);
  761. rcLabelText.left = rc.left + szIcon.cx + 6;
  762. }
  763. if (pControlCombo->IsCaptionVisible())
  764. {
  765. CXTPFontDC fontLabel(pDC, GetRegularFont());
  766. pDC->SetTextColor(GetRectangleTextColor(FALSE, FALSE, bEnabled, FALSE, FALSE, pControlCombo->GetParent()->GetType(), pControlCombo->GetParent()->GetPosition()));
  767. DrawControlText(pDC, pControlCombo, rcLabelText, TRUE, FALSE, FALSE, FALSE);
  768. }
  769. }
  770. return 0;
  771. }
  772. BOOL bPopupBar = pControlCombo->GetParent()->GetType() == xtpBarTypePopup;
  773. CString strCaption(pControlCombo->GetCaption());
  774. StripMnemonics(strCaption);
  775. CXTPFontDC font(pDC, GetIconFont());
  776. int nHeight = m_nEditHeight > 0 ? m_nEditHeight : max(20, pDC->GetTextExtent(_T(" "), 1).cy + 7);
  777. pControlCombo->SetThumbWidth(max(15, MulDiv(nHeight, 9, 14) + 1));
  778. font.SetFont(GetRegularFont());
  779. BOOL bCaptionVisible = pControlCombo->IsCaptionVisible();
  780. if (bCaptionVisible && m_nEditHeight == 0)
  781. nHeight = max(nHeight, pDC->GetTextExtent(_T(" "), 1).cy + 7);
  782. int nCaptionWidth = pDC->GetTextExtent(strCaption).cx + 5;
  783. if (bPopupBar)
  784. {
  785. int nGripperWidth = GetPopupBarGripperWidth(pControlCombo->GetParent());
  786. pControlCombo->SetLabelWidth(nCaptionWidth + nGripperWidth + m_nPopupBarTextPadding);
  787. return CSize(pControlCombo->GetWidth() + nGripperWidth, nHeight);
  788. }
  789. BOOL bImageVisible = pControlCombo->IsImageVisible();
  790. int nLabelWidth = (bImageVisible ? pControlCombo->GetIconSize().cx  + 4 : 0) +
  791. (bCaptionVisible ? nCaptionWidth : 0);
  792. if (bImageVisible)
  793. nHeight = max(nHeight, pControlCombo->GetParent()->GetButtonSize().cy);
  794. pControlCombo->SetLabelWidth(nLabelWidth);
  795. return CSize(pControlCombo->GetWidth(), nHeight);
  796. }
  797. CSize CXTPPaintManager::DrawControl(CDC* pDC, CXTPControl* pButton, BOOL bDraw)
  798. {
  799. if (pButton->GetType() == xtpControlEdit)
  800. {
  801. return DrawControlEdit(pDC, (CXTPControlEdit*)pButton, bDraw);
  802. }
  803. if (pButton->GetType() == xtpControlComboBox)
  804. {
  805. return DrawControlComboBox(pDC, (CXTPControlComboBox*)pButton, bDraw);
  806. }
  807. return (pButton->GetParent()->GetType() == xtpBarTypePopup) ?
  808. DrawControlPopupParent(pDC, pButton, bDraw): DrawControlToolBarParent(pDC, pButton, bDraw);
  809. }
  810. void CXTPPaintManager::FillDockBar(CDC* pDC, CXTPDockBar* pBar)
  811. {
  812. pDC->FillSolidRect(CXTPClientRect((CWnd*)pBar), GetXtremeColor(COLOR_3DFACE));
  813. }
  814. void CXTPPaintManager::FillMessageBar(CDC* pDC, CXTPMessageBar* pBar)
  815. {
  816. CXTPClientRect rcClient(pBar);
  817. pDC->FillSolidRect(rcClient, GetXtremeColor(COLOR_3DFACE));
  818. CRect rcMessage = pBar->GetMessageRect();
  819. pDC->Draw3dRect(rcMessage, GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_3DSHADOW));
  820. rcMessage.DeflateRect(1, 1);
  821. pDC->FillSolidRect(rcMessage, GetXtremeColor(COLOR_INFOBK));
  822. }
  823. void CXTPPaintManager::DrawMessageBarButton(CDC* pDC, CXTPMessageBarButton* pButton)
  824. {
  825. BOOL bCloseButton = (pButton->m_nID == SC_CLOSE);
  826. CRect rc(pButton->m_rcButton);
  827. if (pButton->m_bPressed)
  828. {
  829. pDC->FillSolidRect(rc, GetXtremeColor(COLOR_3DFACE));
  830. DrawRectangle(pDC, rc, pButton->m_bHot, pButton->m_bPressed, TRUE, FALSE, FALSE, xtpBarTypeNormal, xtpBarTop);
  831. }
  832. else if (pButton->m_bHot)
  833. {
  834. pDC->FillSolidRect(rc, GetXtremeColor(COLOR_3DFACE));
  835. DrawRectangle(pDC, rc, pButton->m_bHot, FALSE, TRUE, FALSE, FALSE, xtpBarTypeNormal, xtpBarTop);
  836. }
  837. else if (!bCloseButton)
  838. {
  839. pDC->FillSolidRect(rc, GetXtremeColor(COLOR_3DFACE));
  840. pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_3DSHADOW));
  841. }
  842. if (bCloseButton)
  843. {
  844. CPoint pt = rc.CenterPoint();
  845. CXTPPenDC pen(pDC, 0);
  846. pDC->MoveTo(pt.x - 4, pt.y - 3);
  847. pDC->LineTo(pt.x + 3, pt.y + 4);
  848. pDC->MoveTo(pt.x - 3, pt.y - 3);
  849. pDC->LineTo(pt.x + 4, pt.y + 4);
  850. pDC->MoveTo(pt.x - 4, pt.y + 3);
  851. pDC->LineTo(pt.x + 3, pt.y - 4);
  852. pDC->MoveTo(pt.x - 3, pt.y + 3);
  853. pDC->LineTo(pt.x + 4, pt.y - 4);
  854. }
  855. }
  856. void CXTPPaintManager::FillStatusBar(CDC* pDC, CXTPStatusBar* pBar)
  857. {
  858. if (m_bThemedStatusBar && m_themeStatusBar.IsAppThemed())
  859. {
  860. m_themeStatusBar.DrawThemeBackground(pDC->GetSafeHdc(), 0, 0, CXTPClientRect((CWnd*)pBar), 0);
  861. }
  862. else
  863. {
  864. pDC->FillSolidRect(CXTPClientRect(pBar), GetXtremeColor(COLOR_3DFACE));
  865. }
  866. }
  867. CFont* CXTPPaintManager::GetCommandBarFont(CXTPCommandBar* pBar, BOOL bBold)
  868. {
  869. return (pBar->GetPosition() == xtpBarLeft || pBar->GetPosition() == xtpBarRight) ? (bBold ? &m_fontVertBold: &m_fontVert) : (bBold ? &m_fontRegularBold : &m_fontRegular);
  870. }
  871. CSize CXTPPaintManager::DrawSpecialControl(CDC* pDC, XTPSpecialControl controlType, CXTPControl* pButton, CXTPCommandBar* pBar, BOOL bDraw, LPVOID lpParam)
  872. {
  873. if (controlType == xtpButtonExpandToolbar)
  874. {
  875. if (!bDraw)
  876. {
  877. CSize szBar = *(CSize*)lpParam;
  878. if (!IsVerticalPosition(pBar->GetPosition()))
  879. pButton->SetRect(CRect(szBar.cx - (11 + 2), 2, szBar.cx - 2, szBar.cy - 2));
  880. else
  881. pButton->SetRect(CRect(2, szBar.cy - (11 + 2), szBar.cx - 2, szBar.cy - 2));
  882. }
  883. else
  884. {
  885. DrawControlEntry(pDC, pButton);
  886. COLORREF clrText = GetControlTextColor(pButton);
  887. BOOL bHiddenExists = *(BOOL*)lpParam;
  888. CRect rcButton = pButton->GetRect();
  889. if (!IsVerticalPosition(pBar->GetPosition()))
  890. {
  891. CPoint pt = CPoint(rcButton.left + rcButton.Width()/2, rcButton.bottom - 6);
  892. Triangle(pDC, CPoint(pt.x -2 , pt.y - 1), CPoint(pt.x + 2, pt.y - 1), CPoint (pt.x, pt.y + 1), clrText);
  893. if (bHiddenExists)
  894. {
  895. CXTPPenDC pen(*pDC, clrText);
  896. pDC->MoveTo(rcButton.left + 2, rcButton.top + 4); pDC->LineTo(rcButton.left + 4, rcButton.top + 6);     pDC->LineTo(rcButton.left + 1, rcButton.top + 9);
  897. pDC->MoveTo(rcButton.left + 3, rcButton.top + 4); pDC->LineTo(rcButton.left + 5, rcButton.top + 6);     pDC->LineTo(rcButton.left + 2, rcButton.top + 9);
  898. pDC->MoveTo(rcButton.left + 6, rcButton.top + 4); pDC->LineTo(rcButton.left + 8, rcButton.top + 6);     pDC->LineTo(rcButton.left + 5, rcButton.top + 9);
  899. pDC->MoveTo(rcButton.left + 7, rcButton.top + 4); pDC->LineTo(rcButton.left + 9, rcButton.top + 6);     pDC->LineTo(rcButton.left + 6, rcButton.top + 9);
  900. }
  901. }
  902. else
  903. {
  904. CPoint pt = CPoint(rcButton.left + 4, rcButton.top + 5);
  905. Triangle(pDC, CPoint(pt.x +2 , pt.y - 2), CPoint(pt.x + 2, pt.y + 2), CPoint (pt.x, pt.y), clrText);
  906. if (bHiddenExists)
  907. {
  908. CXTPPenDC pen(*pDC, clrText);
  909. pDC->MoveTo(rcButton.right - 8, rcButton.top + 2); pDC->LineTo(rcButton.right - 6, rcButton.top + 4);   pDC->LineTo(rcButton.right - 3, rcButton.top + 1);
  910. pDC->MoveTo(rcButton.right - 8, rcButton.top + 3); pDC->LineTo(rcButton.right - 6, rcButton.top + 5);   pDC->LineTo(rcButton.right - 3, rcButton.top + 2);
  911. pDC->MoveTo(rcButton.right - 8, rcButton.top + 6); pDC->LineTo(rcButton.right - 6, rcButton.top + 8);   pDC->LineTo(rcButton.right - 3, rcButton.top + 5);
  912. pDC->MoveTo(rcButton.right - 8, rcButton.top + 7); pDC->LineTo(rcButton.right - 6, rcButton.top + 9);   pDC->LineTo(rcButton.right - 3, rcButton.top + 6);
  913. }
  914. }
  915. }
  916. }
  917. else if (controlType == xtpButtonExpandFloating)
  918. {
  919. DrawControlEntry(pDC, pButton);
  920. CRect rcButton = pButton->GetRect();
  921. COLORREF clrText = GetControlTextColor(pButton);
  922. if (!pButton->GetSelected() && !pButton->GetPopuped())
  923. clrText = m_clrFloatingGripperText;
  924. CPoint pt = CPoint(rcButton.left + rcButton.Width()/2, rcButton.top + rcButton.Height()/2);
  925. Triangle(pDC, CPoint(pt.x -3 , pt.y - 2), CPoint(pt.x + 3, pt.y - 2), CPoint (pt.x, pt.y + 1), clrText);
  926. }
  927. else if (controlType == xtpButtonHideFloating)
  928. {
  929. CFont font;
  930. font.CreatePointFont(MulDiv(80, 96, pDC->GetDeviceCaps(LOGPIXELSX)), _T("Marlett"));
  931. CFont* pFont = pDC->SelectObject(&font);
  932. DrawControlEntry(pDC, pButton);
  933. if (!pButton->GetPressed() && !pButton->GetSelected())
  934. pDC->SetTextColor(m_clrFloatingGripperText);
  935. else
  936. pDC->SetTextColor(GetControlTextColor(pButton));
  937. pDC->DrawText(_T("r"), 1, pButton->GetRect(), DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  938. pDC->SelectObject(pFont);
  939. }
  940. else if (controlType == xtpButtonExpandMenu)
  941. {
  942. if (bDraw)
  943. {
  944. DrawControlEntry(pDC, pButton);
  945. CRect rcButton = pButton->GetRect();
  946. int nCenter = rcButton.CenterPoint().x;
  947. CXTPPenDC pen(pDC->GetSafeHdc(), 0);
  948. pDC->MoveTo(nCenter - 2, rcButton.top + 2); pDC->LineTo(nCenter, rcButton.top + 4);     pDC->LineTo(nCenter + 3, rcButton.top + 1);
  949. pDC->MoveTo(nCenter - 2, rcButton.top + 3); pDC->LineTo(nCenter, rcButton.top + 5);     pDC->LineTo(nCenter + 3, rcButton.top + 2);
  950. pDC->MoveTo(nCenter - 2, rcButton.top + 6); pDC->LineTo(nCenter, rcButton.top + 8);     pDC->LineTo(nCenter + 3, rcButton.top + 5);
  951. pDC->MoveTo(nCenter - 2, rcButton.top + 7); pDC->LineTo(nCenter, rcButton.top + 9);     pDC->LineTo(nCenter + 3, rcButton.top + 6);
  952. }
  953. return CSize(0, 12);
  954. }
  955. return 0;
  956. }
  957. CSize CXTPPaintManager::DrawControlText(CDC* pDC, CXTPControl* pButton, CRect rcText, BOOL bDraw, BOOL bTriangled, CSize szButton, BOOL bDrawImage)
  958. {
  959. BOOL bVert = pButton->GetParent()->GetPosition() == xtpBarRight || pButton->GetParent()->GetPosition() == xtpBarLeft;
  960. if (!bVert)
  961. {
  962. if (bDrawImage)
  963. {
  964. rcText.left += m_bOffice2007Padding ? szButton.cx : szButton.cx - 1;
  965. CSize sz = DrawControlText(pDC, pButton, &rcText, bDraw, bVert, FALSE, bTriangled);
  966. return CSize((m_bOffice2007Padding ? 4 : 3) + sz.cx + szButton.cx, max(sz.cy + 6, szButton.cy));
  967. }
  968. else
  969. {
  970. CSize sz = DrawControlText(pDC, pButton, &rcText, bDraw, bVert, TRUE, bTriangled);
  971. return CSize(8 + sz.cx, max(sz.cy + 6, szButton.cy));
  972. }
  973. }
  974. else
  975. {
  976. if (bDrawImage)
  977. {
  978. rcText.top += szButton.cy;
  979. CSize sz = DrawControlText(pDC, pButton, &rcText, bDraw, bVert, FALSE, bTriangled);
  980. return CSize(max(sz.cx + 6, szButton.cx), 3 + sz.cy + szButton.cx);
  981. }
  982. else
  983. {
  984. CSize sz = DrawControlText(pDC, pButton, &rcText, bDraw, bVert, TRUE, bTriangled);
  985. return CSize(max(sz.cx + 6, szButton.cx), 8 + sz.cy);
  986. }
  987. }
  988. }
  989. CRect CXTPPaintManager::GetSplitButtonCommandRect(CXTPControl* pButton)
  990. {
  991. CRect rc(pButton->GetRect());
  992. CXTPCommandBar* pParent = pButton->GetParent();
  993. if (pParent->GetType() != xtpBarTypePopup && pButton->GetStyle() == xtpButtonIconAndCaptionBelow)
  994. {
  995. int nSplitDropDownHeight = GetSplitDropDownHeight();
  996. BOOL bVert = pParent->GetPosition() == xtpBarLeft ||
  997. pParent->GetPosition() == xtpBarRight;
  998. return bVert ? CRect(rc.left + nSplitDropDownHeight, rc.top, rc.right, rc.bottom) :
  999. CRect(rc.left, rc.top, rc.right, rc.bottom - nSplitDropDownHeight);
  1000. }
  1001. int nSize = pParent->GetType() == xtpBarTypePopup ? m_nSplitButtonPopupWidth : m_nSplitButtonDropDownWidth + 1;
  1002. return CRect(rc.left, rc.top, rc.right - nSize, rc.bottom);
  1003. }
  1004. CSize CXTPPaintManager::DrawControlCheckBoxMark(CDC* pDC, CRect rc, BOOL bDraw, BOOL bSelected, BOOL bPressed, BOOL bChecked, BOOL bEnabled)
  1005. {
  1006. if (bDraw)
  1007. {
  1008. if (m_bThemedCheckBox && m_themeButton.IsAppThemed())
  1009. {
  1010. int nState = 0;
  1011. if (!bEnabled)
  1012. nState = 3;
  1013. else if (bSelected && bPressed)
  1014. nState = 2;
  1015. else if (bSelected)
  1016. nState = 1;
  1017. if (bChecked == 1)
  1018. nState += 4;
  1019. if (bChecked == 2)
  1020. nState += 8;
  1021. m_themeButton.DrawThemeBackground(pDC->GetSafeHdc(), BP_CHECKBOX, nState + 1, rc, 0);
  1022. }
  1023. else
  1024. {
  1025. pDC->DrawFrameControl(rc, DFC_BUTTON, DFCS_BUTTONCHECK |
  1026. (!bEnabled || bChecked == 2 ? DFCS_INACTIVE : 0) | (bChecked ? DFCS_CHECKED : 0) |
  1027. (bPressed ? DFCS_PUSHED : 0));
  1028. }
  1029. }
  1030. return CSize(13, 13);
  1031. }
  1032. CSize CXTPPaintManager::DrawControlRadioButtonMark(CDC* pDC, CRect rc, BOOL bDraw, BOOL bSelected, BOOL bPressed, BOOL bChecked, BOOL bEnabled)
  1033. {
  1034. if (bDraw)
  1035. {
  1036. if (m_bThemedCheckBox && m_themeButton.IsAppThemed())
  1037. {
  1038. int nState = 0;
  1039. if (!bEnabled)
  1040. nState = 3;
  1041. else if (bSelected && bPressed)
  1042. nState = 2;
  1043. else if (bSelected)
  1044. nState = 1;
  1045. if (bChecked == 1)
  1046. nState += 4;
  1047. if (bChecked == 2)
  1048. nState += 8;
  1049. m_themeButton.DrawThemeBackground(pDC->GetSafeHdc(), BP_RADIOBUTTON, nState + 1, rc, 0);
  1050. }
  1051. else
  1052. {
  1053. pDC->DrawFrameControl(rc, DFC_BUTTON, DFCS_BUTTONRADIO |
  1054. (!bEnabled || bChecked == 2 ? DFCS_INACTIVE : 0) | (bChecked ? DFCS_CHECKED : 0) |
  1055. (bPressed ? DFCS_PUSHED : 0));
  1056. }
  1057. }
  1058. return CSize(13, 13);
  1059. }
  1060. CSize CXTPPaintManager::GetControlSize(CXTPControl* pControl, CSize sz, BOOL bVert)
  1061. {
  1062. if (bVert)
  1063. {
  1064. if (pControl->GetWidth() > 0)
  1065. sz.cy = pControl->GetWidth();
  1066. if (pControl->GetHeight() > 0)
  1067. sz.cx = pControl->GetHeight();
  1068. }
  1069. else
  1070. {
  1071. if (pControl->GetWidth() > 0)
  1072. sz.cx = pControl->GetWidth();
  1073. if (pControl->GetHeight() > 0)
  1074. sz.cy = pControl->GetHeight();
  1075. }
  1076. return sz;
  1077. }
  1078. CSize CXTPPaintManager::GetPopupBarImageSize(CXTPCommandBar* pBar)
  1079. {
  1080. CSize szIcon = pBar->GetIconSize();
  1081. CSize szImage(max(szIcon.cx + 4, m_nTextHeight + 4), max(szIcon.cy + 6, m_nTextHeight));
  1082. return szImage;
  1083. }
  1084. void CXTPPaintManager::DrawPopupBarText(CDC* pDC, const CString& strText, CRect& rcText, UINT nFlags, BOOL bDraw, BOOL bSelected, BOOL bEnabled)
  1085. {
  1086. if (bDraw && !bEnabled && !bSelected && m_bEmbossedDisabledText)
  1087. {
  1088. COLORREF clrText = pDC->GetTextColor();
  1089. pDC->SetTextColor(GetXtremeColor(COLOR_3DHIGHLIGHT));
  1090. pDC->DrawText(strText, rcText + CPoint(1, 1), DT_SINGLELINE | DT_VCENTER | nFlags);
  1091. pDC->SetTextColor(clrText);
  1092. }
  1093. pDC->DrawText(strText, &rcText, DT_SINGLELINE | DT_VCENTER | (!bDraw ? DT_CALCRECT : nFlags));
  1094. }
  1095. CSize CXTPPaintManager::DrawControlPopupParent(CDC* pDC, CXTPControl* pButton, BOOL bDraw)
  1096. {
  1097. CXTPCommandBar* pParent = pButton->GetParent();
  1098. CRect rcText(0, 0, 0, 0), rcShortcut(0, 0, 0, 0);
  1099. CRect rcButton = pButton->GetRect();
  1100. XTPControlType controlType = pButton->GetType();
  1101. XTPButtonStyle buttonStyle = pButton->GetStyle();
  1102. CString strCaption = pButton->GetCaption();
  1103. BOOL bDrawImage = (buttonStyle == xtpButtonAutomatic && controlType != xtpControlPopup) ||
  1104. (buttonStyle != xtpButtonCaption);
  1105. CSize szImage(GetPopupBarImageSize(pParent));
  1106. int nGripperWidth = GetPopupBarGripperWidth(pParent) - 1;
  1107. BOOL bSelected = pButton->GetSelected(), bEnabled = pButton->GetEnabled();
  1108. if (controlType == xtpControlSplitButtonPopup && bEnabled == TRUE_SPLITDROPDOWN)
  1109. bEnabled = FALSE;
  1110. if (pButton->GetType() == xtpControlLabel && !m_bOffsetPopupLabelText)
  1111. nGripperWidth = 0;
  1112. if (pButton->GetType() == xtpControlLabel && !bDrawImage)
  1113. szImage.cy = m_nTextHeight;
  1114. if (bDraw)
  1115. {
  1116. rcText.SetRect(rcButton.left + nGripperWidth + m_nPopupBarTextPadding, rcButton.top, rcButton.right, rcButton.bottom);
  1117. rcShortcut.SetRect(rcButton.left + nGripperWidth + 8, rcButton.top, rcButton.right - 19, rcButton.bottom);
  1118. if (controlType == xtpControlButton && pButton->GetShortcutText().GetLength() != 0)
  1119. rcText.right -= pDC->GetTextExtent(pButton->GetShortcutText()).cx + 19;
  1120. }
  1121. BOOL bShowKeyboardCues = pParent->IsKeyboardCuesVisible();
  1122. if (!bShowKeyboardCues)
  1123. StripMnemonics(strCaption);
  1124. if (buttonStyle == xtpButtonCaptionAndDescription && !pButton->GetDescription().IsEmpty())
  1125. {
  1126. {
  1127. CXTPFontDC font(pDC, GetRegularBoldFont());
  1128. if (bDraw)
  1129. {
  1130. rcShortcut.bottom = rcText.bottom = rcText.top + pDC->GetTextExtent(_T(" "), 1).cy + 10;
  1131. }
  1132. DrawPopupBarText(pDC, strCaption, rcText, DT_END_ELLIPSIS | (!bShowKeyboardCues ? DT_NOPREFIX : 0), bDraw, bSelected, bEnabled);
  1133. if (controlType == xtpControlButton && pButton->GetShortcutText().GetLength() != 0)
  1134. DrawPopupBarText(pDC, pButton->GetShortcutText(), rcShortcut, DT_RIGHT, bDraw, bSelected, bEnabled);
  1135. }
  1136. if (bDraw)
  1137. {
  1138. CRect rcDescription(rcText.left, rcText.bottom - 2, rcButton.right - 10, rcButton.bottom);
  1139. pDC->DrawText(pButton->GetDescription(),rcDescription, DT_WORDBREAK | DT_TOP | DT_NOPREFIX);
  1140. }
  1141. else
  1142. {
  1143. CSize szDescription = pDC->GetTextExtent(pButton->GetDescription());
  1144. CRect rcDescription(0, 0, (szDescription.cx + 20) / 2, 0);
  1145. pDC->DrawText(_T("1n2"), rcDescription, DT_CALCRECT | DT_WORDBREAK);
  1146. int nWidth = nGripperWidth + m_nPopupBarTextPadding + rcText.Width() +  rcShortcut.Width() + 32;
  1147. return GetControlSize(pButton, CSize(max(nWidth, nGripperWidth + m_nPopupBarTextPadding + szDescription.cx / 2 + 32),
  1148. max(szImage.cy, rcDescription.Height() + rcText.Height() + 19)), FALSE);
  1149. }
  1150. return 0;
  1151. }
  1152. DrawPopupBarText(pDC, strCaption, rcText, DT_END_ELLIPSIS | (!bShowKeyboardCues ? DT_NOPREFIX : 0), bDraw, bSelected, bEnabled);
  1153. if (controlType == xtpControlButton && pButton->GetShortcutText().GetLength() != 0)
  1154. DrawPopupBarText(pDC, pButton->GetShortcutText(), rcShortcut, DT_RIGHT, bDraw, bSelected, bEnabled);
  1155. return GetControlSize(pButton, CSize(nGripperWidth + m_nPopupBarTextPadding + rcText.Width() +  rcShortcut.Width() + 32, szImage.cy), FALSE);
  1156. }
  1157. CSize CXTPPaintManager::GetIconSize(CXTPControl* pButton)
  1158. {
  1159. XTPButtonStyle buttonStyle = pButton->GetStyle();
  1160. CSize szIcon = buttonStyle == xtpButtonIconAndCaptionBelow
  1161. && pButton->GetParent()->GetType() != xtpBarTypePopup ?
  1162. pButton->GetParent()->GetLargeIconSize(TRUE) : pButton->GetIconSize();
  1163. return szIcon;
  1164. }
  1165. int CXTPPaintManager::GetSplitDropDownHeight() const
  1166. {
  1167. int nTextHeight = m_nEditHeight > 0 ? m_nTextHeight : max(22, m_nTextHeight + 3);
  1168. int nSplitDropDownHeight = (nTextHeight * 2 - 17);
  1169. return nSplitDropDownHeight;
  1170. }
  1171. CSize CXTPPaintManager::DrawControlToolBarParent(CDC* pDC, CXTPControl* pButton, BOOL bDraw)
  1172. {
  1173. CXTPFontDC font(pDC, GetCommandBarFont(pButton->GetParent(), pButton->IsItemDefault()));
  1174. CRect rcButton = bDraw ? pButton->GetRect() : CXTPEmptyRect();
  1175. XTPControlType controlType = pButton->GetType();
  1176. XTPButtonStyle buttonStyle = pButton->GetStyle();
  1177. CSize szIcon = GetIconSize(pButton);
  1178. CSize szButton = pButton->GetButtonSize();
  1179. BOOL bVert = pButton->GetParent()->GetPosition() == xtpBarRight || pButton->GetParent()->GetPosition() == xtpBarLeft;
  1180. BOOL bDrawImage = (buttonStyle == xtpButtonAutomatic && controlType != xtpControlPopup) ||
  1181. (buttonStyle == xtpButtonIcon) || (buttonStyle == xtpButtonIconAndCaption) || (buttonStyle == xtpButtonIconAndCaptionBelow);
  1182. CXTPImageManagerIcon* pImage = (bDrawImage && pButton->GetIconId() != 0) ? pButton->GetImage(szIcon.cx) : NULL;
  1183. bDrawImage = bDrawImage && (pImage != NULL);
  1184. BOOL bDrawText = pButton->IsCaptionVisible();
  1185. BOOL bPressed = pButton->GetPressed(), bSelected = pButton->GetSelected(), bEnabled = pButton->GetEnabled(), bChecked = pButton->GetChecked(),
  1186. bPopuped = pButton->GetPopuped();
  1187. if (controlType == xtpControlSplitButtonPopup && bEnabled == TRUE_SPLITDROPDOWN)
  1188. bEnabled = FALSE;
  1189. if (controlType == xtpControlCheckBox || controlType == xtpControlRadioButton)
  1190. {
  1191. CSize szCheckBox = controlType == xtpControlRadioButton ?
  1192. DrawControlRadioButtonMark(pDC, rcButton, FALSE, bSelected, bPressed, bChecked, bEnabled) :
  1193. DrawControlCheckBoxMark(pDC, rcButton, FALSE, bSelected, bPressed, bChecked, bEnabled);
  1194. if (bDraw)
  1195. {
  1196. pDC->SetTextColor(GetControlTextColor(pButton));
  1197. CRect rcCheck;
  1198. if (!bVert)
  1199. {
  1200. rcCheck = CRect(CPoint(rcButton.left + 3, (rcButton.bottom + rcButton.top - szCheckBox.cy)/2), szCheckBox);
  1201. rcButton.left += szCheckBox.cx + 5;
  1202. }
  1203. else
  1204. {
  1205. rcCheck = CRect(CPoint(rcButton.CenterPoint().x - szCheckBox.cx / 2, rcButton.top + 3), szCheckBox);
  1206. rcButton.top += szCheckBox.cy + 5;
  1207. }
  1208. if (controlType == xtpControlRadioButton)
  1209. DrawControlRadioButtonMark(pDC, rcCheck, TRUE, bSelected, bPressed, bChecked, bEnabled);
  1210. else
  1211. DrawControlCheckBoxMark(pDC, rcCheck, TRUE, bSelected, bPressed, bChecked, bEnabled);
  1212. DrawControlText(pDC, pButton, rcButton, bDraw, FALSE, szButton, FALSE);
  1213. if (IsKeyboardSelected(bSelected))
  1214. {
  1215. pDC->SetTextColor(GetXtremeColor(COLOR_BTNTEXT));
  1216. pDC->SetBkColor(GetXtremeColor(COLOR_BTNFACE));
  1217. pDC->DrawFocusRect(rcButton);
  1218. }
  1219. return GetControlSize(pButton, szCheckBox, bVert);
  1220. }
  1221. else
  1222. {
  1223. CSize sz = DrawControlText(pDC, pButton, rcButton, bDraw, FALSE, szButton, FALSE);
  1224. if (bVert)
  1225. sz.cy += szCheckBox.cy + 5;
  1226. else
  1227. sz.cx += szCheckBox.cx + 5;
  1228. return GetControlSize(pButton, sz, bVert);
  1229. }
  1230. }
  1231. if (bDraw)
  1232. {
  1233. if (controlType != xtpControlSplitButtonPopup)
  1234. {
  1235. if (!pButton->IsTransparent())
  1236. {
  1237. DrawControlEntry(pDC, pButton);
  1238. }
  1239. }
  1240. else
  1241. {
  1242. DrawSplitButtonFrame(pDC, pButton, rcButton);
  1243. }
  1244. pDC->SetTextColor(GetControlTextColor(pButton));
  1245. }
  1246. if (buttonStyle == xtpButtonIconAndCaptionBelow)
  1247. {
  1248. BOOL bTriangled = pButton->GetCommandBar() != NULL;
  1249. int nTextHeight = GetControlHeight();
  1250. int nSplitDropDownHeight = GetSplitDropDownHeight();
  1251. szButton = CSize(max(42, nTextHeight * 2 - 3),
  1252. m_nEditHeight > 0 ? m_nEditHeight * 3 : nSplitDropDownHeight + szIcon.cy + 7);
  1253. if (bVert) szButton = CSize(szButton.cy, szButton.cx);
  1254. if (bDraw)
  1255. {
  1256. if (bDrawImage)
  1257. {
  1258. CPoint pt = bVert ? CPoint(rcButton.left + 4 + nSplitDropDownHeight, rcButton.CenterPoint().y - szIcon.cy / 2) :
  1259. CPoint(rcButton.CenterPoint().x - szIcon.cx / 2, rcButton.top + 3);
  1260. DrawImage(pDC, pt, CSize(szIcon.cx, 0), pImage, bSelected, bPressed, bEnabled, bChecked, bPopuped);
  1261. }
  1262. CRect rcText = rcButton;
  1263. if (bVert)
  1264. rcText.right = rcText.left + nSplitDropDownHeight;
  1265. else
  1266. {
  1267. rcText.bottom -= 1;
  1268. rcText.top = rcText.bottom - nSplitDropDownHeight;
  1269. }
  1270. DrawControlText2(pDC, pButton, rcText, TRUE, bVert, bTriangled);
  1271. }
  1272. else
  1273. {
  1274. CSize szText = DrawControlText2(pDC, pButton, CXTPEmptyRect(), FALSE, bVert, bTriangled);
  1275. if (bVert)
  1276. {
  1277. szButton.cy = max(szButton.cy, szText.cy + 6);
  1278. }
  1279. else
  1280. {
  1281. szButton.cx = max(szButton.cx, szText.cx + 5);
  1282. }
  1283. }
  1284. return GetControlSize(pButton, szButton, bVert);
  1285. }
  1286. if (pButton->GetParent()->IsTextBelowIcons() && bDrawImage)
  1287. {
  1288. CXTPFontDC fontHorizontal (pDC, pButton->IsItemDefault() ? &m_fontRegularBold : &m_fontRegular);
  1289. BOOL bTriangled = controlType == xtpControlPopup;
  1290. if (bDraw)
  1291. {
  1292. if (controlType == xtpControlSplitButtonPopup) rcButton.right -= m_nSplitButtonDropDownWidth;
  1293. CPoint pt = CPoint(rcButton.CenterPoint().x - szIcon.cx / 2, rcButton.top + 4);
  1294. DrawImage(pDC, pt, CSize(szIcon.cx, 0), pImage, bSelected, bPressed, bEnabled, bChecked, bPopuped);
  1295. CRect rcText = rcButton;
  1296. rcText.top += szButton.cy - 4;
  1297. DrawControlText(pDC, pButton, rcText, TRUE, FALSE, TRUE, bTriangled);
  1298. }
  1299. else
  1300. {
  1301. CSize szText = DrawControlText(pDC, pButton, CXTPEmptyRect(), FALSE, FALSE, TRUE, bTriangled);
  1302. szButton.cy += szText.cy;
  1303. szButton.cx = max(szButton.cx, szText.cx + 10);
  1304. if (pButton->GetType() == xtpControlSplitButtonPopup)
  1305. szButton.cx += 11;
  1306. szButton.cx = max(szButton.cx, szButton.cy);
  1307. }
  1308. return GetControlSize(pButton, szButton, bVert);
  1309. }
  1310. if (bDraw && pImage)
  1311. {
  1312. szIcon.cy = pImage->GetHeight() * szIcon.cx / pImage->GetWidth();
  1313. CPoint pt = !bVert ? CPoint(rcButton.left + 3, rcButton.CenterPoint().y - szIcon.cy / 2) :
  1314. CPoint(rcButton.CenterPoint().x - szIcon.cx / 2, rcButton.top + 3);
  1315. if (controlType == xtpControlSplitButtonPopup) pt.x = rcButton.left + 3;
  1316. if (controlType == xtpControlPopup && bDrawImage && !bDrawText) pt.x = rcButton.left + 3;
  1317. if ((controlType == xtpControlButtonPopup || controlType == xtpControlButton) && bDrawImage && !bDrawText)
  1318. {
  1319. if (!bVert)
  1320. pt.x = rcButton.CenterPoint().x - szIcon.cx / 2;
  1321. else
  1322. pt.y = rcButton.CenterPoint().y - szIcon.cy / 2;
  1323. }
  1324. pImage->m_bDrawComposited = pButton->HasDwmCompositedRect();
  1325. DrawImage(pDC, pt, szIcon, pImage, bSelected, bPressed, bEnabled, bChecked, bPopuped);
  1326. pImage->m_bDrawComposited = FALSE;
  1327. }
  1328. switch (controlType)
  1329. {
  1330. case xtpControlPopup:
  1331. {
  1332. if (!bDrawImage)
  1333. {
  1334. CSize sz = DrawControlText(pDC, pButton, rcButton, bDraw, bVert, TRUE, !bDraw || pButton->GetParent()->GetType() != xtpBarTypeMenuBar);
  1335. return GetControlSize(pButton, CSize(sz.cx + 6, sz.cy + 6), bVert);
  1336. }
  1337. else
  1338. {
  1339. if (!bDrawText)
  1340. {
  1341. CPoint pt = CPoint(rcButton.right - 7, rcButton.CenterPoint().y);
  1342. DrawDropDownGlyph(pDC, pButton, pt, pButton->GetSelected(), pButton->GetPopuped(), pButton->GetEnabled(), FALSE);
  1343. return GetControlSize(pButton, CSize(szButton.cy + 7, szButton.cy), bVert);
  1344. }
  1345. return GetControlSize(pButton, DrawControlText(pDC, pButton, rcButton, bDraw, pButton->GetParent()->GetType() != xtpBarTypeMenuBar, szButton, bDrawImage), bVert);
  1346. }
  1347. }
  1348. case xtpControlSplitButtonPopup:
  1349. {
  1350. if (!bDrawImage) szButton = CSize(22, 22);
  1351. if (!bDrawText)
  1352. return GetControlSize(pButton, CSize(szButton.cx + m_nSplitButtonDropDownWidth, szButton.cy), bVert);
  1353. rcButton.right -= m_nSplitButtonDropDownWidth;
  1354. CSize sz = DrawControlText(pDC, pButton, rcButton, bDraw, FALSE, szButton, bDrawImage);
  1355. return GetControlSize(pButton, CSize(sz.cx + m_nSplitButtonDropDownWidth, sz.cy), bVert);
  1356. }
  1357. case xtpControlButtonPopup:
  1358. case xtpControlButton:
  1359. case xtpControlLabel:
  1360. case xtpControlCheckBox:
  1361. case xtpControlGallery:
  1362. {
  1363. if (!bDrawText)
  1364. return GetControlSize(pButton, szButton, bVert);
  1365. if (!bDrawImage) szButton = CSize(22, szButton.cy);
  1366. return GetControlSize(pButton, DrawControlText(pDC, pButton, rcButton, bDraw, FALSE, szButton, bDrawImage), bVert);
  1367. }
  1368. }
  1369. return 0;
  1370. }
  1371. CRect CXTPPaintManager::GetCommandBarBorders(CXTPCommandBar* /*pBar*/)
  1372. {
  1373. return CRect(2, 2, 2, 2);
  1374. }
  1375. void CXTPPaintManager::GradientFill(CDC* pDC, LPRECT lpRect, COLORREF crFrom, COLORREF crTo, BOOL bHorz, LPCRECT lpRectClip)
  1376. {
  1377. XTPDrawHelpers()->GradientFill(pDC, lpRect, crFrom, crTo, bHorz, lpRectClip);
  1378. }
  1379. void CXTPPaintManager::DrawStatusBarGripper(CDC* pDC, CRect rcClient)
  1380. {
  1381. if (m_bThemedStatusBar && m_themeStatusBar.IsAppThemed())
  1382. {
  1383. CRect rcGripper(rcClient.right - 18, rcClient.top, rcClient.right, rcClient.bottom);
  1384. m_themeStatusBar.DrawThemeBackground(pDC->GetSafeHdc(), SP_GRIPPER, 0, &rcGripper, 0);
  1385. }
  1386. else
  1387. {
  1388. CXTPPenDC penBorder(*pDC, GetXtremeColor(COLOR_3DSHADOW));
  1389. int i;
  1390. for (i = 0; i < 3; i++)
  1391. {
  1392. pDC->MoveTo(rcClient.Width() - 3 -i * 4, rcClient.Height() - 2);
  1393. pDC->LineTo(rcClient.Width() - 1, rcClient.Height() - 4 - i * 4);
  1394. pDC->MoveTo(rcClient.Width() - 4 -i * 4, rcClient.Height() - 2);
  1395. pDC->LineTo(rcClient.Width() - 1, rcClient.Height() - 4 - i * 4 - 1);
  1396. }
  1397. CXTPPenDC penBorderWhite(*pDC, GetXtremeColor(COLOR_BTNHIGHLIGHT));
  1398. for (i = 0; i < 3; i++)
  1399. {
  1400. pDC->MoveTo(rcClient.Width() - 5 -i * 4, rcClient.Height() - 2);
  1401. pDC->LineTo(rcClient.Width() - 1 , rcClient.Height() - 4 - i * 4 - 2);
  1402. }
  1403. }
  1404. }
  1405. void CXTPPaintManager::AnimateExpanding(CXTPCommandBar* pCommandBar, CDC* pDestDC, CDC* pSrcDC, BOOL bExpandDown)
  1406. {
  1407. CXTPClientRect rc(pCommandBar);
  1408. int nWidth = rc.Width();
  1409. int nHeight = rc.Height();
  1410. int nSteps = m_nAnimationSteps;
  1411. int nAnimationTime = m_nAnimationTime;
  1412. CXTPControls* pControls = pCommandBar->GetControls();
  1413. for (int i = 0; i < nSteps; ++i)
  1414. {
  1415. double dPercent = double(i + 1) / nSteps;
  1416. int nTopDest = 0;
  1417. int nTopSrc = 0;
  1418. BOOL bPrevExpanded = FALSE;
  1419. if (bExpandDown)
  1420. {
  1421. for (int j = 0; j < pControls->GetCount(); ++j)
  1422. {
  1423. CXTPControl* pControl = pControls->GetAt(j);
  1424. if (!pControl->IsVisible())
  1425. continue;
  1426. BOOL bExpanded = pControl->GetExpanded();
  1427. if (bExpanded != bPrevExpanded)
  1428. {
  1429. int nTopSrcCurrent = pControl->GetRect().top;
  1430. int nHeightDstr = int((bPrevExpanded ? dPercent : 1) * (nTopSrcCurrent - nTopSrc));
  1431. pDestDC->StretchBlt(0, nTopDest, nWidth, nHeightDstr, pSrcDC,
  1432. 0, nTopSrc, nWidth, nTopSrcCurrent - nTopSrc, SRCCOPY);
  1433. nTopDest = nTopDest + nHeightDstr;
  1434. nTopSrc = nTopSrcCurrent;
  1435. }
  1436. bPrevExpanded = bExpanded;
  1437. }
  1438. int nTopSrcCurrent = nHeight;
  1439. int nHeightDstr = int((bPrevExpanded ? dPercent : 1) * (nTopSrcCurrent - nTopSrc));
  1440. pDestDC->StretchBlt(0, nTopDest, nWidth, nHeightDstr, pSrcDC,
  1441. 0, nTopSrc, nWidth, nTopSrcCurrent - nTopSrc, SRCCOPY);
  1442. }
  1443. else
  1444. {
  1445. for (int j = pControls->GetCount() - 1; j >= 0; j--)
  1446. {
  1447. CXTPControl* pControl = pControls->GetAt(j);
  1448. if (!pControl->IsVisible())
  1449. continue;
  1450. BOOL bExpanded = pControl->GetExpanded();
  1451. if (bExpanded != bPrevExpanded)
  1452. {
  1453. int nTopSrcCurrent = nHeight - pControl->GetRect().bottom;
  1454. int nHeightDstr = int((bPrevExpanded ? dPercent : 1) * (nTopSrcCurrent - nTopSrc));
  1455. pDestDC->StretchBlt(0, nHeight - nTopDest - nHeightDstr, nWidth, nHeightDstr, pSrcDC,
  1456. 0, nHeight - nTopSrcCurrent, nWidth, nTopSrcCurrent - nTopSrc, SRCCOPY);
  1457. nTopDest = nTopDest + nHeightDstr;
  1458. nTopSrc = nTopSrcCurrent;
  1459. }
  1460. bPrevExpanded = bExpanded;
  1461. }
  1462. int nTopSrcCurrent = nHeight;
  1463. int nHeightDstr = int((bPrevExpanded ? dPercent : 1) * (nTopSrcCurrent - nTopSrc));
  1464. pDestDC->StretchBlt(0, nHeight - nTopDest - nHeightDstr, nWidth, nHeightDstr, pSrcDC,
  1465. 0, nHeight - nTopSrcCurrent, nWidth, nTopSrcCurrent - nTopSrc, SRCCOPY);
  1466. }
  1467. Sleep(nAnimationTime / nSteps);
  1468. }
  1469. }
  1470. void CXTPPaintManager::AlphaBlendU(PBYTE pDest, PBYTE pSrcBack, int cx, int cy, PBYTE pSrc, BYTE byAlpha)
  1471. {
  1472. const BYTE byDiff = (BYTE)(255 - byAlpha);
  1473. for (int i = 0; i < cx * cy; i++)
  1474. {
  1475. pDest[0] = (BYTE)((pSrcBack[0] * byDiff + pSrc[0] * byAlpha) >> 8);
  1476. pDest[1] = (BYTE)((pSrcBack[1] * byDiff + pSrc[1] * byAlpha) >> 8);
  1477. pDest[2] = (BYTE)((pSrcBack[2] * byDiff + pSrc[2] * byAlpha) >> 8);
  1478. pDest += 4;
  1479. pSrcBack += 4;
  1480. pSrc += 4;
  1481. }
  1482. }
  1483. void CXTPPaintManager::Animate(CDC* pDestDC, CDC* pSrcDC, CRect rc, XTPAnimationType animationType)
  1484. {
  1485. int nSteps = m_nAnimationSteps;
  1486. int nAnimationTime = m_nAnimationTime;
  1487. switch (animationType)
  1488. {
  1489. case xtpAnimateSlide:
  1490. {
  1491. for (int i = 0; i < nSteps; ++i)
  1492. {
  1493. int nHeight = rc.Height() * (i + 1) / nSteps;
  1494. pDestDC->BitBlt(0, 0, rc.Width(), nHeight, pSrcDC,
  1495. 0, rc.Height() - nHeight, SRCCOPY);
  1496. Sleep(nAnimationTime / nSteps);
  1497. }
  1498. }
  1499. break;
  1500. case xtpAnimateUnfold:
  1501. {
  1502. for (int i = 0; i < nSteps; ++i)
  1503. {
  1504. CRect rcDest(rc.right - rc.Width() * (i + 1) / nSteps, rc.bottom - rc.Height() * (i + 1) / nSteps, rc.right, rc.bottom);
  1505. pDestDC->BitBlt(0, 0, rcDest.Width(), rcDest.Height(), pSrcDC,
  1506. rcDest.left, rcDest.top, SRCCOPY);
  1507. Sleep(nAnimationTime / nSteps);
  1508. }
  1509. }
  1510. break;
  1511. case xtpAnimateFade:
  1512. {
  1513. const int cx = rc.Width();
  1514. const int cy = rc.Height();
  1515. BITMAPINFOHEADER BMI;
  1516. // Fill in the header info.
  1517. ZeroMemory (&BMI, sizeof(BMI));
  1518. BMI.biSize = sizeof(BITMAPINFOHEADER);
  1519. BMI.biWidth = cx;
  1520. BMI.biHeight = cy;
  1521. BMI.biPlanes = 1;
  1522. BMI.biBitCount = 32;
  1523. BMI.biCompression = BI_RGB;   // No compression
  1524. BYTE * pSrcBits = NULL;
  1525. HBITMAP hbmSrc = CreateDIBSection (NULL, (BITMAPINFO *)&BMI, DIB_RGB_COLORS, (void **)&pSrcBits, 0, 0l);
  1526. BYTE * pSrcBackBits = NULL;
  1527. HBITMAP hbmSrcBack = CreateDIBSection (NULL, (BITMAPINFO *)&BMI, DIB_RGB_COLORS, (void **)&pSrcBackBits, 0, 0l);
  1528. BYTE * pDestBits = NULL;
  1529. HBITMAP hbmDest = CreateDIBSection (NULL, (BITMAPINFO *)&BMI, DIB_RGB_COLORS, (void **)&pDestBits, 0, 0l);
  1530. // Copy our source and destination bitmaps onto our DIBSections,
  1531. // so we can get access to their bits using the BYTE *'s we passed into CreateDIBSection
  1532. CDC dc;
  1533. dc.CreateCompatibleDC(NULL);
  1534. HBITMAP hbmpOld = (HBITMAP) ::SelectObject(dc, hbmSrc);
  1535. ::BitBlt(dc, 0, 0, cx, cy, pSrcDC->GetSafeHdc(), 0, 0, SRCCOPY);
  1536. ::SelectObject(dc, hbmSrcBack);
  1537. ::BitBlt(dc, 0, 0, cx, cy, pDestDC->GetSafeHdc (), 0, 0, SRCCOPY);
  1538. DWORD dwTimePer = nAnimationTime / nSteps;
  1539. ::SelectObject(dc, hbmDest);
  1540. for (int i = 1; i < nSteps; ++i)
  1541. {
  1542. DWORD dwTime = GetTickCount ();
  1543. AlphaBlendU(pDestBits, pSrcBackBits, cx, cy, pSrcBits, (BYTE)(255 * i  / nSteps));
  1544. pDestDC->BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &dc, 0, 0, SRCCOPY);
  1545. dwTime = GetTickCount () - dwTime;
  1546. if (dwTime < dwTimePer)
  1547. {
  1548. Sleep(dwTimePer - dwTime);
  1549. }
  1550. }
  1551. ::SelectObject(dc, hbmpOld);
  1552. DeleteObject(hbmSrc);
  1553. DeleteObject(hbmSrcBack);
  1554. DeleteObject(hbmDest);
  1555. }
  1556. break;
  1557. }
  1558. }
  1559. void CXTPPaintManager::UpdateRTLCaption(CString& /*strCaption*/)
  1560. {
  1561. }
  1562. void CXTPPaintManager::DrawStatusBarButtonFace(CDC* pDC, CRect rcItem, CXTPStatusBarPane* pPane)
  1563. {
  1564. if (pPane->IsHighlighted() || pPane->IsPressed() || pPane->IsChecked())
  1565. {
  1566. DrawRectangle(pDC, rcItem, pPane->IsHighlighted(), pPane->IsPressed(), TRUE,
  1567. pPane->IsChecked(), FALSE, xtpBarTypeNormal, xtpBarBottom);
  1568. }
  1569. }
  1570. void CXTPPaintManager::DrawStatusBarPaneBorder(CDC* pDC, CRect rc, CXTPStatusBarPane* pPane, BOOL bGripperPane)
  1571. {
  1572. if (m_bThemedStatusBar && m_themeStatusBar.IsAppThemed())
  1573. {
  1574. m_themeStatusBar.DrawThemeBackground(pDC->GetSafeHdc(), bGripperPane ? SP_GRIPPERPANE : SP_PANE, 0, rc, 0);
  1575. }
  1576. else
  1577. {
  1578. if (!pPane->IsButton())
  1579. Draw3dRect(pDC, rc, COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  1580. }
  1581. }
  1582. void CXTPPaintManager::DrawStatusBarPaneSeparator(CDC* pDC, CRect rc, CXTPStatusBarPane* /*pPane*/)
  1583. {
  1584. CRect rcSeparator(rc.left - 2, rc.top, rc.left, rc.bottom);
  1585. Draw3dRect(pDC, rcSeparator, COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  1586. }
  1587. void CXTPPaintManager::DrawStatusBarPaneEntry(CDC* pDC, CRect rcItem, CXTPStatusBarPane* pPane)
  1588. {
  1589. BOOL bEnabled = pPane->IsEnabled();
  1590. BOOL bDrawText = bEnabled || pPane->GetStatusBar()->GetDrawDisabledText();
  1591. if (pPane->GetBackgroundColor() != (COLORREF)-1)
  1592. {
  1593. CRect rcBackground(rcItem);
  1594. if (pPane->HasBorders())
  1595. rcBackground.DeflateRect(1, 1);
  1596. pDC->FillSolidRect(rcBackground, pPane->GetBackgroundColor());
  1597. }
  1598. if (pPane->IsButton())
  1599. {
  1600. DrawStatusBarButtonFace(pDC, rcItem, pPane);
  1601. }
  1602. CXTPFontDC font(pDC, pPane->GetTextFont());
  1603. rcItem.DeflateRect(pPane->GetPadding());
  1604. CString str = pPane->GetText();
  1605. CXTPMarkupUIElement* pUIElement = pPane->GetMarkupUIElement();
  1606. CXTPImageManagerIcon* pIcon = pPane->GetImage();
  1607. COLORREF clrNormalText = pPane->IsButton() && (pPane->IsHighlighted() || pPane->IsPressed()) ?
  1608. GetRectangleTextColor(pPane->IsHighlighted(), pPane->IsPressed(), bEnabled, FALSE, FALSE, xtpBarTypeNormal, xtpBarBottom) : m_clrStatusTextColor;
  1609. COLORREF clrText = !bEnabled ? GetXtremeColor(COLOR_GRAYTEXT): pPane->GetTextColor() != (COLORREF)-1 ? pPane->GetTextColor() : clrNormalText;
  1610. pDC->SetTextColor(clrText);
  1611. XTPMarkupSetDefaultFont(pPane->GetStatusBar()->GetMarkupContext(), (HFONT)pPane->GetTextFont()->GetSafeHandle(), clrText);
  1612. if (pPane->GetTextAlignment() != DT_LEFT)
  1613. {
  1614. int nWidth = pUIElement ? XTPMarkupMeasureElement(pUIElement).cx : pDC->GetTextExtent(str).cx;
  1615. nWidth += pIcon ? pIcon->GetWidth() + (nWidth > 0 ? 2 : 0) : 0;
  1616. if (rcItem.Width() > nWidth)
  1617. {
  1618. if (pPane->GetTextAlignment() == DT_RIGHT)
  1619. {
  1620. rcItem.left = rcItem.right - nWidth;
  1621. }
  1622. if (pPane->GetTextAlignment() == DT_CENTER)
  1623. {
  1624. rcItem.left = (rcItem.left + rcItem.right - nWidth) / 2;
  1625. }
  1626. }
  1627. }
  1628. if (pIcon)
  1629. {
  1630. if (rcItem.right >= rcItem.left + pIcon->GetWidth())
  1631. {
  1632. pIcon->Draw(pDC, CPoint(rcItem.left, (rcItem.top + rcItem.bottom - pIcon->GetHeight()) / 2), bEnabled ? pIcon->GetIcon() : pIcon->GetDisabledIcon());
  1633. }
  1634. rcItem.OffsetRect(pIcon->GetWidth() + 2, 0);
  1635. }
  1636. if (bDrawText)
  1637. {
  1638. if (pUIElement)
  1639. {
  1640. XTPMarkupMeasureElement(pUIElement, rcItem.Width(), INT_MAX);
  1641. XTPMarkupRenderElement(pUIElement, pDC->GetSafeHdc(), rcItem);
  1642. }
  1643. else
  1644. {
  1645. pDC->SetBkMode(TRANSPARENT);
  1646. pDC->DrawText(str, rcItem, DT_SINGLELINE | DT_VCENTER | DT_EXPANDTABS | DT_NOPREFIX);
  1647. }
  1648. }
  1649. }
  1650. int CXTPPaintManager::DrawStatusBarSwitchPane(CDC* pDC, CRect rcItem, CXTPStatusBarSwitchPane* pPane)
  1651. {
  1652. int nWidth = 0;
  1653. int nCount = pPane->GetSwitchCount();
  1654. if (pDC)
  1655. {
  1656. for (int i = 0; i < nCount; i++)
  1657. {
  1658. CXTPStatusBarSwitchPane::SWITCH* pSwitch = pPane->GetSwitch(i);
  1659. rcItem.right = rcItem.left + pSwitch->nWidth;
  1660. DrawRectangle(pDC, rcItem, pSwitch->bHighlighted, pSwitch->bPressed, pPane->IsEnabled(), pSwitch->bChecked, FALSE, xtpBarTypeNormal, xtpBarTop);
  1661. CXTPImageManagerIcon* pIcon = pPane->GetStatusBar()->GetImageManager()->GetImage(pSwitch->nID, ICON_SMALL);
  1662. if (pIcon)
  1663. {
  1664. CPoint pt((rcItem.left + rcItem.right - pIcon->GetWidth()) / 2, (rcItem.top + rcItem.bottom - pIcon->GetHeight()) / 2);
  1665. pIcon->Draw(pDC, pt, pIcon->GetIcon(!pPane->IsEnabled() ? xtpImageDisabled : pSwitch->bChecked ? xtpImageChecked : xtpImageNormal));
  1666. }
  1667. rcItem.left = rcItem.right;
  1668. }
  1669. }
  1670. else
  1671. {
  1672. for (int i = 0; i < nCount; i++)
  1673. {
  1674. CXTPStatusBarSwitchPane::SWITCH* pSwitch = pPane->GetSwitch(i);
  1675. pSwitch->nWidth = 18;
  1676. nWidth += pSwitch->nWidth;
  1677. }
  1678. }
  1679. return nWidth;
  1680. }
  1681. CSize CXTPPaintManager::DrawCommandBarGripper(CDC* pDC, CXTPCommandBar* pBar, BOOL bDraw)
  1682. {
  1683. if (pBar->GetPosition() == xtpBarFloating)
  1684. {
  1685. CRect rc;
  1686. pBar->GetClientRect(&rc);
  1687. ASSERT(pDC);
  1688. if (!pDC)
  1689. return CSize(0, 0);
  1690. CXTPFontDC font(pDC, GetSmCaptionFont());
  1691. CSize sz = pDC->GetTextExtent(_T(" "), 1);
  1692. rc.SetRect(3, 3, rc.right - 3, 3 + max(15, sz.cy));
  1693. if (pDC && bDraw)
  1694. {
  1695. pDC->SetBkMode(TRANSPARENT);
  1696. pDC->FillSolidRect(rc, m_clrFloatingGripper);
  1697. pDC->SetTextColor(m_clrFloatingGripperText);
  1698. pDC->DrawText(pBar->GetTitle(), CRect(5, 3, rc.right - 2* rc.Size().cy, rc.bottom), DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX);
  1699. }
  1700. return rc.Size();
  1701. }
  1702. return 0;
  1703. }
  1704. void CXTPPaintManager::SetCommandBarRegion(CXTPCommandBar* /*pCommandBar*/)
  1705. {
  1706. }
  1707. BOOL CXTPPaintManager::IsFlatToolBar(CXTPCommandBar* pCommandBar)
  1708. {
  1709. return pCommandBar->GetType() == xtpBarTypeMenuBar ? m_bFlatMenuBar : m_bFlatToolBar;
  1710. }
  1711. void CXTPPaintManager::DrawPopupBarGripper(CDC* /*pDC*/, int /*xPos*/, int /*yPos*/, int /*cx*/, int /*cy*/, BOOL /*bExpanded = FALSE*/)
  1712. {
  1713. }
  1714. void CXTPPaintManager::FillWorkspace(CDC* pDC, CRect rc, CRect /*rcExclude*/)
  1715. {
  1716. pDC->FillSolidRect(rc, GetXtremeColor(COLOR_APPWORKSPACE));
  1717. }
  1718. void AFX_CDECL CXTPPaintManager::FillCompositeAlpha(CDC* pDC, CRect rc)
  1719. {
  1720. CSize sz(rc.Width(), rc.Height());
  1721. CBitmap bmp;
  1722. LPDWORD lpBits;
  1723. bmp.Attach(CXTPImageManager::Create32BPPDIBSection(pDC->GetSafeHdc(), sz.cx, sz.cy, (LPBYTE*)&lpBits));
  1724. CXTPCompatibleDC dc(pDC, &bmp);
  1725. CRect rcDestOrig(0, 0, sz.cx, sz.cy);
  1726. dc.BitBlt(0, 0, sz.cx, sz.cy, pDC, rc.left, rc.top, SRCCOPY);
  1727. for (int i = 0; i < sz.cx * sz.cy; i++)
  1728. {
  1729. lpBits[0] |= 0xFF000000;
  1730. lpBits++;
  1731. }
  1732. pDC->BitBlt(rc.left, rc.top, sz.cx, sz.cy, &dc, 0, 0, SRCCOPY);
  1733. }
  1734. void CXTPPaintManager::DrawKeyboardTip(CDC* pDC, CXTPCommandBarKeyboardTip* pWnd, BOOL bSetRegion)
  1735. {
  1736. if (!bSetRegion)
  1737. {
  1738. CXTPClientRect rc(pWnd);
  1739. CXTPFontDC font(pDC, &m_fontToolTip);
  1740. pDC->FillSolidRect(rc, GetXtremeColor(COLOR_INFOBK));
  1741. pDC->Draw3dRect(rc, GetSysColor(COLOR_3DSHADOW), GetSysColor(COLOR_3DSHADOW));
  1742. pDC->SetBkMode(TRANSPARENT);
  1743. pDC->SetTextColor(GetXtremeColor(pWnd->m_bEnabled ? COLOR_INFOTEXT : COLOR_GRAYTEXT));
  1744. pDC->DrawText(pWnd->m_strTip, rc, DT_VCENTER | DT_CENTER | DT_SINGLELINE);
  1745. }
  1746. }
  1747. CSize CXTPPaintManager::GetAutoIconSize(BOOL bLarge) const
  1748. {
  1749. if (m_bAutoResizeIcons)
  1750. {
  1751. int nHeight = GetControlHeight() - 4;
  1752. if (bLarge) nHeight = nHeight * 2;
  1753. nHeight = max(2, nHeight / 8);
  1754. return CSize(nHeight * 8, nHeight * 8);
  1755. }
  1756. return bLarge ? CSize(32, 32) : CSize(16, 16);
  1757. }