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

对话框与窗口

开发平台:

Visual C++

  1. // XTPOfficeTheme.cpp : implementation of the CXTPOfficeTheme 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 "Common/XTPImageManager.h"
  22. #include "Common/XTPDrawHelpers.h"
  23. #include "Common/XTPHookManager.h"
  24. #include "XTPPaintManager.h"
  25. #include "XTPControlButton.h"
  26. #include "XTPControlPopup.h"
  27. #include "Common/XTPColorManager.h"
  28. #include "XTPToolBar.h"
  29. #include "XTPPopupBar.h"
  30. #include "XTPControlComboBox.h"
  31. #include "XTPControlEdit.h"
  32. #include "XTPControls.h"
  33. #include "XTPCommandBars.h"
  34. #ifdef _DEBUG
  35. #define new DEBUG_NEW
  36. #undef THIS_FILE
  37. static char THIS_FILE[] = __FILE__;
  38. #endif
  39. #ifndef DT_HIDEPREFIX
  40. #define DT_HIDEPREFIX 0x00100000
  41. #endif //!DT_HIDEPREFIX
  42. CXTPOfficeTheme::CXTPOfficeTheme()
  43. {
  44. m_bFlatMenuBar = TRUE;
  45. m_iconsInfo.bUseFadedIcons = TRUE;
  46. m_iconsInfo.bIconsWithShadow = TRUE;
  47. m_iconsInfo.bUseDisabledIcons = TRUE;
  48. m_iconsInfo.bOfficeStyleDisabledIcons = TRUE;
  49. m_bEmbossedDisabledText = FALSE;
  50. m_pShadowManager->SetShadowOptions(xtpShadowOfficeAlpha + xtpShadowShowPopupControl);
  51. m_nPopupBarTextPadding = 8;
  52. }
  53. void CXTPOfficeTheme::DrawRectangle(CDC* pDC, CRect rc, BOOL bSelected, BOOL bPressed, BOOL bEnabled, BOOL bChecked, BOOL bPopuped, XTPBarType /*barType*/, XTPBarPosition barPosition /*= xtpBarPopup*/)
  54. {
  55. if (!bEnabled)
  56. {
  57. if (IsKeyboardSelected(bSelected))
  58. Rectangle(pDC, rc, XPCOLOR_HIGHLIGHT_BORDER, barPosition != xtpBarPopup ? (bChecked ? XPCOLOR_HIGHLIGHT_PUSHED : XPCOLOR_HIGHLIGHT) : XPCOLOR_MENUBAR_FACE);
  59. else if (bChecked)
  60. Rectangle(pDC, rc, XPCOLOR_HIGHLIGHT_DISABLED_BORDER, barPosition != xtpBarPopup ? XPCOLOR_HIGHLIGHT_CHECKED : -1);
  61. return;
  62. }
  63. if (bPopuped) Rectangle(pDC, rc, XPCOLOR_MENUBAR_BORDER, XPCOLOR_TOOLBAR_FACE);
  64. else if (bChecked == 2 && !bSelected && !bPressed) Rectangle(pDC, rc, XPCOLOR_HIGHLIGHT_CHECKED_BORDER, XPCOLOR_3DFACE);
  65. else if (bChecked && !bSelected && !bPressed) Rectangle(pDC, rc, XPCOLOR_HIGHLIGHT_CHECKED_BORDER, XPCOLOR_HIGHLIGHT_CHECKED);
  66. else if (bChecked && bSelected && !bPressed) Rectangle(pDC, rc, XPCOLOR_HIGHLIGHT_PUSHED_BORDER, XPCOLOR_HIGHLIGHT_PUSHED);
  67. else if (IsKeyboardSelected(bPressed) || (bSelected && bPressed)) Rectangle(pDC, rc, XPCOLOR_HIGHLIGHT_PUSHED_BORDER, XPCOLOR_HIGHLIGHT_PUSHED);
  68. else if (bSelected || bPressed) Rectangle(pDC, rc, XPCOLOR_HIGHLIGHT_BORDER, XPCOLOR_HIGHLIGHT);
  69. }
  70. void CXTPOfficeTheme::DrawImage(CDC* pDC, CPoint pt, CSize sz, CXTPImageManagerIcon* pImage, BOOL bSelected, BOOL bPressed, BOOL bEnabled, BOOL bChecked, BOOL bPopuped, BOOL)
  71. {
  72. if (!bEnabled)
  73. {
  74. if (!m_iconsInfo.bUseDisabledIcons && !pImage->IsAlpha())
  75. pImage->DrawMono(pDC, pt, pImage->GetIcon(), sz, GetXtremeColor(XPCOLOR_DISABLED));
  76. else
  77. {
  78. if (m_iconsInfo.bOfficeStyleDisabledIcons && !pImage->HasDisabledIcon())
  79. {
  80. pImage->CreateDisabledIcon(m_clrDisabledIcon.clrLight, m_clrDisabledIcon.clrDark);
  81. }
  82. pImage->Draw(pDC, pt, pImage->GetDisabledIcon(), sz);
  83. }
  84. }
  85. else if (bChecked == 2 && !bPressed)
  86. {
  87. if (!pImage->IsAlpha())
  88. pImage->DrawMono(pDC, pt, pImage->GetIcon(), sz, GetXtremeColor(XPCOLOR_DISABLED));
  89. else
  90. {
  91. if (m_iconsInfo.bOfficeStyleDisabledIcons && !pImage->HasDisabledIcon())
  92. {
  93. pImage->CreateDisabledIcon(m_clrDisabledIcon.clrLight, m_clrDisabledIcon.clrDark);
  94. }
  95. pImage->Draw(pDC, pt, pImage->GetDisabledIcon(), sz);
  96. }
  97. }
  98. else if (bPopuped || bChecked)
  99. pImage->Draw(pDC, pt, bChecked ? pImage->GetCheckedIcon() : pImage->GetIcon(), sz);
  100. else if (!bSelected && !bPressed)
  101. {
  102. pImage->Draw(pDC, pt, m_iconsInfo.bUseFadedIcons ? pImage->GetFadedIcon() : pImage->GetIcon(), sz);
  103. }
  104. else if ((bSelected && !bPressed) || (!bSelected && bPressed == TRUE))
  105. {
  106. if (m_iconsInfo.bIconsWithShadow && !pImage->GetShadowIcon().IsEmpty())
  107. {
  108. pImage->Draw(pDC, CPoint(pt.x + 1, pt.y + 1), pImage->GetShadowIcon(), sz);
  109. pImage->Draw(pDC, CPoint(pt.x - 1, pt.y - 1), pImage->GetHotIcon(), sz);
  110. }
  111. else
  112. {
  113. pImage->Draw(pDC, pt, pImage->GetHotIcon(), sz);
  114. }
  115. }
  116. else if ((bSelected && bPressed) || (IsKeyboardSelected(bPressed)))
  117. pImage->Draw(pDC, pt, pImage->GetPressedIcon(), sz);
  118. }
  119. CSize CXTPOfficeTheme::DrawControlEdit(CDC* pDC, CXTPControlEdit* pControlEdit, BOOL bDraw)
  120. {
  121. if (!bDraw)
  122. {
  123. return CXTPPaintManager::DrawControlEdit(pDC, pControlEdit, bDraw);
  124. }
  125. BOOL bPopupBar = pControlEdit->GetParent()->GetType() == xtpBarTypePopup;
  126. BOOL bSelected = pControlEdit->GetSelected(), bEnabled = pControlEdit->GetEnabled();
  127. CXTPPaintManager::DrawControlEdit(pDC, pControlEdit, bDraw);
  128. CRect rc = pControlEdit->GetRect();
  129. rc.left += pControlEdit->GetLabelWidth();
  130. if (!bEnabled)
  131. {
  132. rc.DeflateRect(1, 0, 0, 0);
  133. Rectangle (pDC, rc, IsKeyboardSelected(bSelected) ? XPCOLOR_HIGHLIGHT_BORDER : XPCOLOR_DISABLED, COLOR_3DFACE);
  134. }
  135. else
  136. {
  137. pDC->FillSolidRect(rc.left + 1, rc.top + 1, rc.Width() - (pControlEdit->IsSpinButtonsVisible() ? 18 : 2),
  138. rc.Height() - 2, GetXtremeColor(COLOR_WINDOW));
  139. if (bSelected)
  140. {
  141. Draw3dRect(pDC, rc, XPCOLOR_HIGHLIGHT_BORDER, XPCOLOR_HIGHLIGHT_BORDER);
  142. }
  143. else if (bPopupBar)
  144. {
  145. Draw3dRect(pDC, rc, XPCOLOR_EDITCTRLBORDER, XPCOLOR_EDITCTRLBORDER);
  146. }
  147. }
  148. CRect rcText(pControlEdit->GetRect());
  149. rcText.DeflateRect(pControlEdit->GetLabelWidth() + 3, 1, 3, 1);
  150. pControlEdit->DrawEditText(pDC, rcText);
  151. if (pControlEdit->IsSpinButtonsVisible())
  152. {
  153. BOOL bPressed = pControlEdit->GetPressed();
  154. CRect rcSpin(pControlEdit->GetSpinButtonsRect());
  155. CRect rcTop(rcSpin.left, rcSpin.top, rcSpin.right, rcSpin.CenterPoint().y);
  156. CRect rcBottom(rcSpin.left, rcTop.bottom, rcSpin.right, rcSpin.bottom);
  157. if (!bEnabled)
  158. {
  159. }
  160. else if (!bSelected)
  161. {
  162. pDC->Draw3dRect(rcSpin, GetXtremeColor(COLOR_WINDOW), GetXtremeColor(COLOR_WINDOW));
  163. }
  164. else
  165. {
  166. pDC->FillSolidRect(rcSpin, GetXtremeColor(XPCOLOR_HIGHLIGHT));
  167. if (bPressed == XTP_EDITSPIN_UP)
  168. pDC->FillSolidRect(rcTop,  GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED));
  169. else if (bPressed == XTP_EDITSPIN_DOWN)
  170. pDC->FillSolidRect(rcBottom,  GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED));
  171. pDC->FillSolidRect(rcSpin.left, rcSpin.top, 1, rcSpin.Height(), GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER));
  172. pDC->FillSolidRect(rcSpin.left, rcBottom.top, rcSpin.Width(), 1, GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER));
  173. }
  174. CPoint pt = rcTop.CenterPoint();
  175. Triangle(pDC, CPoint(pt.x, pt.y), CPoint(pt.x - 2, pt.y + 2), CPoint(pt.x + 2, pt.y + 2),
  176. GetXtremeColor(bEnabled ? COLOR_BTNTEXT : COLOR_GRAYTEXT));
  177. pt = rcBottom.CenterPoint();
  178. Triangle(pDC, CPoint(pt.x, pt.y), CPoint(pt.x - 2, pt.y - 2), CPoint(pt.x + 2, pt.y - 2),
  179. GetXtremeColor(bEnabled ? COLOR_BTNTEXT : COLOR_GRAYTEXT));
  180. }
  181. return 0;
  182. }
  183. CSize CXTPOfficeTheme::DrawControlComboBox(CDC* pDC, CXTPControlComboBox* pControlCombo, BOOL bDraw)
  184. {
  185. if (!bDraw)
  186. {
  187. return CXTPPaintManager::DrawControlComboBox(pDC, pControlCombo, bDraw);
  188. }
  189. BOOL bPopupBar = pControlCombo->GetParent()->GetType() == xtpBarTypePopup;
  190. CXTPFontDC font(pDC, GetIconFont());
  191. CRect rc = pControlCombo->GetRect();
  192. BOOL bDropped = pControlCombo->GetDroppedState() != 0;
  193. BOOL bSelected = pControlCombo->GetSelected();
  194. BOOL bEnabled = pControlCombo->GetEnabled();
  195. CXTPPaintManager::DrawControlComboBox(pDC, pControlCombo, bDraw);
  196. rc.left += pControlCombo->GetLabelWidth();
  197. int nThumb = pControlCombo->GetThumbWidth();
  198. CRect rcBtn (rc.right - nThumb, rc.top, rc.right, rc.bottom);
  199. CRect rcText(rc.left + 3, rc.top + 1, rc.right - rcBtn.Width(), rc.bottom - 1);
  200. if (!bEnabled)
  201. {
  202. rc.DeflateRect(1, 0, 0, 0);
  203. Rectangle (pDC, rc, IsKeyboardSelected(bSelected) ? XPCOLOR_HIGHLIGHT_BORDER : XPCOLOR_DISABLED, COLOR_3DFACE);
  204. rcBtn.DeflateRect(1, 1);
  205. }
  206. else
  207. {
  208. CRect rcEntry(rc.left + 1, rc.top + 1, rc.right - nThumb + 1, rc.bottom -1);
  209. Rectangle (pDC, rcEntry, COLOR_WINDOW, COLOR_WINDOW);
  210. if (bSelected)
  211. {
  212. Rectangle(pDC, rc, XPCOLOR_HIGHLIGHT_BORDER, COLOR_WINDOW);
  213. DrawRectangle(pDC, rcBtn, TRUE, bDropped, TRUE, FALSE, FALSE, xtpBarTypeNormal, pControlCombo->GetParent()->GetPosition());
  214. rcBtn.DeflateRect(1, 1);
  215. }
  216. else
  217. {
  218. rcBtn.DeflateRect(1, 1);
  219. if (bPopupBar)
  220. {
  221. Draw3dRect(pDC, rc, XPCOLOR_EDITCTRLBORDER, XPCOLOR_EDITCTRLBORDER);
  222. Rectangle(pDC, rcBtn, COLOR_WINDOW, XPCOLOR_EDITCTRLBORDER);
  223. }
  224. else
  225. {
  226. Draw3dRect(pDC, rcBtn, COLOR_WINDOW, COLOR_WINDOW);
  227. }
  228. }
  229. }
  230. pControlCombo->DrawEditText(pDC, rcText);
  231. DrawComboExpandMark(pDC, rcBtn, GetXtremeColor(!pControlCombo->GetEnabled() ? XPCOLOR_DISABLED: bDropped ? XPCOLOR_PUSHED_TEXT: bSelected ? XPCOLOR_HIGHLIGHT_TEXT : XPCOLOR_TOOLBAR_TEXT));
  232. return 0;
  233. }
  234. void CXTPOfficeTheme::DrawPopupBarGripper(CDC* pDC, int x, int y, int cx, int cy, BOOL bExpanded)
  235. {
  236. pDC->FillSolidRect(x, y, cx, cy, GetXtremeColor(bExpanded ? XPCOLOR_MENUBAR_EXPANDED : XPCOLOR_TOOLBAR_FACE));
  237. }
  238. void CXTPOfficeTheme::DrawSplitButtonPopup(CDC* pDC, CXTPControl* pButton)
  239. {
  240. CRect rcButton = pButton->GetRect();
  241. BOOL bSelected = pButton->GetSelected(), bPopuped = pButton->GetPopuped(), bEnabled = pButton->GetEnabled();
  242. if (!bPopuped || !bSelected || !bEnabled)
  243. VerticalLine(pDC, rcButton.right - m_nSplitButtonPopupWidth, rcButton.top + 1, rcButton.bottom - 1,
  244. !bEnabled ? GetControlTextColor(pButton) : bSelected ? GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER) : GetXtremeColor(COLOR_3DSHADOW));
  245. else
  246. Rectangle(pDC, CRect(rcButton.right - m_nSplitButtonPopupWidth, rcButton.top, rcButton.right, rcButton.bottom), XPCOLOR_HIGHLIGHT_BORDER, XPCOLOR_HIGHLIGHT_PUSHED);
  247. }
  248. void CXTPOfficeTheme::DrawControlPopupGlyph(CDC* pDC, CXTPControl* pButton)
  249. {
  250. CRect rcButton = pButton->GetRect();
  251. BOOL bSelected = pButton->GetSelected(), bPopuped = pButton->GetPopuped(), bEnabled = pButton->GetEnabled();
  252. CPoint pt = CPoint(rcButton.right - 11, rcButton.CenterPoint().y);
  253. Triangle(pDC, CPoint(pt.x, pt.y - 3), CPoint(pt.x + 3, pt.y), CPoint(pt.x, pt.y + 3),
  254. pButton->GetType() == xtpControlSplitButtonPopup && bEnabled && bPopuped && bSelected ?
  255. GetXtremeColor(XPCOLOR_PUSHED_TEXT) : GetControlTextColor(pButton));
  256. }
  257. void CXTPOfficeTheme::FillPopupLabelEntry(CDC* pDC, CRect rc)
  258. {
  259. pDC->FillSolidRect(rc, GetXtremeColor(XPCOLOR_LABEL));
  260. }
  261. CSize CXTPOfficeTheme::DrawControlPopupParent(CDC* pDC, CXTPControl* pButton, BOOL bDraw)
  262. {
  263. CXTPCommandBar* pParent = pButton->GetParent();
  264. CRect rcButton = pButton->GetRect();
  265. XTPControlType controlType = pButton->GetType();
  266. XTPButtonStyle buttonStyle = pButton->GetStyle();
  267. BOOL bDrawImage = (buttonStyle == xtpButtonAutomatic && controlType != xtpControlPopup) ||
  268. (buttonStyle != xtpButtonCaption);
  269. BOOL bSelected = pButton->GetSelected(), bEnabled = pButton->GetEnabled(), bChecked = pButton->GetChecked();
  270. if (controlType == xtpControlSplitButtonPopup && bEnabled == TRUE_SPLITDROPDOWN)
  271. bEnabled = FALSE;
  272. BOOL bLayoutRTL = pParent->IsLayoutRTL();
  273. BOOL bDoubleGripper = pParent->IsPopupBar() ? ((CXTPPopupBar*)pParent)->IsDoubleGripper() : FALSE;
  274. CString strCaption = pButton->GetCaption();
  275. if (bLayoutRTL) UpdateRTLCaption(strCaption);
  276. CSize szIcon = GetIconSize(pButton);
  277. CSize szCheck(szIcon.cx + 4, szIcon.cy + 4);
  278. CSize szImage(max(szIcon.cx + 4, m_nTextHeight + 4), max(szIcon.cy + 6, m_nTextHeight));
  279. int nGripperWidth = GetPopupBarGripperWidth(pParent);
  280. if (pButton->GetType() == xtpControlLabel && !m_bOffsetPopupLabelText)
  281. nGripperWidth = 0;
  282. if (bDraw)
  283. {
  284. if (pButton->GetExpanded() && rcButton.left < nGripperWidth)
  285. {
  286. DrawPopupBarGripper(pDC, rcButton.left - 1, rcButton.top, nGripperWidth, rcButton.Height(), TRUE);
  287. }
  288. if (pButton->GetType() == xtpControlLabel)
  289. {
  290. if (!pParent->GetShowGripper()) nGripperWidth = 0;
  291. int nLabelGripper = rcButton.left > nGripperWidth ? 0 : nGripperWidth;
  292. FillPopupLabelEntry(pDC, CRect(rcButton.left + nLabelGripper, rcButton.top, rcButton.right, rcButton.bottom));
  293. }
  294. else
  295. DrawRectangle(pDC, rcButton, bSelected, FALSE, bEnabled, FALSE, FALSE, xtpBarTypePopup, xtpBarPopup);
  296. if (pButton->GetType() == xtpControlSplitButtonPopup)
  297. {
  298. DrawSplitButtonPopup(pDC, pButton);
  299. }
  300. CRect rcImageRect(rcButton.left, rcButton.top, rcButton.left + szImage.cx, rcButton.bottom);
  301. if (!pParent->GetShowGripper())
  302. rcImageRect.OffsetRect(m_nPopupBarTextPadding / 2, 0);
  303. CRect rcCheck (CPoint(rcImageRect.left + rcImageRect.Width()/2 - szCheck.cx/2, rcImageRect.top + rcImageRect.Height()/2 - szCheck.cy/2), szCheck);
  304. if (bDoubleGripper)
  305. rcImageRect.OffsetRect(szImage.cx, 0);
  306. if (bChecked)
  307. DrawRectangle(pDC, rcCheck, bSelected, FALSE, bEnabled, bChecked, FALSE, xtpBarTypePopup, xtpBarPopup);
  308. CXTPImageManagerIcon* pImage = pButton->GetIconId() != 0 && bDrawImage ? pButton->GetImage(szIcon.cx) : NULL;
  309. if (pImage)
  310. {
  311. szIcon.cy = pImage->GetHeight() * szIcon.cx / pImage->GetWidth();
  312. CPoint ptImage = CPoint(rcImageRect.left + rcImageRect.Width()/2 - szIcon.cx/2, rcImageRect.top + rcImageRect.Height()/2 - szIcon.cy/2);
  313. DrawImage(pDC, ptImage, szIcon, pImage, bSelected, FALSE, bEnabled, bChecked, FALSE, FALSE);
  314. }
  315. if (bChecked && (bDoubleGripper || !pImage))
  316. {
  317. COLORREF clr = !bEnabled ? GetXtremeColor(XPCOLOR_DISABLED) : 0;
  318. if (bEnabled && !XTPColorManager()->LongColor(0, GetXtremeColor(XPCOLOR_HIGHLIGHT_CHECKED), 1, 50))
  319. {
  320. clr = RGB(255, 255, 255);
  321. }
  322. if (controlType != xtpControlRadioButton)
  323. DrawPopupBarCheckMark(pDC, rcCheck, bEnabled, clr);
  324. else
  325. DrawPopupBarRadioMark(pDC, rcCheck, bEnabled, clr);
  326. }
  327. COLORREF clrText = GetControlTextColor(pButton);
  328. pDC->SetTextColor(clrText);
  329. pDC->SetBkMode (TRANSPARENT);
  330. if (IsPopupControlType(controlType))
  331. {
  332. DrawControlPopupGlyph(pDC, pButton);
  333. }
  334. }
  335. return CXTPPaintManager::DrawControlPopupParent(pDC, pButton, bDraw);
  336. }
  337. COLORREF CXTPOfficeTheme::GetRectangleTextColor(BOOL bSelected, BOOL bPressed, BOOL bEnabled, BOOL bChecked, BOOL bPopuped, XTPBarType barType, XTPBarPosition barPosition)
  338. {
  339. int nColorFace = barPosition == xtpBarPopup ? XPCOLOR_MENUBAR_TEXT : XPCOLOR_TOOLBAR_TEXT;
  340. if (barType == xtpBarTypePopup)
  341. {
  342. return GetXtremeColor(!bEnabled ? XPCOLOR_MENUBAR_GRAYTEXT :
  343. bSelected ? XPCOLOR_HIGHLIGHT_TEXT : XPCOLOR_MENUBAR_TEXT);
  344. }
  345. COLORREF clrText = GetXtremeColor(!bEnabled ? XPCOLOR_TOOLBAR_GRAYTEXT :
  346. bPopuped ? XPCOLOR_TOOLBAR_TEXT :
  347. bChecked && !bSelected && !bPressed ? XPCOLOR_CHECKED_TEXT :
  348. IsKeyboardSelected(bPressed) || (bSelected && (bPressed || bChecked)) ? XPCOLOR_PUSHED_TEXT :
  349. bSelected || bPressed ? XPCOLOR_HIGHLIGHT_TEXT : nColorFace);
  350. return clrText;
  351. }
  352. void CXTPOfficeTheme::FillIntersectRect(CDC* pDC, CXTPPopupBar* pPopupBar, COLORREF clr)
  353. {
  354. if (pPopupBar && pPopupBar->GetControlPopup())
  355. {
  356. CXTPCommandBar* pParentBar = pPopupBar->GetControlPopup()->GetParent();
  357. if (!pParentBar || pParentBar->GetType() == xtpBarTypePopup)
  358. return;
  359. CRect rcParent;
  360. pParentBar->GetWindowRect(rcParent);
  361. CRect rcExclude = pPopupBar->GetControlPopup()->GetRect();
  362. pParentBar->ClientToScreen(&rcExclude);
  363. CRect rcWindow;
  364. pPopupBar->GetWindowRect(&rcWindow);
  365. CRect rcIntersect;
  366. if (rcIntersect.IntersectRect(rcWindow, rcExclude))
  367. {
  368. pPopupBar->ScreenToClient(rcIntersect);
  369. if (rcIntersect.Width() > 1) rcIntersect.DeflateRect(1, 0);
  370. if (rcIntersect.Height() > 1) rcIntersect.DeflateRect(0, 1);
  371. pDC->FillSolidRect(rcIntersect, clr);
  372. }
  373. }
  374. }
  375. void CXTPOfficeTheme::FillCommandBarEntry(CDC* pDC, CXTPCommandBar* pBar)
  376. {
  377. CRect rc;
  378. pBar->GetClientRect(&rc);
  379. if (pBar->GetPosition() == xtpBarFloating)
  380. {
  381. COLORREF clrPen = GetXtremeColor(XPCOLOR_FLOATBAR_BORDER);
  382. COLORREF clrBrush =  GetXtremeColor(pBar->GetType() == xtpBarTypePopup ? XPCOLOR_MENUBAR_FACE :
  383. IsFlatToolBar(pBar) ? COLOR_3DFACE : XPCOLOR_TOOLBAR_FACE);
  384. pDC->Draw3dRect(rc, clrPen, clrPen);
  385. rc.DeflateRect(1, 1);
  386. pDC->FillSolidRect(rc, clrBrush);
  387. pDC->Draw3dRect(rc, clrPen, clrPen);
  388. pDC->SetPixel(2, 2, clrPen);
  389. pDC->SetPixel(rc.right - 2, 2, clrPen);
  390. pDC->SetPixel(2, rc.bottom - 2, clrPen);
  391. pDC->SetPixel(rc.right - 2, rc.bottom - 2, clrPen);
  392. }
  393. else if (pBar->GetPosition() == xtpBarPopup)
  394. {
  395. Rectangle(pDC, rc, XPCOLOR_MENUBAR_BORDER, XPCOLOR_MENUBAR_FACE);
  396. FillIntersectRect(pDC, (CXTPPopupBar*)pBar, GetXtremeColor(XPCOLOR_TOOLBAR_FACE));
  397. }
  398. else if (IsFlatToolBar(pBar))
  399. {
  400. pDC->FillSolidRect(rc, GetXtremeColor(COLOR_3DFACE));
  401. }
  402. else
  403. {
  404. COLORREF clr3DFace = GetXtremeColor(COLOR_3DFACE);
  405. pDC->FillSolidRect(rc, GetXtremeColor(XPCOLOR_TOOLBAR_FACE));
  406. pDC->Draw3dRect(rc, clr3DFace, clr3DFace);
  407. pDC->SetPixel(1, 1, clr3DFace);
  408. pDC->SetPixel(rc.right - 2, 1, clr3DFace);
  409. pDC->SetPixel(1, rc.bottom - 2, clr3DFace);
  410. pDC->SetPixel(rc.right - 2, rc.bottom - 2, clr3DFace);
  411. }
  412. }
  413. CSize CXTPOfficeTheme::DrawDialogBarGripper(CDC* pDC, CXTPDialogBar* /*pBar*/, BOOL bDraw)
  414. {
  415. CSize sz(6, max(22, m_nTextHeight + 4));
  416. if (pDC && bDraw)
  417. {
  418. CXTPPenDC pen (*pDC, GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));
  419. for (int y = 6; y < sz.cy - 2; y += 2)
  420. Line(pDC, CPoint(3, y), CPoint(6, y));
  421. }
  422. return sz;
  423. }
  424. CSize CXTPOfficeTheme::DrawCommandBarGripper(CDC* pDC, CXTPCommandBar* pBar, BOOL bDraw)
  425. {
  426. if (pBar->IsDialogBar())
  427. return DrawDialogBarGripper(pDC, (CXTPDialogBar*)pBar, bDraw);
  428. CRect rc;
  429. pBar->GetClientRect(&rc);
  430. if (pBar->GetPosition() == xtpBarPopup && pBar->GetType() == xtpBarTypePopup)
  431. {
  432. CRect rcBorders = pBar->GetBorders();
  433. DrawPopupBarGripper(pDC, rcBorders.left - 1, rcBorders.top, GetPopupBarGripperWidth(pBar), rc.bottom - rcBorders.top - rcBorders.bottom);
  434. }
  435. if (pBar->GetPosition() == xtpBarFloating)
  436. {
  437. CSize sz = CXTPPaintManager::DrawCommandBarGripper(pDC, pBar, bDraw);
  438. if (pBar->GetType() == xtpBarTypePopup && pBar->GetShowGripper())
  439. {
  440. CRect rcBorders = pBar->GetBorders();
  441. int nTop = rcBorders.top + sz.cy + 1;
  442. DrawPopupBarGripper(pDC, rcBorders.left - 1, nTop,
  443. GetPopupBarGripperWidth(pBar), rc.bottom - nTop - rcBorders.bottom);
  444. }
  445. return sz;
  446. }
  447. else if (pBar->GetPosition() == xtpBarRight || pBar->GetPosition() == xtpBarLeft)
  448. {
  449. if (pDC && bDraw)
  450. {
  451. CXTPPenDC pen (*pDC, GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));
  452. for (int x = 5; x < rc.Width() - 5; x += 2)
  453. Line(pDC, CPoint(x, 3), CPoint(x, 6));
  454. }
  455. return CSize(0, 8);
  456. }
  457. else if (pBar->GetPosition() == xtpBarTop || pBar->GetPosition() == xtpBarBottom)
  458. {
  459. if (pDC && bDraw)
  460. {
  461. CXTPPenDC pen (*pDC, GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));
  462. for (int y = 5; y < rc.Height() - 5; y += 2)
  463. Line(pDC, CPoint(3, y), CPoint(6, y));
  464. }
  465. return CSize(6, 0);
  466. }
  467. return 0;
  468. }
  469. CSize CXTPOfficeTheme::DrawCommandBarSeparator(CDC* pDC, CXTPCommandBar* pBar, CXTPControl* pControl, BOOL bDraw)
  470. {
  471. if (!bDraw)
  472. {
  473. if (pBar->GetType() == xtpBarTypePopup)
  474. return CSize(3, 3);
  475. return CSize(6, 6);
  476. }
  477. CRect rc;
  478. pBar->GetClientRect(&rc);
  479. CRect rcControl = pControl->GetRect();
  480. CRect rcRow = pControl->GetRowRect();
  481. if (pBar->GetType() == xtpBarTypePopup)
  482. {
  483. if (!pControl->GetWrap())
  484. HorizontalLine(pDC, rcControl.left - 1 + GetPopupBarGripperWidth(pBar) + m_nPopupBarTextPadding,
  485. rcControl.top - 2, rcControl.right + 1, GetXtremeColor(XPCOLOR_SEPARATOR));
  486. else
  487. VerticalLine(pDC, rcControl.left - 2, rcRow.top - 1, rcRow.bottom + 1, GetXtremeColor(XPCOLOR_SEPARATOR));
  488. }
  489. else if (pBar->GetPosition() != xtpBarPopup && IsVerticalPosition(pBar->GetPosition()))
  490. {
  491. if (!pControl->GetWrap())
  492. HorizontalLine(pDC, rcRow.left, rcControl.top - 4, rcRow.right, GetXtremeColor(XPCOLOR_SEPARATOR));
  493. else
  494. VerticalLine(pDC, rcRow.right + 2, rcRow.top + 4, rcRow.bottom, GetXtremeColor(XPCOLOR_SEPARATOR));
  495. }
  496. else
  497. {
  498. if (!pControl->GetWrap())
  499. VerticalLine(pDC, rcControl.left - 4, rcRow.top, rcRow.bottom, GetXtremeColor(XPCOLOR_SEPARATOR));
  500. else
  501. HorizontalLine(pDC, rcRow.left, rcRow.top - 4, rcRow.right, GetXtremeColor(XPCOLOR_SEPARATOR));
  502. }
  503. return 0;
  504. }
  505. void CXTPOfficeTheme::AdjustExcludeRect(CRect& rc, CXTPControl* pControl, BOOL bVertical)
  506. {
  507. CXTPCommandBar* pParent = pControl->GetParent();
  508. ASSERT(pParent);
  509. if (!pParent)
  510. return;
  511. if (pParent->GetType() != xtpBarTypePopup)
  512. {
  513. if (pControl->GetType() == xtpControlComboBox) return;
  514. if (pParent->GetFlags() & xtpFlagSmartLayout && pParent->GetPosition() == xtpBarPopup)
  515. {
  516. rc.DeflateRect(0, 1);
  517. }
  518. else if (bVertical)
  519. rc.DeflateRect(1, 0);
  520. else
  521. rc.DeflateRect(0, 1);
  522. }
  523. else
  524. rc.InflateRect(1, 0);
  525. }
  526. void CXTPOfficeTheme::DrawStatusBarPaneBorder(CDC* pDC, CRect rc, CXTPStatusBarPane* /*pPane*/, BOOL /*bGripperPane*/)
  527. {
  528. Draw3dRect(pDC, rc, COLOR_3DSHADOW, COLOR_3DSHADOW);
  529. }
  530. void CXTPOfficeTheme::DrawStatusBarPaneSeparator(CDC* pDC, CRect rc, CXTPStatusBarPane* /*pPane*/)
  531. {
  532. VerticalLine(pDC, rc.left - 2, rc.top, rc.bottom, GetXtremeColor(XPCOLOR_SEPARATOR));
  533. }
  534. CSize CXTPOfficeTheme::DrawListBoxControl(CDC* pDC, CXTPControl* pButton, CRect rcButton, BOOL bSelected, BOOL bDraw, CXTPCommandBars* pCommandBars)
  535. {
  536. CSize szIcon = pCommandBars && pCommandBars->GetCommandBarsOptions()->szPopupIcons != CSize(0) ?
  537. pCommandBars->GetCommandBarsOptions()->szPopupIcons : GetAutoIconSize(FALSE);
  538. CSize szImage(max(szIcon.cx + 4, m_nTextHeight + 4), max(szIcon.cy + 6, m_nTextHeight));
  539. if (bDraw)
  540. {
  541. pDC->FillSolidRect(rcButton, GetXtremeColor(XPCOLOR_MENUBAR_FACE));
  542. DrawPopupBarGripper(pDC, 0, rcButton.top, szImage.cx + 1, rcButton.Height());
  543. if (pButton == NULL)
  544. {
  545. return 0;
  546. }
  547. XTPControlType controlType = pButton->GetType();
  548. XTPButtonStyle buttonStyle = pButton->GetStyle();
  549. if (bSelected)
  550. DrawRectangle(pDC, rcButton, bSelected, FALSE, TRUE, FALSE, FALSE, xtpBarTypePopup, xtpBarPopup);
  551. BOOL bDrawImage = (buttonStyle == xtpButtonAutomatic && controlType != xtpControlPopup) ||
  552. (buttonStyle == xtpButtonIcon) || (buttonStyle == xtpButtonIconAndCaption);
  553. CXTPImageManagerIcon* pImage = pButton->GetIconId() != 0 && bDrawImage ? pButton->GetImage(szIcon.cx) : NULL;
  554. if (pImage)
  555. {
  556. szIcon.cy = pImage->GetHeight() * szIcon.cx / pImage->GetWidth();
  557. CPoint ptImage = CPoint(rcButton.left + szImage.cx/2 - szIcon.cx/2, rcButton.top + rcButton.Height()/2 - szIcon.cy/2);
  558. DrawImage(pDC, ptImage, szIcon, pImage, bSelected, FALSE, TRUE, FALSE, FALSE, FALSE);
  559. }
  560. COLORREF clrText = GetRectangleTextColor(bSelected, FALSE, TRUE, FALSE, FALSE, xtpBarTypePopup, xtpBarPopup);
  561. pDC->SetTextColor(clrText);
  562. pDC->SetBkMode (TRANSPARENT);
  563. CString strText = pButton->GetCaption();
  564. StripMnemonics(strText);
  565. if (pCommandBars && pCommandBars->IsLayoutRTL())
  566. UpdateRTLCaption(strText);
  567. CRect rcLabelText(rcButton.left + szImage.cx + 8, rcButton.top, rcButton.right, rcButton.bottom);
  568. if (controlType == xtpControlPopup || controlType == xtpControlButtonPopup || controlType == xtpControlSplitButtonPopup)
  569. {
  570. CPoint pt(rcButton.right - 7, rcButton.CenterPoint().y);
  571. Triangle(pDC, pt, CPoint(pt.x - 5, pt.y - 5), CPoint(pt.x - 5, pt.y + 5), clrText);
  572. rcLabelText.right -= 7;
  573. }
  574. if (controlType == xtpControlSplitButtonPopup)
  575. {
  576. Line(pDC, rcButton.right - 20, rcButton.top + 1, rcButton.right - 20, rcButton.bottom - 1, bSelected ? XPCOLOR_HIGHLIGHT_BORDER : COLOR_3DSHADOW);
  577. rcLabelText.right = rcButton.right - 20;
  578. }
  579. if (controlType == xtpControlComboBox || controlType == xtpControlEdit)
  580. {
  581. CRect rcText(0, 0, 0, 0);
  582. pDC->DrawText(strText, &rcText, DT_SINGLELINE | DT_CALCRECT);
  583. int nThumb = pDC->GetTextExtent(_T(" "), 1).cy + 2;
  584. CRect rcCombo(rcButton.left + szImage.cx + 8 + rcText.Width() + 5, rcButton.top, rcButton.right, rcButton.bottom);
  585. CRect rcThumb(rcButton.right - nThumb, rcButton.top, rcButton.right, rcButton.bottom);
  586. Rectangle(pDC, rcCombo, bSelected ? XPCOLOR_HIGHLIGHT_BORDER : COLOR_3DFACE, COLOR_WINDOW);
  587. if (controlType == xtpControlComboBox)
  588. {
  589. if (!bSelected) pDC->FillSolidRect(rcThumb.left + 2, rcThumb.top + 2, rcThumb.Width() - 4, rcThumb.Height() - 4, GetXtremeColor(COLOR_3DFACE));
  590. else DrawRectangle(pDC, rcThumb, bSelected, FALSE, TRUE, FALSE, FALSE, xtpBarTypePopup, xtpBarPopup);
  591. rcThumb.DeflateRect(1, 1, 1, 1);
  592. DrawComboExpandMark(pDC, rcThumb, GetXtremeColor(bSelected ? XPCOLOR_HIGHLIGHT_TEXT : XPCOLOR_TOOLBAR_TEXT));
  593. }
  594. }
  595. CXTPFontDC fnt(pDC, &m_fontRegular);
  596. pDC->DrawText(strText, &rcLabelText, DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS | DT_NOPREFIX);
  597. }
  598. return szImage;
  599. }
  600. CSize CXTPOfficeTheme::DrawTearOffGripper(CDC* pDC, CRect rcGripper, BOOL bSelected, BOOL bDraw)
  601. {
  602. if (bDraw)
  603. {
  604. CRect rc(1, 1, rcGripper.right + 1, rcGripper.Height() + 1);
  605. pDC->FillSolidRect(rc, GetXtremeColor(XPCOLOR_MENUBAR_FACE));
  606. rc.DeflateRect(1, 1);
  607. int nLeft = rc.CenterPoint().x - min(16, rcGripper.Width() /2 - 10);
  608. int nRight = rc.CenterPoint().x + min(16, rcGripper.Width() /2 - 10);
  609. if (bSelected)
  610. {
  611. Rectangle(pDC, rc, XPCOLOR_HIGHLIGHT_BORDER, XPCOLOR_HIGHLIGHT);
  612. if (nLeft < nRight)
  613. {
  614. Line(pDC, nLeft, 4, nRight, 4, XPCOLOR_HIGHLIGHT_TEXT);
  615. Line(pDC, nLeft, 6, nRight, 6, XPCOLOR_HIGHLIGHT_TEXT);
  616. }
  617. }
  618. else
  619. {
  620. pDC->FillSolidRect(rc, GetXtremeColor(XPCOLOR_TOOLBAR_FACE));
  621. if (nLeft < nRight)
  622. {
  623. Line(pDC, nLeft, 3, nRight, 3, XPCOLOR_TOOLBAR_GRIPPER);
  624. Line(pDC, nLeft, 5, nRight, 5, XPCOLOR_TOOLBAR_GRIPPER);
  625. Line(pDC, nLeft, 7, nRight, 7, XPCOLOR_TOOLBAR_GRIPPER);
  626. }
  627. }
  628. }
  629. return CSize(0, 9);
  630. }
  631. void CXTPOfficeTheme::DrawPopupResizeGripper(CDC* pDC, CRect rcGripper, int nFlags)
  632. {
  633. pDC->FillSolidRect(rcGripper, GetXtremeColor(XPCOLOR_TOOLBAR_FACE));
  634. int c = rcGripper.CenterPoint().x;
  635. if (nFlags == 2)
  636. {
  637. for (int x = c - 8; x < c + 8; x += 4)
  638. {
  639. pDC->FillSolidRect(CRect(x + 1, 4 + rcGripper.top, x + 3, 6 + rcGripper.top), GetXtremeColor(COLOR_WINDOW));
  640. pDC->FillSolidRect(CRect(x, 3 + rcGripper.top, x + 2, 5 + rcGripper.top), GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));
  641. }
  642. }
  643. else
  644. {
  645. int x = rcGripper.right - 4;
  646. int y = rcGripper.bottom - 4;
  647. pDC->FillSolidRect(CRect(x + 1, 1 + y, x + 3, 3 + y), GetXtremeColor(COLOR_WINDOW));
  648. pDC->FillSolidRect(CRect(x, 0 + y, x + 2, 2 + y), GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));
  649. x-= 4;
  650. pDC->FillSolidRect(CRect(x + 1, 1 + y, x + 3, 3 + y), GetXtremeColor(COLOR_WINDOW));
  651. pDC->FillSolidRect(CRect(x, 0 + y, x + 2, 2 + y), GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));
  652. x += 4;
  653. y -=4;
  654. pDC->FillSolidRect(CRect(x + 1, 1 + y, x + 3, 3 + y), GetXtremeColor(COLOR_WINDOW));
  655. pDC->FillSolidRect(CRect(x, 0 + y, x + 2, 2 + y), GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));
  656. }
  657. }
  658. CSize CXTPOfficeTheme::DrawControlCheckBoxMark(CDC* pDC, CRect rc, BOOL bDraw, BOOL bSelected, BOOL bPressed, BOOL bChecked, BOOL bEnabled)
  659. {
  660. if (m_bThemedCheckBox && m_themeButton.IsAppThemed())
  661. return CXTPPaintManager::DrawControlCheckBoxMark(pDC, rc, bDraw, bSelected, bPressed, bChecked, bEnabled);
  662. if (!bDraw)
  663. return CSize(13, 13);
  664. if (!bEnabled)
  665. {
  666. Draw3dRect(pDC, rc, XPCOLOR_GRAYTEXT, XPCOLOR_GRAYTEXT);
  667. }
  668. else
  669. {
  670. Rectangle(pDC, rc, bSelected || bPressed ? XPCOLOR_HIGHLIGHT_BORDER : XPCOLOR_3DSHADOW,  bSelected && bPressed ?
  671. XPCOLOR_HIGHLIGHT_PUSHED : bPressed || bSelected ? XPCOLOR_HIGHLIGHT : COLOR_WINDOW);
  672. }
  673. if (bChecked)
  674. {
  675. CPoint pt = rc.CenterPoint();
  676. CXTPPenDC pen(pDC->GetSafeHdc(), GetXtremeColor(!bEnabled || bChecked == 2 ? XPCOLOR_GRAYTEXT : COLOR_BTNTEXT));
  677. if (CXTPDrawHelpers::IsContextRTL(pDC))  // Revert Check Box
  678. {
  679. for (int i = 0; i < 3; i++)
  680. {
  681. pDC->MoveTo(pt.x + 3, pt.y - 1 + i);
  682. pDC->LineTo(pt.x + 1, pt.y + 1 + i);
  683. pDC->LineTo(pt.x - 4, pt.y - 4 + i);
  684. }
  685. }
  686. else
  687. {
  688. for (int i = 0; i < 3; i++)
  689. {
  690. pDC->MoveTo(pt.x - 3, pt.y - 1 + i);
  691. pDC->LineTo(pt.x - 1, pt.y + 1 + i);
  692. pDC->LineTo(pt.x + 4, pt.y - 4 + i);
  693. }
  694. }
  695. }
  696. return CSize(13, 13);
  697. }
  698. CSize CXTPOfficeTheme::DrawControlRadioButtonMark(CDC* pDC, CRect rc, BOOL bDraw, BOOL bSelected, BOOL bPressed, BOOL bChecked, BOOL bEnabled)
  699. {
  700. if (m_bThemedCheckBox && m_themeButton.IsAppThemed())
  701. return CXTPPaintManager::DrawControlRadioButtonMark(pDC, rc, bDraw, bSelected, bPressed, bChecked, bEnabled);
  702. if (!bDraw)
  703. return CSize(13, 13);
  704. if (!bEnabled)
  705. {
  706. AlphaEllipse(pDC, rc, GetXtremeColor(XPCOLOR_GRAYTEXT), GetXtremeColor(XPCOLOR_3DFACE));
  707. }
  708. else
  709. {
  710. AlphaEllipse(pDC, rc, GetXtremeColor(bSelected || bPressed ? XPCOLOR_HIGHLIGHT_BORDER : XPCOLOR_3DSHADOW),
  711. GetXtremeColor(bSelected && bPressed ? XPCOLOR_HIGHLIGHT_PUSHED :
  712. bPressed || bSelected ? XPCOLOR_HIGHLIGHT : COLOR_WINDOW));
  713. }
  714. if (bChecked)
  715. {
  716. COLORREF clrFace = GetXtremeColor(!bEnabled || bChecked == 2 ? XPCOLOR_GRAYTEXT : COLOR_BTNTEXT);
  717. AlphaEllipse(pDC, CRect(rc.left + 4, rc.top + 4, rc.left + 9, rc.top + 9), clrFace, clrFace);
  718. }
  719. return CSize(13, 13);
  720. }
  721. void CXTPOfficeTheme::DrawSplitButtonFrame(CDC* pDC, CXTPControl* pButton, CRect rcButton)
  722. {
  723. BOOL bPressed = pButton->GetPressed(), bSelected = pButton->GetSelected(), bEnabled = pButton->GetEnabled(), bChecked = pButton->GetChecked(),
  724. bPopuped = pButton->GetPopuped();
  725. if (pButton->GetStyle() == xtpButtonIconAndCaptionBelow)
  726. {
  727. int nSplitDropDownHeight = GetSplitDropDownHeight();
  728. BOOL bCommandPressed = ((bSelected && bPressed) && !bPopuped && bEnabled);
  729. BOOL bVert = pButton->GetParent()->GetPosition() == xtpBarLeft ||
  730. pButton->GetParent()->GetPosition() == xtpBarRight;
  731. DrawRectangle(pDC, CRect(rcButton.left, rcButton.top, rcButton.right, rcButton.bottom),
  732. bSelected, bPressed && !bCommandPressed, bEnabled, bChecked, bPopuped, xtpBarTypeNormal, pButton->GetParent()->GetPosition());
  733. if ((bSelected || bPressed) && !bPopuped && bEnabled)
  734. {
  735. if (bVert)
  736. pDC->FillSolidRect(rcButton.left + nSplitDropDownHeight, rcButton.top, 1, rcButton.Height(), GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER));
  737. else
  738. pDC->FillSolidRect(rcButton.left, rcButton.bottom - nSplitDropDownHeight - 1, rcButton.Width(), 1, GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER));
  739. }
  740. if (bCommandPressed)
  741. {
  742. if (bVert)
  743. DrawRectangle(pDC, CRect(rcButton.left + nSplitDropDownHeight, rcButton.top, rcButton.right, rcButton.bottom),
  744. bSelected, bPressed, bEnabled, bChecked, bPopuped, xtpBarTypeNormal, pButton->GetParent()->GetPosition());
  745. else
  746. DrawRectangle(pDC, CRect(rcButton.left, rcButton.top, rcButton.right, rcButton.bottom - nSplitDropDownHeight),
  747. bSelected, bPressed, bEnabled, bChecked, bPopuped, xtpBarTypeNormal, pButton->GetParent()->GetPosition());
  748. }
  749. return;
  750. }
  751. DrawRectangle(pDC, CRect(rcButton.left, rcButton.top, rcButton.right - (bPopuped ? 0 : m_nSplitButtonDropDownWidth), rcButton.bottom),
  752. bSelected, bPressed, bEnabled, bChecked, bPopuped, xtpBarTypeNormal, pButton->GetParent()->GetPosition());
  753. if ((bSelected || bPressed) && !bPopuped && bEnabled)
  754. DrawRectangle(pDC, CRect(rcButton.right - m_nSplitButtonDropDownWidth - 1, rcButton.top, rcButton.right, rcButton.bottom),
  755. TRUE, FALSE, TRUE, FALSE, FALSE, xtpBarTypeNormal, pButton->GetParent()->GetPosition());
  756. CPoint pt = CPoint(rcButton.right - 7, rcButton.CenterPoint().y);
  757. if (bEnabled == TRUE_SPLITCOMMAND) bEnabled = FALSE;
  758. DrawDropDownGlyph(pDC, pButton, pt, bSelected, bPopuped, bEnabled, FALSE);
  759. }