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

对话框与窗口

开发平台:

Visual C++

  1. // XTPNativeXPTheme.cpp : implementation of the CXTPNativeXPTheme 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 "XTPControlComboBox.h"
  30. #include "XTPDockBar.h"
  31. #include "XTPControlEdit.h"
  32. #define COLOR_MENUHILIGHT       29
  33. #ifdef _DEBUG
  34. #define new DEBUG_NEW
  35. #undef THIS_FILE
  36. static char THIS_FILE[] = __FILE__;
  37. #endif
  38. #ifndef SPI_GETFLATMENU
  39. #define SPI_GETFLATMENU    0x1022
  40. #endif
  41. #ifndef __VSSTYLE_H__
  42. enum VISTAMENUPARTS
  43. {
  44. MENU_MENUITEM_TMSCHEMA = 1,
  45. MENU_MENUDROPDOWN_TMSCHEMA = 2,
  46. MENU_MENUBARITEM_TMSCHEMA = 3,
  47. MENU_MENUBARDROPDOWN_TMSCHEMA = 4,
  48. MENU_CHEVRON_TMSCHEMA = 5,
  49. MENU_SEPARATOR_TMSCHEMA = 6,
  50. MENU_BARBACKGROUND = 7,
  51. MENU_BARITEM = 8,
  52. MENU_POPUPBACKGROUND = 9,
  53. MENU_POPUPBORDERS = 10,
  54. MENU_POPUPCHECK = 11,
  55. MENU_POPUPCHECKBACKGROUND = 12,
  56. MENU_POPUPGUTTER = 13,
  57. MENU_POPUPITEM = 14,
  58. MENU_POPUPSEPARATOR = 15,
  59. MENU_POPUPSUBMENU = 16,
  60. MENU_SYSTEMCLOSE = 17,
  61. MENU_SYSTEMMAXIMIZE = 18,
  62. MENU_SYSTEMMINIMIZE = 19,
  63. MENU_SYSTEMRESTORE = 20,
  64. };
  65. #endif
  66. CXTPNativeXPTheme::CXTPNativeXPTheme()
  67. {
  68. m_iconsInfo.bUseFadedIcons = TRUE;
  69. m_iconsInfo.bIconsWithShadow = FALSE;
  70. m_nPopupBarText = COLOR_MENUTEXT;
  71. m_bFlatMenus = TRUE;
  72. m_bThemedStatusBar = TRUE;
  73. m_bThemedCheckBox = TRUE;
  74. m_bSelectImageInPopupBar = TRUE;
  75. m_bThickCheckMark = TRUE;
  76. }
  77. CXTPNativeXPTheme::~CXTPNativeXPTheme()
  78. {
  79. }
  80. void CXTPNativeXPTheme::RefreshMetrics()
  81. {
  82. CXTPDefaultTheme::RefreshMetrics();
  83. HWND hWnd = AfxGetMainWnd() ? AfxGetMainWnd()->GetSafeHwnd() : 0;
  84. m_themeToolbar.OpenThemeData(hWnd, L"TOOLBAR");
  85. m_themeRebar.OpenThemeData(hWnd, L"REBAR");
  86. m_themeCombo.OpenThemeData(hWnd, L"COMBOBOX");
  87. m_themeWindow.OpenThemeData(hWnd, L"WINDOW");
  88. m_themeSpin.OpenThemeData(hWnd, L"SPIN");
  89. m_themeMenu.OpenThemeData(hWnd, L"MENU");
  90. m_bFlatMenus = TRUE;
  91. if (!SystemParametersInfo(SPI_GETFLATMENU, 0, &m_bFlatMenus, 0))
  92. {
  93. m_bFlatMenus = FALSE;
  94. }
  95. if (!m_themeRebar.IsAppThemed() || FAILED(m_themeRebar.GetThemeColor(RP_BAND, 0, TMT_EDGESHADOWCOLOR, &m_clrEdgeShadowColor)))
  96. m_clrEdgeShadowColor = GetXtremeColor(COLOR_3DSHADOW);
  97. if (!m_themeRebar.IsAppThemed() || FAILED(m_themeRebar.GetThemeColor(RP_BAND, 0, TMT_EDGEHIGHLIGHTCOLOR, &m_clrEdgeHighLightColor)))
  98. m_clrEdgeHighLightColor  = GetXtremeColor(COLOR_BTNHILIGHT);
  99. COLORREF clr;
  100. if (m_themeToolbar.IsAppThemed() && SUCCEEDED(m_themeToolbar.GetThemeColor(0, 0, TMT_TEXTCOLOR, &clr)))
  101. m_arrColor[COLOR_BTNTEXT].SetStandardValue(clr);
  102. if (!m_bFlatMenus && m_themeRebar.IsAppThemed())
  103. {
  104. m_bFlatMenus = m_themeRebar.GetThemeSysBool(TMT_FLATMENUS);
  105. }
  106. if (!m_bFlatMenus)
  107. {
  108. m_arrColor[COLOR_MENUHILIGHT].SetStandardValue(m_arrColor[COLOR_HIGHLIGHT]);
  109. }
  110. }
  111. void CXTPNativeXPTheme::DrawControlEntry(CDC* pDC, CXTPControl* pButton)
  112. {
  113. CXTPCommandBar* pParent = pButton->GetParent();
  114. if (!IsThemeEnabled() || !pParent)
  115. {
  116. CXTPDefaultTheme::DrawControlEntry(pDC, pButton);
  117. return;
  118. }
  119. if (pButton->GetType() == xtpControlPopup && pParent->GetPosition() != xtpBarPopup && IsFlatToolBar(pParent) && pParent->GetType() == xtpBarTypeMenuBar)
  120. {
  121. if (pButton->GetSelected() || pButton->GetPopuped() || pButton->GetPressed())
  122. {
  123. pDC->FillSolidRect(pButton->GetRect(), GetXtremeColor(COLOR_HIGHLIGHT));
  124. }
  125. }
  126. else
  127. {
  128. CXTPDefaultTheme::DrawControlEntry(pDC, pButton);
  129. }
  130. }
  131. COLORREF CXTPNativeXPTheme::GetControlTextColor(CXTPControl* pButton)
  132. {
  133. CXTPCommandBar* pParent = pButton->GetParent();
  134. if (!IsThemeEnabled() || !pParent)
  135. return CXTPDefaultTheme::GetControlTextColor(pButton);
  136. if (pButton->GetType() == xtpControlPopup && pParent->GetPosition() != xtpBarPopup && IsFlatToolBar(pParent) && pParent->GetType() == xtpBarTypeMenuBar)
  137. {
  138. if (pButton->GetSelected() || pButton->GetPopuped() || pButton->GetPressed())
  139. {
  140. return GetXtremeColor(COLOR_HIGHLIGHTTEXT);
  141. }
  142. }
  143. return CXTPDefaultTheme::GetControlTextColor(pButton);
  144. }
  145. void CXTPNativeXPTheme::DrawRectangle(CDC* pDC, CRect rc, BOOL bSelected, BOOL bPressed, BOOL bEnabled , BOOL bChecked , BOOL bPopuped, XTPBarType barType, XTPBarPosition barPosition /*= xtpBarPopup*/)
  146. {
  147. if (!IsThemeEnabled())
  148. {
  149. CXTPDefaultTheme::DrawRectangle(pDC, rc, bSelected, bPressed, bEnabled , bChecked , bPopuped, barType, barPosition);
  150. return;
  151. }
  152. if (barType == xtpBarTypePopup && !bChecked)
  153. {
  154. if (bSelected || bPressed)
  155. {
  156. if (m_themeMenu.IsAppThemed())
  157. {
  158. m_themeMenu.DrawBackground(pDC->GetSafeHdc(), MENU_POPUPITEM, 2, rc, NULL);
  159. }
  160. else
  161. {
  162. Rectangle(pDC, rc, COLOR_HIGHLIGHT, COLOR_MENUHILIGHT);
  163. }
  164. }
  165. return;
  166. }
  167. if (m_bSelectImageInPopupBar && barPosition == xtpBarPopup && barType == xtpBarTypePopup && bChecked && m_themeMenu.IsAppThemed())
  168. {
  169. m_themeMenu.DrawBackground(pDC->GetSafeHdc(), MENU_POPUPCHECKBACKGROUND, bEnabled ? 2 : 1, rc, NULL);
  170. return;
  171. }
  172. if (bChecked == 2 && bEnabled)
  173. bChecked = FALSE;
  174. int nState = !bEnabled ? (bChecked ? TS_PRESSED : TS_DISABLED) :
  175. bPopuped ? TS_PRESSED :
  176. bChecked && !bPressed ? (bSelected ? TS_HOTCHECKED : TS_CHECKED) :
  177. bSelected && bPressed || IsKeyboardSelected(bPressed) ? TS_PRESSED :
  178. bSelected ? TS_HOT : TS_NORMAL;
  179. m_themeToolbar.DrawThemeBackground(pDC->GetSafeHdc(), TP_BUTTON, nState, &rc, 0);
  180. }
  181. void CXTPNativeXPTheme::DrawPopupBarRadioMark(CDC* pDC, CRect rc, BOOL bEnabled, COLORREF clr)
  182. {
  183. if (m_themeMenu.IsAppThemed())
  184. {
  185. m_themeMenu.DrawThemeBackground(pDC->GetSafeHdc(), MENU_POPUPCHECK, bEnabled ? 3 : 4, rc, NULL);
  186. }
  187. else
  188. {
  189. CXTPDefaultTheme::DrawPopupBarRadioMark(pDC, rc, bEnabled, clr);
  190. }
  191. }
  192. void CXTPNativeXPTheme::DrawPopupBarCheckMark(CDC* pDC, CRect rc, BOOL bEnabled, COLORREF clr)
  193. {
  194. if (m_themeMenu.IsAppThemed())
  195. {
  196. m_themeMenu.DrawThemeBackground(pDC->GetSafeHdc(), MENU_POPUPCHECK, bEnabled ? 1 : 2, rc, NULL);
  197. }
  198. else
  199. {
  200. CXTPDefaultTheme::DrawPopupBarCheckMark(pDC, rc, bEnabled, clr);
  201. }
  202. }
  203. int CXTPNativeXPTheme::GetPopupBarGripperWidth(CXTPCommandBar* pBar)
  204. {
  205. int nWidth = CXTPDefaultTheme::GetPopupBarGripperWidth(pBar);
  206. if (m_themeMenu.IsAppThemed()) nWidth += 3;
  207. return nWidth;
  208. }
  209. void CXTPNativeXPTheme::FillCommandBarEntry(CDC* pDC, CXTPCommandBar* pBar)
  210. {
  211. if (!IsThemeEnabled())
  212. {
  213. CXTPDefaultTheme::FillCommandBarEntry(pDC, pBar);
  214. return;
  215. }
  216. CRect rc;
  217. pBar->GetClientRect(&rc);
  218. if (pBar->GetPosition() == xtpBarPopup)
  219. {
  220. if (m_themeMenu.IsAppThemed())
  221. {
  222. if (SUCCEEDED(m_themeMenu.DrawThemeBackground(pDC->GetSafeHdc(), MENU_POPUPBORDERS, 0, &rc, NULL)))
  223. {
  224. rc.DeflateRect(3, 3);
  225. m_themeMenu.DrawThemeBackground(pDC->GetSafeHdc(), MENU_POPUPBACKGROUND, 0, &rc, NULL);
  226. return;
  227. }
  228. }
  229. if (m_bFlatMenus)
  230. {
  231. Rectangle(pDC, rc, COLOR_3DSHADOW, COLOR_MENU);
  232. }
  233. else
  234. {
  235. pDC->FillSolidRect(rc, GetXtremeColor(COLOR_MENU));
  236. Draw3dRect(pDC, rc, COLOR_3DFACE, COLOR_3DDKSHADOW);
  237. rc.DeflateRect(1, 1);
  238. Draw3dRect(pDC, rc, COLOR_BTNHILIGHT, COLOR_3DSHADOW);
  239. }
  240. }
  241. else if (pBar->GetPosition() == xtpBarFloating)
  242. {
  243. if (pBar->IsDialogBar())
  244. {
  245. CXTPDefaultTheme::FillCommandBarEntry(pDC, pBar);
  246. return;
  247. }
  248. if (pBar->GetType() == xtpBarTypePopup)
  249. pDC->FillSolidRect(rc, GetXtremeColor(COLOR_MENU));
  250. else
  251. {
  252. pDC->FillSolidRect(rc, GetXtremeColor(pBar->GetType() == xtpBarTypePopup ? COLOR_MENU : COLOR_3DFACE));
  253. m_themeToolbar.DrawThemeBackground(pDC->GetSafeHdc(), 0, 0, &rc, NULL);
  254. }
  255. m_themeWindow.DrawThemeBackground(pDC->GetSafeHdc(), WP_SMALLFRAMELEFT, CS_ACTIVE, CRect(rc.left, rc.top, rc.left + 3, rc.bottom), 0);
  256. m_themeWindow.DrawThemeBackground(pDC->GetSafeHdc(), WP_SMALLFRAMERIGHT, CS_ACTIVE, CRect(rc.right - 3, rc.top, rc.right, rc.bottom), 0);
  257. m_themeWindow.DrawThemeBackground(pDC->GetSafeHdc(), WP_SMALLFRAMEBOTTOM, CS_ACTIVE, CRect(rc.left, rc.bottom - 3, rc.right, rc.bottom), 0);
  258. }
  259. else
  260. {
  261. if (pBar->GetPosition() == xtpBarTop)
  262. FillDockBarRect(pDC, pBar, pBar->GetParent());
  263. else pDC->FillSolidRect(rc, GetXtremeColor(COLOR_3DFACE));
  264. m_themeRebar.DrawThemeBackground(pDC->GetSafeHdc(), RP_BAND, 0, &rc, NULL);
  265. if (!IsFlatToolBar(pBar))
  266. {
  267. pDC->Draw3dRect(rc, m_clrEdgeHighLightColor, m_clrEdgeShadowColor);
  268. }
  269. }
  270. }
  271. void CXTPNativeXPTheme::FillDockBarRect(CDC* pDC, CWnd* pWnd, CWnd* pParent)
  272. {
  273. if (IsThemeEnabled())
  274. {
  275. CRect rc, rcParent, rcClient, rcClipRect;
  276. pWnd->GetClientRect(&rcClient);
  277. rcClipRect = rcClient;
  278. if (pParent)
  279. {
  280. pParent->GetWindowRect(rcClient);
  281. pWnd->ScreenToClient(rcClient);
  282. }
  283. m_themeRebar.DrawThemeBackground(pDC->GetSafeHdc(), 0, 0, &rcClient, &rcClipRect);
  284. }
  285. else
  286. pDC->FillSolidRect(CXTPClientRect(pWnd), GetXtremeColor(COLOR_3DFACE));
  287. }
  288. void CXTPNativeXPTheme::FillDockBar(CDC* pDC, CXTPDockBar* pBar)
  289. {
  290. if (pBar->GetPosition() == xtpBarTop)
  291. FillDockBarRect(pDC, pBar, pBar);
  292. else pDC->FillSolidRect(CXTPClientRect(pBar), GetXtremeColor(COLOR_3DFACE));
  293. }
  294. CSize CXTPNativeXPTheme::DrawDialogBarGripper(CDC* pDC, CXTPDialogBar* pBar, BOOL bDraw)
  295. {
  296. if (!IsThemeEnabled())
  297. {
  298. return CXTPDefaultTheme::DrawDialogBarGripper(pDC, pBar, bDraw);
  299. }
  300. CSize sz(8, max(22, m_nTextHeight + 4));
  301. if (pDC && bDraw)
  302. {
  303. CRect rc(2, 3, 8, sz.cy);
  304. m_themeRebar.DrawThemeBackground(pDC->GetSafeHdc(), RP_GRIPPER , 1, &rc, 0);
  305. }
  306. return sz;
  307. }
  308. BOOL CXTPNativeXPTheme::IsThemeEnabled() const
  309. {
  310. return m_themeRebar.IsAppThemed() && m_themeToolbar.IsAppThemed();
  311. }
  312. CSize CXTPNativeXPTheme::DrawCommandBarSeparator(CDC* pDC, CXTPCommandBar* pBar, CXTPControl* pControl, BOOL bDraw)
  313. {
  314. if (!IsThemeEnabled() || !bDraw)
  315. {
  316. return CXTPDefaultTheme::DrawCommandBarSeparator(pDC, pBar, pControl, bDraw);
  317. }
  318. CRect rc;
  319. pBar->GetClientRect(&rc);
  320. CRect rcControl = pControl->GetRect();
  321. if (pBar->GetType() == xtpBarTypePopup)
  322. {
  323.  if (pBar->GetPosition() == xtpBarPopup && m_themeMenu.IsAppThemed() && !pControl->GetWrap())
  324.  {
  325.  m_themeMenu.DrawThemeBackground(pDC->GetSafeHdc(), MENU_POPUPSEPARATOR, 0, CRect(rcControl.left + GetPopupBarGripperWidth(pControl->GetParent()), rcControl.top - 8, rcControl.right, rcControl.top - 2), NULL);
  326.  return 0;
  327.  }
  328.  else
  329.  {
  330.  return CXTPDefaultTheme::DrawCommandBarSeparator(pDC, pBar, pControl, bDraw);
  331.  }
  332. }
  333. CRect rcRow = pControl->GetRowRect();
  334. if (IsVerticalPosition(pBar->GetPosition()))
  335. {
  336. if (!pControl->GetWrap())
  337. m_themeToolbar.DrawThemeBackground(pDC->GetSafeHdc(), TP_SEPARATORVERT, 0, CRect(rcRow.left, rcControl.top - 6, rcRow.right, rcControl.top), NULL);
  338. else
  339. m_themeToolbar.DrawThemeBackground(pDC->GetSafeHdc(), TP_SEPARATOR, 0, CRect(rcRow.right, rcRow.top + 4, rcRow.right + 5, rcRow.bottom), NULL);
  340. }
  341. else
  342. {
  343. if (!pControl->GetWrap())
  344. m_themeToolbar.DrawThemeBackground(pDC->GetSafeHdc(), TP_SEPARATOR, 0, CRect(rcControl.left - 6, rcRow.top, rcControl.left, rcRow.bottom), NULL);
  345. else
  346. m_themeToolbar.DrawThemeBackground(pDC->GetSafeHdc(), TP_SEPARATORVERT, 0, CRect(rcRow.left + 4, rcRow.top - 5, rcRow.right, rcRow.top), NULL);
  347. }
  348. return 0;
  349. }
  350. void CXTPNativeXPTheme::DrawPopupBarGripper(CDC* pDC, int x, int y, int cx, int cy, BOOL /*bExpanded*/)
  351. {
  352. if (m_themeMenu.IsAppThemed())
  353. {
  354. CRect rc(CPoint(x, y), CSize(cx, cy));
  355. m_themeMenu.DrawThemeBackground(pDC->GetSafeHdc(), MENU_POPUPGUTTER, 0, &rc, NULL);
  356. }
  357. }
  358. CSize CXTPNativeXPTheme::DrawCommandBarGripper(CDC* pDC, CXTPCommandBar* pBar, BOOL bDraw)
  359. {
  360. if (!IsThemeEnabled())
  361. {
  362. return CXTPDefaultTheme::DrawCommandBarGripper(pDC, pBar, bDraw);
  363. }
  364. if (pBar->IsDialogBar())
  365. return DrawDialogBarGripper(pDC, (CXTPDialogBar*)pBar, bDraw);
  366. CRect rc;
  367. pBar->GetClientRect(&rc);
  368. if (pBar->GetType() == xtpBarTypePopup && pBar->GetPosition() == xtpBarPopup && m_themeMenu.IsAppThemed())
  369. {
  370. rc.DeflateRect(3, 3);
  371. rc.right = rc.left + GetPopupBarGripperWidth(pBar);
  372. m_themeMenu.DrawThemeBackground(pDC->GetSafeHdc(), MENU_POPUPGUTTER, 0, &rc, NULL);
  373. }
  374. else if (pBar->GetPosition() == xtpBarFloating)
  375. {
  376. ASSERT(pDC);
  377. if (!pDC)
  378. return CSize(0, 0);
  379. CXTPFontDC font(pDC, GetSmCaptionFont());
  380. CSize sz = pDC->GetTextExtent(_T(" "), 1);
  381. rc.SetRect(0, 0, rc.right, 3 + max(15, sz.cy));
  382. if (pDC && bDraw)
  383. {
  384. m_themeWindow.DrawThemeBackground(pDC->GetSafeHdc(), WP_SMALLCAPTION, CS_ACTIVE, rc, 0);
  385. pDC->SetBkMode(TRANSPARENT);
  386. pDC->SetTextColor(m_clrFloatingGripperText);
  387. pDC->DrawText(pBar->GetTitle(), CRect(5, 3, rc.right + 3 - 2 * rc.Size().cy, rc.bottom), DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX);
  388. }
  389. return CSize(rc.Width(), max(15, sz.cy));
  390. }
  391. else if (pBar->GetPosition() == xtpBarRight || pBar->GetPosition() == xtpBarLeft)
  392. {
  393. if (pDC && bDraw)
  394. {
  395. rc.top += 2;
  396. rc.bottom = rc.top + 6;
  397. m_themeRebar.DrawThemeBackground(pDC->GetSafeHdc(), RP_GRIPPERVERT , 1, &rc, 0);
  398. }
  399. return CSize(0, 8);
  400. }
  401. else if (pBar->GetPosition() == xtpBarTop || pBar->GetPosition() == xtpBarBottom)
  402. {
  403. if (pDC && bDraw)
  404. {
  405. rc.left += 2;
  406. rc.right = rc.left + 6;
  407. m_themeRebar.DrawThemeBackground(pDC->GetSafeHdc(), RP_GRIPPER , 1, &rc, 0);
  408. }
  409. return CSize(8, 0);
  410. }
  411. return 0;
  412. }
  413. void CXTPNativeXPTheme::AdjustExcludeRect(CRect& rc, CXTPControl* pControl, BOOL bVertical)
  414. {
  415. if (!IsThemeEnabled())
  416. {
  417. CXTPDefaultTheme::AdjustExcludeRect(rc, pControl, bVertical);
  418. return;
  419. }
  420. CXTPCommandBar* pParent = pControl->GetParent();
  421. ASSERT(pParent);
  422. if (!pParent)
  423. return;
  424. if (pControl->GetType() == xtpControlComboBox) return;
  425. if (pParent->GetType() != xtpBarTypePopup)
  426. {
  427. if (bVertical)
  428. rc.DeflateRect(0, 0);
  429. else
  430. rc.DeflateRect(0, 0);
  431. }
  432. else
  433. rc.InflateRect(-3, 3);
  434. }
  435. void CXTPNativeXPTheme::DrawSplitButtonFrame(CDC* pDC, CXTPControl* pButton, CRect rcButton)
  436. {
  437. if (!IsThemeEnabled())
  438. {
  439. CXTPDefaultTheme::DrawSplitButtonFrame(pDC, pButton, rcButton);
  440. return;
  441. }
  442. BOOL bPressed = pButton->GetPressed(), bSelected = pButton->GetSelected(), bEnabled = pButton->GetEnabled(), bChecked = pButton->GetChecked(),
  443. bPopuped = pButton->GetPopuped();
  444. UINT nState = !bEnabled ? TS_DISABLED :
  445. bPressed && bSelected ? TS_PRESSED :
  446. bChecked ? TS_CHECKED :
  447. bPopuped || bSelected ? TS_HOT : TS_NORMAL;
  448. CRect rc(rcButton.left, rcButton.top, rcButton.right - 12, rcButton.bottom);
  449. m_themeToolbar.DrawThemeBackground(pDC->GetSafeHdc(), TP_SPLITBUTTON, nState, &rc, 0);
  450. nState = bPopuped ? TS_PRESSED : nState;
  451. if (bEnabled == TRUE_SPLITCOMMAND) nState = TS_DISABLED;
  452. CRect rcArrow(rcButton.right - 12, rcButton.top, rcButton.right, rcButton.bottom);
  453. m_themeToolbar.DrawThemeBackground(pDC->GetSafeHdc(), TP_SPLITBUTTONDROPDOWN, nState, &rcArrow, 0);
  454. }
  455. void CXTPNativeXPTheme::DrawControlEditSpin(CDC* pDC, CXTPControlEdit* pControlEdit)
  456. {
  457. if (!IsThemeEnabled())
  458. {
  459. CXTPDefaultTheme::DrawControlEditSpin(pDC, pControlEdit);
  460. return;
  461. }
  462. BOOL bPressed = pControlEdit->GetPressed();
  463. BOOL bEnabled = pControlEdit->GetEnabled();
  464. BOOL bSelected = pControlEdit->GetSelected();
  465. CRect rcSpin(pControlEdit->GetSpinButtonsRect());
  466. CRect rcTop(rcSpin.left, rcSpin.top, rcSpin.right, rcSpin.CenterPoint().y);
  467. CRect rcBottom(rcSpin.left, rcTop.bottom, rcSpin.right, rcSpin.bottom);
  468. m_themeSpin.DrawBackground(pDC->GetSafeHdc(), SPNP_UP,
  469. !bEnabled ? UPS_DISABLED : bSelected && bPressed == XTP_EDITSPIN_UP ? UPS_PRESSED :
  470. bSelected == XTP_EDITSPIN_UP ? UPS_HOT : UPS_NORMAL, rcTop, 0);
  471. m_themeSpin.DrawBackground(pDC->GetSafeHdc(), SPNP_DOWN,
  472. !bEnabled ? DNS_DISABLED : bSelected && bPressed == XTP_EDITSPIN_DOWN ? DNS_PRESSED :
  473. bSelected == XTP_EDITSPIN_DOWN ? DNS_HOT : DNS_NORMAL, rcBottom, 0);
  474. }
  475. void CXTPNativeXPTheme::DrawControlEditFrame(CDC* pDC, CRect rc, BOOL bEnabled, BOOL bSelected)
  476. {
  477. if (!m_themeCombo.IsAppThemed())
  478. {
  479. CXTPDefaultTheme::DrawControlEditFrame(pDC, rc, bEnabled, bSelected);
  480. return;
  481. }
  482. int nStateID = !bEnabled ? CBXS_DISABLED : CBXS_NORMAL;
  483. COLORREF clrFrame = GetXtremeColor(COLOR_3DSHADOW);
  484. m_themeCombo.GetThemeColor(CP_DROPDOWNBUTTON, nStateID, TMT_BORDERCOLOR, &clrFrame);
  485. Draw3dRect(pDC, rc, clrFrame, clrFrame);
  486. }
  487. void CXTPNativeXPTheme::DrawControlComboBoxButton(CDC* pDC, CRect rcBtn, BOOL bEnabled, BOOL bSelected, BOOL bDropped)
  488. {
  489. if (!m_themeCombo.IsAppThemed())
  490. {
  491. CXTPDefaultTheme::DrawControlComboBoxButton(pDC, rcBtn, bEnabled, bSelected, bDropped);
  492. return;
  493. }
  494. int nStateID = !bEnabled ? CBXS_DISABLED :
  495. bDropped ? CBXS_PRESSED: bSelected ? CBXS_HOT : CBXS_NORMAL;
  496. rcBtn.DeflateRect(-2, 1, 1, 1);
  497. m_themeCombo.DrawThemeBackground(pDC->GetSafeHdc(), CP_DROPDOWNBUTTON, nStateID, &rcBtn, 0);
  498. }
  499. CSize CXTPNativeXPTheme::DrawSpecialControl(CDC* pDC, XTPSpecialControl controlType, CXTPControl* pButton, CXTPCommandBar* pBar, BOOL bDraw, LPVOID lpParam)
  500. {
  501. if ((controlType == xtpButtonExpandFloating || controlType == xtpButtonHideFloating)
  502. && m_themeToolbar.IsAppThemed())
  503. {
  504. return CXTPPaintManager::DrawSpecialControl(pDC, controlType, pButton, pBar, bDraw, lpParam);
  505. }
  506. return CXTPDefaultTheme::DrawSpecialControl(pDC, controlType, pButton, pBar, bDraw, lpParam);
  507. }
  508. COLORREF CXTPNativeXPTheme::GetRectangleTextColor(BOOL bSelected, BOOL bPressed, BOOL bEnabled, BOOL bChecked, BOOL bPopuped, XTPBarType barType, XTPBarPosition barPosition)
  509. {
  510. if (barType == xtpBarTypePopup && barPosition == xtpBarPopup && m_themeMenu.IsAppThemed())
  511. {
  512. return GetXtremeColor(!bEnabled ? COLOR_GRAYTEXT: m_nPopupBarText);
  513. }
  514. return CXTPDefaultTheme::GetRectangleTextColor(bSelected, bPressed, bEnabled, bChecked, bPopuped, barType, barPosition);
  515. }