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

对话框与窗口

开发平台:

Visual C++

  1. // XTPDefaultTheme.cpp : implementation of the CXTPDefaultTheme 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 "XTPPaintManager.h"
  24. #include "XTPControlButton.h"
  25. #include "XTPControlPopup.h"
  26. #include "Common/XTPColorManager.h"
  27. #include "XTPToolBar.h"
  28. #include "XTPPopupBar.h"
  29. #include "XTPCommandBars.h"
  30. #include "XTPControlComboBox.h"
  31. #include "XTPControlEdit.h"
  32. #include "XTPControls.h"
  33. #ifdef _DEBUG
  34. #define new DEBUG_NEW
  35. #undef THIS_FILE
  36. static char THIS_FILE[] = __FILE__;
  37. #endif
  38. // CXTPDefaultTheme
  39. CXTPDefaultTheme::CXTPDefaultTheme()
  40. {
  41. m_iconsInfo.bUseFadedIcons = FALSE;
  42. m_iconsInfo.bIconsWithShadow = FALSE;
  43. m_nPopupBarText = COLOR_BTNTEXT;
  44. }
  45. void CXTPDefaultTheme::RefreshMetrics()
  46. {
  47. CXTPPaintManager::RefreshMetrics();
  48. m_clrFloatingGripper.SetStandardValue(GetXtremeColor(COLOR_ACTIVECAPTION));
  49. m_clrFloatingGripperText.SetStandardValue(GetXtremeColor(COLOR_CAPTIONTEXT));
  50. }
  51. void CXTPDefaultTheme::DrawRectangle(CDC* pDC, CRect rc, BOOL bSelected, BOOL bPressed, BOOL bEnabled, BOOL bChecked, BOOL bPopuped, XTPBarType barType, XTPBarPosition barPosition = xtpBarPopup)
  52. {
  53. if (m_bSelectImageInPopupBar && barPosition == xtpBarPopup && barType == xtpBarTypePopup && bChecked)
  54. {
  55. DrawShadedRect(pDC, rc);
  56. Draw3dRect(pDC, rc, COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  57. return;
  58. }
  59. if (barType == xtpBarTypePopup && !bChecked)
  60. {
  61. if (bSelected || bPressed)
  62. {
  63. Rectangle(pDC, rc, COLOR_HIGHLIGHT, COLOR_HIGHLIGHT);
  64. }
  65. return;
  66. }
  67. if (!bEnabled)
  68. {
  69. if (bChecked) Draw3dRect(pDC, rc, COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  70. if (IsKeyboardSelected(bSelected)) Draw3dRect(pDC, rc, COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  71. }
  72. else if (bChecked && !bSelected && !bPressed)
  73. {
  74. DrawShadedRect(pDC, rc);
  75. Draw3dRect(pDC, rc, COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  76. }
  77. else if (bChecked || bPopuped || IsKeyboardSelected(bPressed) || (bSelected && bPressed)) Draw3dRect(pDC, rc, COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  78. else if (bSelected || bPressed) Draw3dRect(pDC, rc, COLOR_BTNHILIGHT, COLOR_3DSHADOW);
  79. }
  80. void CXTPDefaultTheme::DrawImage(CDC* pDC, CPoint pt, CSize sz, CXTPImageManagerIcon* pImage, BOOL bSelected, BOOL bPressed, BOOL bEnabled, BOOL bChecked, BOOL bPopuped, BOOL)
  81. {
  82. if (!bEnabled)
  83. {
  84. if (!m_iconsInfo.bUseDisabledIcons && !pImage->IsAlpha())
  85. {
  86. pImage->DrawMono(pDC, pt + CPoint(1, 1), pImage->GetIcon(), sz, GetXtremeColor(COLOR_3DHILIGHT));
  87. pImage->DrawMono(pDC, pt, pImage->GetIcon(), sz, GetXtremeColor(COLOR_3DSHADOW));
  88. }
  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 (bChecked == 2 && !bPressed)
  99. {
  100. if (!pImage->IsAlpha())
  101. {
  102. pImage->DrawMono(pDC, pt, pImage->GetCheckedIcon(), sz, GetXtremeColor(COLOR_3DSHADOW));
  103. }
  104. else
  105. {
  106. if (m_iconsInfo.bOfficeStyleDisabledIcons && !pImage->HasDisabledIcon())
  107. {
  108. pImage->CreateDisabledIcon(m_clrDisabledIcon.clrLight, m_clrDisabledIcon.clrDark);
  109. }
  110. pImage->Draw(pDC, pt, pImage->GetDisabledIcon(), sz);
  111. }
  112. }
  113. else if (bPopuped || bChecked)
  114. pImage->Draw(pDC, pt, bChecked ? pImage->GetCheckedIcon() : pImage->GetIcon(), sz);
  115. else if (!bSelected && !bPressed)
  116. {
  117. pImage->Draw(pDC, pt, m_iconsInfo.bUseFadedIcons ? pImage->GetFadedIcon() : pImage->GetIcon(), sz);
  118. }
  119. else if ((bSelected && !bPressed) || (!bSelected && bPressed == TRUE))
  120. {
  121. if (m_iconsInfo.bIconsWithShadow && !pImage->GetShadowIcon().IsEmpty())
  122. {
  123. pImage->Draw(pDC, CPoint(pt.x + 1, pt.y + 1), pImage->GetShadowIcon(), sz);
  124. pImage->Draw(pDC, CPoint(pt.x - 1, pt.y - 1), pImage->GetHotIcon(), sz);
  125. }
  126. else
  127. {
  128. pImage->Draw(pDC, pt, pImage->GetHotIcon(), sz);
  129. }
  130. }
  131. else if ((bSelected && bPressed) || (IsKeyboardSelected(bPressed)))
  132. pImage->Draw(pDC, CPoint(pt.x + 1, pt.y + 1), pImage->GetPressedIcon(), sz);
  133. }
  134. void CXTPDefaultTheme::DrawControlEditSpin(CDC* pDC, CXTPControlEdit* pControlEdit)
  135. {
  136. BOOL bPressed = pControlEdit->GetPressed();
  137. BOOL bEnabled = pControlEdit->GetEnabled();
  138. BOOL bSelected = pControlEdit->GetSelected();
  139. CRect rcSpin(pControlEdit->GetSpinButtonsRect());
  140. CRect rcTop(rcSpin.left + 1, rcSpin.top + 1, rcSpin.right - 1, rcSpin.CenterPoint().y);
  141. CRect rcBottom(rcSpin.left + 1, rcTop.bottom, rcSpin.right - 1, rcSpin.bottom - 1);
  142. if (!bEnabled)
  143. {
  144. }
  145. else if (!bSelected)
  146. {
  147. rcSpin.DeflateRect(1, 1);
  148. Rectangle(pDC, rcSpin, COLOR_WINDOW, COLOR_3DFACE);
  149. }
  150. else
  151. {
  152. pDC->FillSolidRect(rcSpin, GetXtremeColor(COLOR_3DFACE));
  153. if (bPressed == XTP_EDITSPIN_UP)
  154. pDC->Draw3dRect(rcTop, GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_WINDOW));
  155. else
  156. pDC->Draw3dRect(rcTop, GetXtremeColor(COLOR_WINDOW), GetXtremeColor(COLOR_3DSHADOW));
  157. if (bPressed == XTP_EDITSPIN_DOWN)
  158. pDC->Draw3dRect(rcBottom, GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_WINDOW));
  159. else
  160. pDC->Draw3dRect(rcBottom, GetXtremeColor(COLOR_WINDOW), GetXtremeColor(COLOR_3DSHADOW));
  161. }
  162. CPoint pt = rcTop.CenterPoint();
  163. Triangle(pDC, CPoint(pt.x, pt.y - 1), CPoint(pt.x - 2, pt.y + 1), CPoint(pt.x + 2, pt.y + 1),
  164. GetXtremeColor(bEnabled ? COLOR_BTNTEXT : COLOR_GRAYTEXT));
  165. pt = rcBottom.CenterPoint();
  166. Triangle(pDC, CPoint(pt.x, pt.y + 1), CPoint(pt.x - 2, pt.y - 1), CPoint(pt.x + 2, pt.y - 1),
  167. GetXtremeColor(bEnabled ? COLOR_BTNTEXT : COLOR_GRAYTEXT));
  168. }
  169. CSize CXTPDefaultTheme::DrawControlEdit(CDC* pDC, CXTPControlEdit* pControlEdit, BOOL bDraw)
  170. {
  171. if (!bDraw)
  172. {
  173. return CXTPPaintManager::DrawControlEdit(pDC, pControlEdit, bDraw);
  174. }
  175. BOOL bEnabled = pControlEdit->GetEnabled();
  176. BOOL bSelected = pControlEdit->GetSelected();
  177. CXTPPaintManager::DrawControlEdit(pDC, pControlEdit, bDraw);
  178. CRect rc = pControlEdit->GetRect();
  179. rc.left += pControlEdit->GetLabelWidth();
  180. if (bEnabled)
  181. {
  182. CRect rcEntry(rc);
  183. rcEntry.DeflateRect(1, 1);
  184. Rectangle (pDC, rcEntry, COLOR_WINDOW, COLOR_WINDOW);
  185. }
  186. DrawControlEditFrame(pDC, rc, bEnabled, bSelected);
  187. CRect rcText(pControlEdit->GetRect());
  188. rcText.DeflateRect(pControlEdit->GetLabelWidth() + 3, 1, 3, 1);
  189. pControlEdit->DrawEditText(pDC, rcText);
  190. if (pControlEdit->IsSpinButtonsVisible())
  191. {
  192. DrawControlEditSpin(pDC, pControlEdit);
  193. }
  194. return 0;
  195. }
  196. void CXTPDefaultTheme::DrawControlEditFrame(CDC* pDC, CRect rc, BOOL bEnabled, BOOL bSelected)
  197. {
  198. if (!bEnabled)
  199. {
  200. rc.DeflateRect(1, 1);
  201. Draw3dRect(pDC, rc, IsKeyboardSelected(bSelected) ? COLOR_3DSHADOW: COLOR_3DHIGHLIGHT, IsKeyboardSelected(bSelected) ? COLOR_3DSHADOW : COLOR_3DHIGHLIGHT);
  202. }
  203. else
  204. {
  205. if (bSelected)
  206. {
  207. Draw3dRect(pDC, rc, COLOR_3DSHADOW, COLOR_3DHIGHLIGHT);
  208. }
  209. rc.DeflateRect(1, 1);
  210. Draw3dRect(pDC, rc, COLOR_3DFACE, COLOR_3DFACE);
  211. }
  212. }
  213. void CXTPDefaultTheme::DrawControlComboBoxButton(CDC* pDC, CRect rcBtn, BOOL bEnabled, BOOL bSelected, BOOL bDropped)
  214. {
  215. rcBtn.DeflateRect(1, 2, 2, 2);
  216. if (bEnabled)
  217. {
  218. Rectangle (pDC, rcBtn, COLOR_3DFACE, COLOR_3DFACE);
  219. if (bDropped)
  220. {
  221. pDC->FillSolidRect(rcBtn.left - 1, rcBtn.top, 1, rcBtn.Height(), GetXtremeColor(COLOR_3DFACE));
  222. Draw3dRect(pDC, rcBtn, COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  223. rcBtn.OffsetRect(1, 1);
  224. }
  225. else if (bSelected)
  226. {
  227. pDC->FillSolidRect(rcBtn.left - 1, rcBtn.top, 1, rcBtn.Height(), GetXtremeColor(COLOR_3DFACE));
  228. Draw3dRect(pDC, rcBtn, COLOR_BTNHILIGHT, COLOR_3DSHADOW);
  229. }
  230. else
  231. {
  232. Draw3dRect(pDC, rcBtn, COLOR_BTNHILIGHT, COLOR_BTNHILIGHT);
  233. }
  234. }
  235. DrawComboExpandMark(pDC, rcBtn, GetXtremeColor(COLOR_BTNTEXT));
  236. }
  237. CSize CXTPDefaultTheme::DrawControlComboBox(CDC* pDC, CXTPControlComboBox* pControlCombo, BOOL bDraw)
  238. {
  239. if (!bDraw)
  240. {
  241. return CXTPPaintManager::DrawControlComboBox(pDC, pControlCombo, bDraw);
  242. }
  243. CXTPFontDC font(pDC, GetIconFont());
  244. CRect rc = pControlCombo->GetRect();
  245. BOOL bEnabled = pControlCombo->GetEnabled();
  246. CXTPPaintManager::DrawControlComboBox(pDC, pControlCombo, bDraw);
  247. rc.left += pControlCombo->GetLabelWidth();
  248. int nThumb = pControlCombo->GetThumbWidth();
  249. CRect rcBtn (rc.right - nThumb, rc.top, rc.right, rc.bottom);
  250. BOOL bDropped = pControlCombo->GetDroppedState() != 0;
  251. BOOL bSelected = pControlCombo->GetSelected();
  252. if (bEnabled)
  253. {
  254. CRect rcEntry(rc);
  255. rcEntry.DeflateRect(1, 1);
  256. Rectangle (pDC, rcEntry, COLOR_WINDOW, COLOR_WINDOW);
  257. }
  258. CRect rcText(rc.left + 3, rc.top + 1, rc.right - rcBtn.Width() + 1, rc.bottom - 1);
  259. pControlCombo->DrawEditText(pDC, rcText);
  260. DrawControlComboBoxButton(pDC, rcBtn, bEnabled, bSelected, bDropped);
  261. DrawControlEditFrame(pDC, rc, bEnabled, bSelected);
  262. return 0;
  263. }
  264. CSize CXTPDefaultTheme::DrawSpecialControl(CDC* pDC, XTPSpecialControl controlType, CXTPControl* pButton, CXTPCommandBar* pBar, BOOL bDraw, LPVOID lpParam)
  265. {
  266. if (controlType == xtpButtonExpandFloating || controlType == xtpButtonHideFloating)
  267. {
  268. if (pButton->GetPressed() || pButton->GetSelected() || (controlType == xtpButtonExpandFloating && pButton->GetPopuped()))
  269. pDC->FillSolidRect(pButton->GetRect(), GetXtremeColor(COLOR_3DFACE));
  270. }
  271. return CXTPPaintManager::DrawSpecialControl(pDC, controlType, pButton, pBar, bDraw, lpParam);
  272. }
  273. CSize CXTPDefaultTheme::GetPopupBarImageSize(CXTPCommandBar* pBar)
  274. {
  275. CSize szIcon = pBar->GetIconSize();
  276. CSize szImage(max(szIcon.cx + 4, m_nTextHeight), max(szIcon.cy + 4, m_nTextHeight));
  277. return szImage;
  278. }
  279. CSize CXTPDefaultTheme::DrawControlPopupParent(CDC* pDC, CXTPControl* pButton, BOOL bDraw)
  280. {
  281. CXTPCommandBar* pParent = pButton->GetParent();
  282. CRect rcButton = pButton->GetRect();
  283. XTPControlType controlType = pButton->GetType();
  284. XTPButtonStyle buttonStyle = pButton->GetStyle();
  285. BOOL bDrawImage = (buttonStyle == xtpButtonAutomatic && controlType != xtpControlPopup) ||
  286. (buttonStyle != xtpButtonCaption);
  287. BOOL bSelected = pButton->GetSelected(), bEnabled = pButton->GetEnabled(), bChecked = pButton->GetChecked(),
  288. bPopuped = pButton->GetPopuped();
  289. if (controlType == xtpControlSplitButtonPopup && bEnabled == TRUE_SPLITDROPDOWN)
  290. bEnabled = FALSE;
  291. BOOL bLayoutRTL = pParent->IsLayoutRTL();
  292. BOOL bDoubleGripper = pParent->IsPopupBar() ? ((CXTPPopupBar*)pParent)->IsDoubleGripper() : FALSE;
  293. CString strCaption = pButton->GetCaption();
  294. if (bLayoutRTL) UpdateRTLCaption(strCaption);
  295. CSize szIcon = GetIconSize(pButton);
  296. CSize szImage(max(szIcon.cx + 4, m_nTextHeight), max(szIcon.cy + 4, m_nTextHeight));
  297. if (bDraw)
  298. {
  299. CRect rcSelection(rcButton.left, rcButton.top, rcButton.right, rcButton.bottom);
  300. CRect rcImageRect(rcButton.left, rcButton.top, rcButton.left + szImage.cx, rcButton.bottom);
  301. CRect rcCheck (CPoint(rcImageRect.left + rcImageRect.Width()/2 - 10, rcImageRect.top + rcImageRect.Height()/2 - 10), CSize(20, 20));
  302. if (pButton->GetExpanded())
  303. {
  304. int nGripperWidth = GetPopupBarGripperWidth(pParent);
  305. pDC->FillSolidRect(rcButton, GetXtremeColor(COLOR_3DLIGHT));
  306. if (pButton->GetExpanded() && rcButton.left < nGripperWidth)
  307. {
  308. DrawPopupBarGripper(pDC, rcButton.left - 1, rcButton.top, nGripperWidth + 1, rcButton.Height(), TRUE);
  309. }
  310. }
  311. COLORREF clrText = GetRectangleTextColor(bSelected, FALSE, bEnabled, FALSE, FALSE, xtpBarTypePopup, xtpBarPopup);
  312. pDC->SetTextColor(clrText);
  313. if (m_bSelectImageInPopupBar && bSelected)
  314. DrawRectangle(pDC, rcSelection, bSelected, FALSE, TRUE, FALSE, FALSE, xtpBarTypePopup, xtpBarPopup);
  315. if (bChecked)
  316. {
  317. DrawRectangle(pDC, rcImageRect, bSelected, FALSE, bEnabled, bChecked, FALSE, xtpBarTypePopup, xtpBarPopup);
  318. rcSelection.left = rcImageRect.right + 1;
  319. }
  320. if (bDoubleGripper)
  321. rcImageRect.OffsetRect(szImage.cx + 1, 0);
  322. CXTPImageManagerIcon* pImage = pButton->GetIconId() != 0 && bDrawImage ? pButton->GetImage(szIcon.cx) : NULL;
  323. if (pImage)
  324. {
  325. szIcon.cy = pImage->GetHeight() * szIcon.cx / pImage->GetWidth();
  326. if (!m_bSelectImageInPopupBar) DrawRectangle(pDC, rcImageRect, bSelected, FALSE, bEnabled, bDoubleGripper ? FALSE : bChecked, FALSE, xtpBarTypeNormal, xtpBarPopup);
  327. CPoint ptImage = CPoint(rcImageRect.left + rcImageRect.Width()/2 - szIcon.cx/2, rcImageRect.top + rcImageRect.Height()/2 - szIcon.cy/2);
  328. DrawImage(pDC, ptImage, szIcon, pImage, bSelected, FALSE, bEnabled, bChecked, FALSE, FALSE);
  329. rcSelection.left = rcImageRect.right + 1;
  330. }
  331. if (bChecked && (bDoubleGripper || !pImage))
  332. {
  333. if (controlType != xtpControlRadioButton)
  334. DrawPopupBarCheckMark(pDC, rcCheck, bEnabled, GetXtremeColor(!bEnabled ? COLOR_GRAYTEXT : m_nPopupBarText));
  335. else
  336. DrawPopupBarRadioMark(pDC, rcCheck, bEnabled, GetXtremeColor(!bEnabled ? COLOR_GRAYTEXT : m_nPopupBarText));
  337. }
  338. pDC->SetBkMode (TRANSPARENT);
  339. if (IsPopupControlType(controlType))
  340. {
  341. CPoint pt = CPoint(rcButton.right - 11, rcButton.CenterPoint().y);
  342. if (pButton->GetType() == xtpControlSplitButtonPopup)
  343. {
  344. if (!bPopuped || !bSelected || !bEnabled)
  345. {
  346. if (bSelected && !m_bSelectImageInPopupBar) DrawRectangle(pDC, rcSelection, bSelected, FALSE, TRUE, FALSE, FALSE, xtpBarTypePopup, xtpBarPopup);;
  347. VerticalLine(pDC, rcButton.right - 20, rcButton.top + 1, rcButton.bottom - 1, !bEnabled ? clrText : GetXtremeColor(bSelected ? COLOR_3DSHADOW : m_nPopupBarText));
  348. }
  349. else
  350. {
  351. rcSelection.right -= 20;
  352. Draw3dRect(pDC, CRect(rcButton.right - 20, rcButton.top, rcButton.right, rcButton.bottom), COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  353. if (bSelected && !m_bSelectImageInPopupBar) DrawRectangle(pDC, rcSelection, bSelected, FALSE, TRUE, FALSE, FALSE, xtpBarTypePopup, xtpBarPopup);
  354. }
  355. Triangle(pDC, CPoint(pt.x, pt.y - 3), CPoint(pt.x + 3, pt.y), CPoint(pt.x, pt.y + 3), m_bSelectImageInPopupBar || !bPopuped || !bSelected ? clrText : GetXtremeColor(m_nPopupBarText));
  356. }
  357. else
  358. {
  359. if (bSelected && !m_bSelectImageInPopupBar) DrawRectangle(pDC, rcSelection, bSelected, FALSE, TRUE, FALSE, FALSE, xtpBarTypePopup, xtpBarPopup);
  360. Triangle(pDC, CPoint(pt.x, pt.y - 3), CPoint(pt.x + 3, pt.y), CPoint(pt.x, pt.y + 3), clrText);
  361. }
  362. }
  363. else if (bSelected && !m_bSelectImageInPopupBar)
  364. DrawRectangle(pDC, rcSelection, bSelected, FALSE, TRUE, FALSE, FALSE, xtpBarTypePopup, xtpBarPopup);
  365. }
  366. return CXTPPaintManager::DrawControlPopupParent(pDC, pButton, bDraw);
  367. }
  368. COLORREF CXTPDefaultTheme::GetRectangleTextColor(BOOL bSelected, BOOL /*bPressed*/, BOOL bEnabled, BOOL bChecked, BOOL /*bPopuped*/, XTPBarType barType, XTPBarPosition barPosition)
  369. {
  370. if (barType == xtpBarTypePopup)
  371. {
  372. return GetXtremeColor(!bEnabled ? COLOR_GRAYTEXT: bSelected && !bChecked ? COLOR_HIGHLIGHTTEXT : m_nPopupBarText);
  373. }
  374. int nColorFace = barPosition == xtpBarPopup ? m_nPopupBarText : COLOR_BTNTEXT;
  375. return GetXtremeColor(!bEnabled ? COLOR_GRAYTEXT : nColorFace);
  376. }
  377. void CXTPDefaultTheme::DrawShadedRect(CDC* pDC, CRect& rect)
  378. {
  379. WORD bits[] =
  380. {
  381. 0x0055, 0x00AA, 0x0055, 0x00AA,
  382. 0x0055, 0x00AA, 0x0055, 0x00AA
  383. };
  384. CBitmap bitmap;
  385. bitmap.CreateBitmap(8, 8, 1, 1, &bits);
  386. CBrush brush;
  387. brush.CreatePatternBrush(&bitmap);
  388. CBrush* pOldBrush = pDC->SelectObject(&brush);
  389. COLORREF crBack = pDC->SetBkColor(GetXtremeColor(COLOR_3DFACE));
  390. COLORREF crText = pDC->SetTextColor(GetXtremeColor(COLOR_3DHIGHLIGHT));
  391. pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
  392. pDC->SelectObject(pOldBrush);
  393. pDC->SetBkColor(crBack);
  394. pDC->SetTextColor(crText);
  395. brush.DeleteObject();
  396. }
  397. void CXTPDefaultTheme::DrawSplitButtonFrame(CDC* pDC, CXTPControl* pButton, CRect rcButton)
  398. {
  399. BOOL bPressed = pButton->GetPressed(), bSelected = pButton->GetSelected(), bEnabled = pButton->GetEnabled(), bChecked = pButton->GetChecked(),
  400. bPopuped = pButton->GetPopuped();
  401. if (pButton->GetStyle() == xtpButtonIconAndCaptionBelow)
  402. {
  403. int nSplitDropDownHeight = GetSplitDropDownHeight();
  404. BOOL bVert = pButton->GetParent()->GetPosition() == xtpBarLeft ||
  405. pButton->GetParent()->GetPosition() == xtpBarRight;
  406. if (bVert)
  407. DrawRectangle(pDC, CRect(rcButton.left + nSplitDropDownHeight, rcButton.top, rcButton.right, rcButton.bottom),
  408. bSelected || bPopuped, bPressed, bEnabled, bChecked, FALSE, xtpBarTypeNormal, pButton->GetParent()->GetPosition());
  409. else
  410. DrawRectangle(pDC, CRect(rcButton.left, rcButton.top, rcButton.right, rcButton.bottom - nSplitDropDownHeight),
  411. bSelected || bPopuped, bPressed, bEnabled, bChecked, FALSE, xtpBarTypeNormal, pButton->GetParent()->GetPosition());
  412. if ((bSelected || bPressed || bPopuped) && bEnabled)
  413. {
  414. if (bVert)
  415. DrawRectangle(pDC, CRect(rcButton.left, rcButton.top, rcButton.left + nSplitDropDownHeight, rcButton.bottom),
  416. TRUE, FALSE, bEnabled, FALSE, bPopuped, xtpBarTypeNormal, pButton->GetParent()->GetPosition());
  417. else
  418. DrawRectangle(pDC, CRect(rcButton.left, rcButton.bottom - nSplitDropDownHeight, rcButton.right, rcButton.bottom),
  419. TRUE, FALSE, bEnabled, FALSE, bPopuped, xtpBarTypeNormal, pButton->GetParent()->GetPosition());
  420. }
  421. return;
  422. }
  423. DrawRectangle(pDC, CRect(rcButton.left, rcButton.top, rcButton.right - 12, rcButton.bottom),
  424. bSelected || bPopuped, bPressed, bEnabled, bChecked, FALSE, xtpBarTypeNormal, pButton->GetParent()->GetPosition());
  425. CPoint pt = CPoint(rcButton.right - 7, rcButton.CenterPoint().y);
  426. if ((bSelected || bPressed || bPopuped) && bEnabled)
  427. DrawRectangle(pDC, CRect(rcButton.right - 12, rcButton.top, rcButton.right, rcButton.bottom),
  428. TRUE, FALSE, bEnabled, FALSE, bPopuped, xtpBarTypeNormal, pButton->GetParent()->GetPosition());
  429. if (bEnabled == TRUE_SPLITCOMMAND) bEnabled = FALSE;
  430. DrawDropDownGlyph(pDC, pButton, pt, bSelected, bPopuped, bEnabled, FALSE);
  431. }
  432. void CXTPDefaultTheme::FillCommandBarEntry(CDC* pDC, CXTPCommandBar* pBar)
  433. {
  434. CRect rc;
  435. pBar->GetClientRect(&rc);
  436. pDC->FillSolidRect(rc, GetXtremeColor(COLOR_3DFACE));
  437. if (pBar->GetPosition() == xtpBarFloating || pBar->GetPosition() == xtpBarPopup)
  438. {
  439. Draw3dRect(pDC, rc, COLOR_3DFACE, COLOR_3DDKSHADOW);
  440. rc.DeflateRect(1, 1);
  441. Draw3dRect(pDC, rc, COLOR_BTNHILIGHT, COLOR_3DSHADOW);
  442. }
  443. else if (!IsFlatToolBar(pBar))
  444. {
  445. Draw3dRect(pDC, rc, COLOR_BTNHILIGHT, COLOR_3DSHADOW);
  446. }
  447. }
  448. CSize CXTPDefaultTheme::DrawDialogBarGripper(CDC* pDC, CXTPDialogBar* /*pBar*/, BOOL bDraw)
  449. {
  450. CSize sz(6, max(22, m_nTextHeight + 4));
  451. if (pDC && bDraw)
  452. {
  453. Draw3dRect(pDC, CRect(3, 3, 6, sz.cy), COLOR_BTNHILIGHT, COLOR_3DSHADOW);
  454. }
  455. return sz;
  456. }
  457. CSize CXTPDefaultTheme::DrawCommandBarGripper(CDC* pDC, CXTPCommandBar* pBar, BOOL bDraw)
  458. {
  459. if (pBar->IsDialogBar())
  460. return DrawDialogBarGripper(pDC, (CXTPDialogBar*)pBar, bDraw);
  461. CRect rc;
  462. pBar->GetClientRect(&rc);
  463. if (pBar->GetPosition() == xtpBarFloating)
  464. {
  465. return CXTPPaintManager::DrawCommandBarGripper(pDC, pBar, bDraw);
  466. }
  467. else if (pBar->GetPosition() == xtpBarRight || pBar->GetPosition() == xtpBarLeft)
  468. {
  469. if (pDC && bDraw)
  470. Draw3dRect(pDC, CRect(3, 3, rc.right - 3, 6), COLOR_BTNHILIGHT, COLOR_3DSHADOW);
  471. return CSize(0, 8);
  472. }
  473. else if (pBar->GetPosition() == xtpBarTop || pBar->GetPosition() == xtpBarBottom)
  474. {
  475. if (pDC && bDraw)
  476. Draw3dRect(pDC, CRect(3, 3, 6, rc.bottom - 3), COLOR_BTNHILIGHT, COLOR_3DSHADOW);
  477. return CSize(6, 0);
  478. }
  479. return 0;
  480. }
  481. CSize CXTPDefaultTheme::DrawCommandBarSeparator(CDC* pDC, CXTPCommandBar* pBar, CXTPControl* pControl, BOOL bDraw)
  482. {
  483. if (!bDraw)
  484. {
  485. if (pBar->GetType() == xtpBarTypePopup)
  486. return CSize(8, 8);
  487. return CSize(6, 6);
  488. }
  489. CRect rc;
  490. pBar->GetClientRect(&rc);
  491. CRect rcControl = pControl->GetRect();
  492. CRect rcRow = pControl->GetRowRect();
  493. if (pBar->GetType() == xtpBarTypePopup)
  494. {
  495. if (!pControl->GetWrap())
  496. Draw3dRect(pDC, CRect(rcControl.left + 11, rcControl.top - 2 - 2 -1, rcControl.right - 11, rcControl.top - 0 - 2 -  1), COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  497. else
  498. Draw3dRect(pDC, CRect(rcControl.left - 5 , rcRow.top + 3, rcControl.left - 3, rcRow.bottom - 3), COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  499. }
  500. else if (pBar->GetPosition() != xtpBarPopup && IsVerticalPosition(pBar->GetPosition()))
  501. {
  502. if (!pControl->GetWrap())
  503. Draw3dRect(pDC, CRect(rcRow.left, rcControl.top - 4, rcRow.right, rcControl.top - 2), COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  504. else
  505. Draw3dRect(pDC, CRect(rcRow.right + 2, rcRow.top + 4, rcRow.right + 4, rcRow.bottom), COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  506. }
  507. else
  508. {
  509. if (!pControl->GetWrap())
  510. Draw3dRect(pDC, CRect(rcControl.left - 4, rcRow.top, rcControl.left - 2, rcRow.bottom), COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  511. else
  512. Draw3dRect(pDC, CRect(rcRow.left + 4, rcRow.top - 4, rcRow.right, rcRow.top - 2), COLOR_3DSHADOW, COLOR_BTNHILIGHT);
  513. }
  514. return 0;
  515. }
  516. void CXTPDefaultTheme::AdjustExcludeRect(CRect& rc, CXTPControl* pControl, BOOL bVertical)
  517. {
  518. CXTPCommandBar* pParent = pControl->GetParent();
  519. ASSERT(pParent);
  520. if (!pParent)
  521. return;
  522. if (pControl->GetType() == xtpControlComboBox) return;
  523. if (pParent->GetType() != xtpBarTypePopup)
  524. {
  525. if (bVertical)
  526. rc.InflateRect(0, 1);
  527. else
  528. rc.InflateRect(1, 0);
  529. }
  530. else
  531. {
  532. rc.DeflateRect(1, 0);
  533. }
  534. }
  535. CRect CXTPDefaultTheme::GetCommandBarBorders(CXTPCommandBar* pBar)
  536. {
  537. if (pBar->GetType() == xtpBarTypePopup)
  538. return CRect(3, 3, 3, 3);
  539. else return CXTPPaintManager::GetCommandBarBorders(pBar);
  540. }
  541. CSize CXTPDefaultTheme::DrawListBoxControl(CDC* pDC, CXTPControl* pButton, CRect rcButton, BOOL bSelected, BOOL bDraw, CXTPCommandBars* pCommandBars)
  542. {
  543. CSize szIcon = pCommandBars && pCommandBars->GetCommandBarsOptions()->szPopupIcons != CSize(0) ?
  544. pCommandBars->GetCommandBarsOptions()->szPopupIcons : GetAutoIconSize(FALSE);
  545. CSize szImage(max(szIcon.cx + 4, m_nTextHeight), max(szIcon.cy + 4, m_nTextHeight));
  546. if (bDraw)
  547. {
  548. if (pButton == NULL)
  549. {
  550. pDC->FillSolidRect(rcButton, GetXtremeColor(COLOR_3DFACE));
  551. return 0;
  552. }
  553. pDC->FillSolidRect(rcButton, GetXtremeColor(COLOR_3DFACE));
  554. CRect rcSelection(rcButton.left + 1, rcButton.top, rcButton.right - 1, rcButton.bottom);
  555. XTPControlType controlType = pButton->GetType();
  556. XTPButtonStyle buttonStyle = pButton->GetStyle();
  557. BOOL bDrawImage = (buttonStyle == xtpButtonAutomatic && controlType != xtpControlPopup) ||
  558. (buttonStyle == xtpButtonIcon) || (buttonStyle == xtpButtonIconAndCaption);
  559. CXTPImageManagerIcon* pImage = pButton->GetIconId() != 0 && bDrawImage ? pButton->GetImage(szIcon.cx) : NULL;
  560. if (pImage)
  561. {
  562. szIcon.cy = pImage->GetHeight() * szIcon.cx / pImage->GetWidth();
  563. CRect rcImageRect(rcButton.left, rcButton.top, rcButton.left + szImage.cx, rcButton.bottom);
  564. DrawRectangle(pDC, rcImageRect, bSelected, FALSE, TRUE, FALSE, FALSE, xtpBarTypeNormal, xtpBarPopup);
  565. CPoint ptImage = CPoint(rcImageRect.left + rcImageRect.Width()/2 - szIcon.cx/2, rcImageRect.top +  rcImageRect.Height()/2 - szIcon.cy/2);
  566. DrawImage(pDC, ptImage, szIcon, pImage, bSelected, FALSE, TRUE, FALSE, FALSE, FALSE);
  567. rcSelection.left = rcImageRect.right + 1;
  568. }
  569. if (bSelected)
  570. Rectangle(pDC, rcSelection, COLOR_HIGHLIGHT, COLOR_HIGHLIGHT);
  571. COLORREF clrText = GetXtremeColor(bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_BTNTEXT);
  572. pDC->SetTextColor(clrText);
  573. pDC->SetBkMode (TRANSPARENT);
  574. CString strText = pButton->GetCaption();
  575. StripMnemonics(strText);
  576. if (pCommandBars && pCommandBars->IsLayoutRTL())
  577. UpdateRTLCaption(strText);
  578. CRect rcText(rcButton.left + szImage.cx + 4, rcButton.top, rcButton.right, rcButton.bottom);
  579. CXTPFontDC fnt(pDC, &m_fontRegular);
  580. pDC->DrawText(strText, &rcText, DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS | DT_NOPREFIX);
  581. if (controlType == xtpControlPopup || controlType == xtpControlButtonPopup || controlType == xtpControlSplitButtonPopup)
  582. {
  583. CPoint pt(rcButton.right - 7, rcButton.CenterPoint().y);
  584. Triangle(pDC, pt, CPoint(pt.x - 5, pt.y - 5), CPoint(pt.x - 5, pt.y + 5), clrText);
  585. }
  586. if (controlType == xtpControlSplitButtonPopup)
  587. {
  588. Line(pDC, rcButton.right - 20, rcButton.top + 1, rcButton.right - 20, rcButton.bottom - 1, bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_BTNTEXT);
  589. }
  590. if (controlType == xtpControlComboBox || controlType == xtpControlEdit)
  591. {
  592. rcText.SetRectEmpty();
  593. pDC->DrawText(strText, &rcText, DT_SINGLELINE | DT_CALCRECT);
  594. int nThumb = pDC->GetTextExtent(_T(" "), 1).cy + 2;
  595. CRect rcCombo(rcButton.left + szImage.cx + 4 + rcText.Width() + 5, rcButton.top, rcButton.right, rcButton.bottom);
  596. CRect rcThumb(rcButton.right - nThumb, rcButton.top, rcButton.right, rcButton.bottom);
  597. Rectangle(pDC, rcCombo, bSelected ? COLOR_HIGHLIGHT : COLOR_3DFACE, COLOR_WINDOW);
  598. if (controlType == xtpControlComboBox)
  599. {
  600. if (!bSelected) pDC->FillSolidRect(rcThumb.left + 2, rcThumb.top + 2, rcThumb.Width() - 4, rcThumb.Height() - 4, GetXtremeColor(COLOR_3DFACE));
  601. else Rectangle(pDC, rcThumb, COLOR_HIGHLIGHT, COLOR_3DFACE);
  602. rcThumb.DeflateRect(1, 1, 1, 1);
  603. DrawComboExpandMark(pDC, rcThumb, GetXtremeColor(COLOR_BTNTEXT));
  604. }
  605. }
  606. }
  607. return szImage;
  608. }
  609. CSize CXTPDefaultTheme::DrawTearOffGripper(CDC* pDC, CRect rcGripper, BOOL bSelected, BOOL bDraw)
  610. {
  611. if (bDraw)
  612. {
  613. CRect rc(rcGripper.left, rcGripper.top, rcGripper.right, rcGripper.bottom - 1);
  614. pDC->FillSolidRect(rc, GetXtremeColor(bSelected ? COLOR_ACTIVECAPTION : COLOR_INACTIVECAPTION));
  615. }
  616. return CSize(0, 8);
  617. }
  618. void CXTPDefaultTheme::DrawPopupResizeGripper(CDC* pDC, CRect rcGripper, int nFlags)
  619. {
  620. int c = rcGripper.CenterPoint().x;
  621. if (nFlags == 2)
  622. {
  623. for (int x = c - 8; x < c + 8; x += 4)
  624. {
  625. pDC->FillSolidRect(CRect(x + 1, 4 + rcGripper.top, x + 3, 6 + rcGripper.top), GetXtremeColor(COLOR_WINDOW));
  626. pDC->FillSolidRect(CRect(x, 3 + rcGripper.top, x + 2, 5 + rcGripper.top), GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));
  627. }
  628. }
  629. else
  630. {
  631. int x = rcGripper.right - 4;
  632. int y = rcGripper.bottom - 4;
  633. pDC->FillSolidRect(CRect(x + 1, 1 + y, x + 3, 3 + y), GetXtremeColor(COLOR_WINDOW));
  634. pDC->FillSolidRect(CRect(x, 0 + y, x + 2, 2 + y), GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));
  635. x-= 4;
  636. pDC->FillSolidRect(CRect(x + 1, 1 + y, x + 3, 3 + y), GetXtremeColor(COLOR_WINDOW));
  637. pDC->FillSolidRect(CRect(x, 0 + y, x + 2, 2 + y), GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));
  638. x += 4;
  639. y -=4;
  640. pDC->FillSolidRect(CRect(x + 1, 1 + y, x + 3, 3 + y), GetXtremeColor(COLOR_WINDOW));
  641. pDC->FillSolidRect(CRect(x, 0 + y, x + 2, 2 + y), GetXtremeColor(XPCOLOR_TOOLBAR_GRIPPER));
  642. }
  643. }