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

对话框与窗口

开发平台:

Visual C++

  1. // XTButtonTheme.cpp: implementation of the CXTButtonTheme class.
  2. //
  3. // This file is a part of the XTREME CONTROLS 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/XTPDrawHelpers.h"
  22. #include "Common/XTPImageManager.h"
  23. #include "Common/XTPWinThemeWrapper.h"
  24. #include "XTThemeManager.h"
  25. #include "XTButtonTheme.h"
  26. #include "XTButton.h"
  27. #include "XTHelpers.h"
  28. #include "XTFunctions.h"
  29. #ifdef _DEBUG
  30. #undef THIS_FILE
  31. static char THIS_FILE[] = __FILE__;
  32. #define new DEBUG_NEW
  33. #endif
  34. #ifndef ODS_NOFOCUSRECT
  35. #define ODS_NOFOCUSRECT 0x0200
  36. #endif
  37. IMPLEMENT_THEME_FACTORY(CXTButtonTheme)
  38. //===========================================================================
  39. // CXTButtonTheme class
  40. //===========================================================================
  41. CXTButtonTheme::CXTButtonTheme()
  42. : m_bShowIcon(TRUE)
  43. , m_bOffsetHiliteText(TRUE)
  44. , m_pFont(NULL)
  45. {
  46. }
  47. CXTButtonTheme::~CXTButtonTheme()
  48. {
  49. }
  50. void CXTButtonTheme::RefreshMetrics()
  51. {
  52. CXTThemeManagerStyle::RefreshMetrics();
  53. RefreshXtremeColors();
  54. m_themeWrapper.OpenThemeData(0, L"BUTTON");
  55. // background colors.
  56. m_crBack.SetStandardValue(GetXtremeColor(COLOR_BTNFACE));
  57. // text colors.
  58. m_crText.SetStandardValue(GetXtremeColor(COLOR_BTNTEXT));
  59. m_crTextDisabled.SetStandardValue(GetXtremeColor(COLOR_GRAYTEXT));
  60. // border colors.
  61. m_crBorderHilite.SetStandardValue(GetXtremeColor(COLOR_BTNFACE));
  62. m_crBorderShadow.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW));
  63. m_crBorder3DHilite.SetStandardValue(GetXtremeColor(COLOR_3DHILIGHT));
  64. m_crBorder3DShadow.SetStandardValue(GetXtremeColor(COLOR_3DDKSHADOW));
  65. }
  66. CFont* CXTButtonTheme::GetThemeFont(CXTButton* pButton) const
  67. {
  68. if (m_pFont && m_pFont->GetSafeHandle())
  69. return m_pFont;
  70. if (pButton)
  71. return pButton->GetFont();
  72. return NULL;
  73. }
  74. void CXTButtonTheme::SetThemeFont(CFont* pFont)
  75. {
  76. if (pFont && pFont->GetSafeHandle())
  77. m_pFont = pFont;
  78. }
  79. void CXTButtonTheme::SetAlternateColors(COLORREF clr3DFace, COLORREF clr3DHilight, COLORREF clr3DShadow, COLORREF clrBtnText)
  80. {
  81. SetColorFace(clr3DFace);
  82. SetColorText(clrBtnText);
  83. SetColorHilite(clr3DHilight);
  84. SetColorShadow(clr3DShadow);
  85. }
  86. void CXTButtonTheme::SetColorFace(COLORREF clrFace)
  87. {
  88. m_crBack.SetCustomValue(clrFace);
  89. }
  90. COLORREF CXTButtonTheme::GetColorFace()
  91. {
  92. return m_crBack;
  93. }
  94. void CXTButtonTheme::SetColorHilite(COLORREF clrHilite)
  95. {
  96. m_crBorderHilite.SetCustomValue(clrHilite);
  97. }
  98. void CXTButtonTheme::SetColorShadow(COLORREF clrShadow)
  99. {
  100. m_crBorderShadow.SetCustomValue(clrShadow);
  101. }
  102. void CXTButtonTheme::SetColorText(COLORREF clrText)
  103. {
  104. m_crText.SetCustomValue(clrText);
  105. }
  106. void CXTButtonTheme::OffsetPoint(CPoint& point, CSize size, CXTButton* pButton)
  107. {
  108. CXTPClientRect rcClient(pButton);
  109. if (pButton->GetXButtonStyle() & BS_XT_TWOROWS)
  110. {
  111. point.x = __max(0, ((rcClient.Width()-size.cx)/2));
  112. point.y = __max(0, ((rcClient.Height()-size.cy)/2));
  113. }
  114. else
  115. {
  116. point.x = pButton->GetBorderGap();
  117. point.y = __max(0, ((rcClient.Height()-size.cy)/2));
  118. }
  119. }
  120. CPoint CXTButtonTheme::GetTextPosition(UINT /*nState*/, CRect& rcItem, CSize& sizeText, CXTButton* pButton)
  121. {
  122. CRect rcText = rcItem;
  123. rcText.DeflateRect(2, 0);
  124. CPoint point = rcText.TopLeft();
  125. if (pButton->GetUserPosition())
  126. {
  127. point = pButton->GetTextPoint();
  128. }
  129. else
  130. {
  131. OffsetPoint(point, sizeText, pButton);
  132. point.x = pButton->GetBorderGap();
  133. if (pButton->GetXButtonStyle() & BS_XT_TWOROWS)
  134. {
  135. point.y += (pButton->GetImageSize().cy/2)+(pButton->GetImageGap()/2);
  136. }
  137. switch (pButton->GetStyle() & (BS_CENTER | BS_LEFT | BS_RIGHT))
  138. {
  139. case BS_LEFT:
  140. if (!(pButton->GetXButtonStyle() & BS_XT_TWOROWS))
  141. {
  142. point.x += pButton->GetImageSize().cx + pButton->GetImageGap();
  143. }
  144. break;
  145. case BS_RIGHT:
  146. point.x = rcItem.right - pButton->GetBorderGap() - sizeText.cx;
  147. break;
  148. default:
  149. if (!(pButton->GetXButtonStyle() & BS_XT_TWOROWS))
  150. {
  151. point.x += pButton->GetImageSize().cx;
  152. }
  153. point.x += (rcItem.right - point.x - sizeText.cx - pButton->GetBorderGap()) / 2;
  154. break;
  155. }
  156. }
  157. return point;
  158. }
  159. COLORREF CXTButtonTheme::GetTextColor(UINT nState, CXTButton* pButton)
  160. {
  161. if (UseWinXPThemes(pButton))
  162. {
  163. int iStateId = PBS_NORMAL;
  164. if (pButton->GetButtonStyle() == BS_DEFPUSHBUTTON)
  165. iStateId = PBS_DEFAULTED;
  166. if (pButton->GetHilite())
  167. iStateId = PBS_HOT;
  168. if ((nState & ODS_SELECTED) || pButton->GetChecked())
  169. iStateId = PBS_PRESSED;
  170. if (nState & ODS_DISABLED)
  171. iStateId = PBS_DISABLED;
  172. COLORREF clr = m_crText;
  173. if (SUCCEEDED(m_themeWrapper.GetThemeColor(BP_PUSHBUTTON, iStateId, TMT_TEXTCOLOR, &clr)))
  174. {
  175. return clr;
  176. }
  177. }
  178. if (nState & ODS_DISABLED)
  179. {
  180. return m_crTextDisabled;
  181. }
  182. return m_crText;
  183. }
  184. void CXTButtonTheme::DrawButtonText(CDC* pDC, UINT nState, CRect& rcItem, CXTButton* pButton)
  185. {
  186. CString strText;
  187. pButton->GetWindowText(strText);
  188. // if the string is empty just return.
  189. if (strText.IsEmpty())
  190. return;
  191. // Remove ampersand
  192. XTPDrawHelpers()->StripMnemonics(strText);
  193. // select font into device context.
  194. CXTPFontDC fontDC(pDC, GetThemeFont(pButton));
  195. // get the text size.
  196. CSize sizeText = pDC->GetTextExtent(strText);
  197. CPoint pt = GetTextPosition(nState, rcItem, sizeText, pButton);
  198. BOOL  bSelected = pButton->GetChecked() || (nState & ODS_SELECTED);
  199. if (bSelected && m_bOffsetHiliteText)
  200. pt.Offset(1, 1);
  201. // Set the draw state flags.
  202. DWORD dwFlags = DST_PREFIXTEXT;
  203. pDC->SetTextColor(GetTextColor(nState, pButton));
  204. // draw the text, and select the original font.
  205. if ((nState & 0x0100/*ODS_NOACCEL*/) == 0)
  206. pButton->GetWindowText(strText);
  207. pDC->SetTextAlign(TA_LEFT);
  208. pDC->DrawState(pt, sizeText, strText, dwFlags, TRUE, strText.GetLength(), (HBRUSH)NULL);
  209. }
  210. CPoint CXTButtonTheme::CalculateImagePosition(CDC* pDC, UINT /*nState*/,
  211. CRect& rcItem, bool /*bHasPushedImage*/, CXTButton* pButton)
  212. {
  213. // Get the window text.
  214. CString strText;
  215. pButton->GetWindowText(strText);
  216. // Remove ampersand
  217. XTPDrawHelpers()->StripMnemonics(strText);
  218. CSize   sizeText = pDC->GetTextExtent(strText);
  219. CPoint  point = rcItem.TopLeft();
  220. DWORD dwStyle = pButton->GetStyle();
  221. if (pButton->GetUserPosition())
  222. {
  223. point = pButton->GetImagePoint();
  224. }
  225. else
  226. {
  227. OffsetPoint(point, pButton->GetImageSize(), pButton);
  228. point.x = pButton->GetBorderGap();
  229. if (pButton->GetXButtonStyle() & BS_XT_TWOROWS)
  230. {
  231. if (!strText.IsEmpty())
  232. {
  233. point.y -= ((sizeText.cy/2)+(pButton->GetImageGap()/2));
  234. }
  235. // horz. alignment - only for two-row mode, otherwise always
  236. // on left edge
  237. switch (pButton->GetStyle() & (BS_CENTER | BS_LEFT | BS_RIGHT))
  238. {
  239. case BS_LEFT:
  240. break;
  241. case BS_RIGHT:
  242. point.x = rcItem.right - pButton->GetBorderGap() - pButton->GetImageSize().cx;
  243. break;
  244. default:
  245. point.x = rcItem.left + __max(0, ((rcItem.Width()-pButton->GetImageSize().cx)/2));
  246. break;
  247. }
  248. }
  249. else
  250. {
  251. if (strText.IsEmpty())
  252. {
  253. if ((dwStyle & BS_CENTER) == BS_CENTER)
  254. {
  255. int cx = rcItem.Width();
  256. if (cx >= pButton->GetImageSize().cx)
  257. {
  258. point.x = (cx - pButton->GetImageSize().cx)/2;
  259. }
  260. }
  261. if ((dwStyle & BS_VCENTER) == BS_VCENTER)
  262. {
  263. int cy = rcItem.Height();
  264. if (cy >= pButton->GetImageSize().cy)
  265. {
  266. point.y = (cy - pButton->GetImageSize().cy)/2;
  267. }
  268. }
  269. }
  270. }
  271. }
  272. return point;
  273. }
  274. void CXTButtonTheme::DrawButtonIcon(CDC* pDC, UINT nState, CRect& rcItem, CXTButton* pButton)
  275. {
  276. if (pButton == NULL || m_bShowIcon == FALSE)
  277. return;
  278. CXTPImageManagerIcon* pIcon = pButton->GetIcon();
  279. if (pIcon == NULL)
  280. return;
  281. CPoint pt = CalculateImagePosition(
  282. pDC, nState, rcItem, (pButton->GetSelectedIcon() != NULL), pButton);
  283. BOOL  bSelected = pButton->GetChecked() || (nState & ODS_SELECTED);
  284. if (bSelected)
  285. pt.Offset(1, 1);
  286. if (nState & ODS_DISABLED)
  287. {
  288. pIcon->Draw(pDC, pt, pIcon->GetDisabledIcon(), pButton->GetImageSize());
  289. }
  290. else if (pButton->GetHilite() || bSelected)
  291. {
  292. pIcon->Draw(pDC, pt, pButton->GetChecked() ? pIcon->GetCheckedIcon() :
  293. (nState & ODS_SELECTED) ? pIcon->GetPressedIcon() : pIcon->GetHotIcon(), pButton->GetImageSize());
  294. }
  295. else
  296. {
  297. pIcon->Draw(pDC, pt, pIcon->GetIcon(), pButton->GetImageSize());
  298. }
  299. }
  300. BOOL CXTButtonTheme::UseWinXPThemes(CXTButton* pButton)
  301. {
  302. // if the button should not use Windows XP themes return FALSE.
  303. if (!pButton || (pButton->GetXButtonStyle() & BS_XT_WINXP_COMPAT) == 0)
  304. return FALSE;
  305. // if we got this far then we try to load the theme data for
  306. // this control if it is not currently open.
  307. if (!m_themeWrapper.ThemeDataOpen())
  308. m_themeWrapper.OpenThemeData(0, L"BUTTON");
  309. // if our application is not "Theme Ready" meaning that we cannot
  310. // display Windows XP themes, then return FALSE.
  311. if (!m_themeWrapper.IsAppThemeReady())
  312. return FALSE;
  313. // this will return TRUE if we can display visual styles.
  314. return m_themeWrapper.ThemeDataOpen();
  315. }
  316. BOOL CXTButtonTheme::CanHilite(CXTButton* pButton)
  317. {
  318. if (UseWinXPThemes(pButton))
  319. return TRUE;
  320. return ((pButton->GetXButtonStyle() & BS_XT_FLAT_ANY) != 0);
  321. }
  322. BOOL CXTButtonTheme::DrawWinThemeBackground(LPDRAWITEMSTRUCT lpDIS, CXTButton* pButton)
  323. {
  324. if (UseWinXPThemes(pButton))
  325. {
  326. CDC*  pDC = CDC::FromHandle(lpDIS->hDC);
  327. CRect rcItem = lpDIS->rcItem;
  328. int   nState = lpDIS->itemState;
  329. bool  bSelected = ((nState & ODS_SELECTED) != 0);
  330. bool  bDisabled = ((nState & ODS_DISABLED) != 0);
  331. int iStateId = PBS_NORMAL;
  332. if (pButton->GetButtonStyle() == BS_DEFPUSHBUTTON)
  333. iStateId = PBS_DEFAULTED;
  334. if (pButton->GetHilite())
  335. iStateId = PBS_HOT;
  336. if (bSelected || pButton->GetChecked())
  337. iStateId = PBS_PRESSED;
  338. if (bDisabled)
  339. iStateId = PBS_DISABLED;
  340. HBRUSH hBrush = (HBRUSH)pButton->GetParent()->SendMessage(WM_CTLCOLORBTN, (WPARAM)pDC->GetSafeHdc(), (LPARAM)pButton->GetSafeHwnd());
  341. if (hBrush)
  342. {
  343. ::FillRect(pDC->GetSafeHdc(), rcItem, hBrush);
  344. }
  345. else
  346. {
  347. pDC->FillSolidRect(rcItem, GetXtremeColor(COLOR_3DFACE));
  348. }
  349. if (m_themeWrapper.DrawThemeBackground(pDC->GetSafeHdc(),
  350. BP_PUSHBUTTON, iStateId, &rcItem, NULL) != S_OK)
  351. {
  352. TRACE0("Error drawing background using WinTheme API.n");
  353. return FALSE;
  354. }
  355. return TRUE;
  356. }
  357. return FALSE;
  358. }
  359. BOOL CXTButtonTheme::DrawButtonThemeBackground(LPDRAWITEMSTRUCT lpDIS, CXTButton* pButton)
  360. {
  361. // define some temporary variables.
  362. CDC*  pDC = CDC::FromHandle(lpDIS->hDC);
  363. CRect rcItem = lpDIS->rcItem;
  364. int   nState = lpDIS->itemState;
  365. BOOL  bSelected = pButton->GetChecked() || (nState & ODS_SELECTED);
  366. // get the cursor position.
  367. CXTPClientCursorPos pt(pButton);
  368. // Paint the background.
  369. pDC->FillSolidRect(rcItem, m_crBack);
  370. DWORD dwxStyle = pButton->GetXButtonStyle();
  371. if (dwxStyle & BS_XT_HILITEPRESSED)
  372. {
  373. if ((pButton->GetChecked() && !rcItem.PtInRect(pt)) || bSelected)
  374. {
  375. XTFuncDrawShadedRect(pDC, rcItem);
  376. }
  377. }
  378. if (dwxStyle & BS_XT_FLAT)
  379. {
  380. if (pButton->GetHilite() || bSelected)
  381. {
  382. pDC->Draw3dRect(rcItem,
  383. bSelected ? m_crBorderShadow : m_crBorder3DHilite,
  384. bSelected ? m_crBorder3DHilite : m_crBorderShadow);
  385. }
  386. }
  387. else if (dwxStyle & BS_XT_SEMIFLAT)
  388. {
  389. pDC->Draw3dRect(rcItem,
  390. bSelected ? m_crBorderShadow : m_crBorder3DHilite,
  391. bSelected ? m_crBorder3DHilite : m_crBorderShadow);
  392. }
  393. else // classic button
  394. {
  395. if (pButton->GetButtonStyle() == BS_DEFPUSHBUTTON)
  396. {
  397. pDC->Draw3dRect(rcItem, m_crBorder3DShadow, m_crBorder3DShadow);
  398. rcItem.DeflateRect(1,1);
  399. }
  400. pDC->Draw3dRect(rcItem,
  401. bSelected ? m_crBorder3DShadow : m_crBorder3DHilite,
  402. bSelected ? m_crBorder3DHilite : m_crBorder3DShadow);
  403. rcItem.DeflateRect(1, 1);
  404. pDC->Draw3dRect(rcItem,
  405. bSelected ? m_crBorderShadow : m_crBorderHilite,
  406. bSelected ? m_crBorderHilite : m_crBorderShadow);
  407. }
  408. return TRUE;
  409. }
  410. void CXTButtonTheme::DrawFocusRect(CDC* pDC, UINT /*nState*/, CRect& rcItem, CXTButton* pButton)
  411. {
  412. CXTContextTextColorHandler foreHandler(pDC,
  413. m_crText);
  414. if (pButton->GetXButtonStyle() & (BS_XT_FLAT|BS_XT_SEMIFLAT))
  415. rcItem.DeflateRect(2, 2);
  416. else
  417. rcItem.DeflateRect(4, 4);
  418. pDC->DrawFocusRect(rcItem);
  419. }
  420. void CXTButtonTheme::DrawItem(LPDRAWITEMSTRUCT lpDIS, CXTButton* pButton)
  421. {
  422. ASSERT(lpDIS != NULL);
  423. if (!lpDIS)
  424. return;
  425. // Draw the button background.
  426. if (!DrawWinThemeBackground(lpDIS, pButton))
  427. DrawButtonThemeBackground(lpDIS, pButton);
  428. // define some temporary variables.
  429. CDC*  pDC = CDC::FromHandle(lpDIS->hDC);
  430. CRect rcItem = lpDIS->rcItem;
  431. int   nState = lpDIS->itemState;
  432. // Set the background mode to transparent.
  433. CXTContextBkModeHandler modeHandler(pDC, TRANSPARENT);
  434. // draw the button text, icon or bitmap.
  435. DrawButtonText(pDC, nState, rcItem, pButton);
  436. DrawButtonIcon(pDC, nState, rcItem, pButton);
  437. // Draw the focus rect if style is set and we have focus.
  438. if ((pButton->GetXButtonStyle() & BS_XT_SHOWFOCUS))
  439. {
  440. if ((lpDIS->itemState & ODS_FOCUS) && ((lpDIS->itemState & ODS_NOFOCUSRECT) == 0))
  441. {
  442. DrawFocusRect(pDC, nState, rcItem, pButton);
  443. }
  444. }
  445. }
  446. //===========================================================================
  447. // CXTButtonThemeOfficeXP class
  448. //===========================================================================
  449. CXTButtonThemeOfficeXP::CXTButtonThemeOfficeXP(BOOL bWordTheme/*= FALSE*/)
  450. {
  451. m_bWordTheme = bWordTheme;
  452. m_bOffsetHiliteText = FALSE;
  453. m_bFadedIcon = TRUE;
  454. m_bAnimateIcon = TRUE;
  455. }
  456. CXTButtonThemeOfficeXP::~CXTButtonThemeOfficeXP()
  457. {
  458. }
  459. void CXTButtonThemeOfficeXP::RefreshMetrics()
  460. {
  461. CXTButtonTheme::RefreshMetrics();
  462. m_crBack.SetStandardValue(GetXtremeColor(m_bWordTheme ? XPCOLOR_TOOLBAR_FACE : COLOR_BTNFACE));
  463. m_crBackPushed.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_PUSHED));
  464. m_crBackHilite.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT));
  465. m_crBorderShadow.SetStandardValue(GetXtremeColor(COLOR_3DSHADOW));
  466. m_crBorderHilite.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_BORDER));
  467. m_crText.SetStandardValue(GetXtremeColor(XPCOLOR_TOOLBAR_TEXT));
  468. m_crTextHilite.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_TEXT));
  469. m_crTextPushed.SetStandardValue(GetXtremeColor(XPCOLOR_PUSHED_TEXT));
  470. m_crBackChecked.SetStandardValue(GetXtremeColor(XPCOLOR_HIGHLIGHT_CHECKED));
  471. }
  472. COLORREF CXTButtonThemeOfficeXP::GetTextColor(UINT nState, CXTButton* pButton)
  473. {
  474. if (UseWinXPThemes(pButton))
  475. {
  476. return CXTButtonTheme::GetTextColor(nState, pButton);
  477. }
  478. if (nState & ODS_DISABLED)
  479. return GetXtremeColor(COLOR_GRAYTEXT);
  480. if (nState & ODS_SELECTED)
  481. return m_crTextPushed;
  482. if (pButton->GetHilite())
  483. return m_crTextHilite;
  484. return m_crText;
  485. }
  486. void CXTButtonThemeOfficeXP::DrawButtonIcon(CDC* pDC, UINT nState, CRect& rcItem, CXTButton* pButton)
  487. {
  488. if (pButton == NULL || m_bShowIcon == FALSE)
  489. return;
  490. CXTPImageManagerIcon* pIcon = pButton->GetIcon();
  491. if (pIcon == NULL)
  492. return;
  493. CPoint pt = CalculateImagePosition(
  494. pDC, nState, rcItem, FALSE, pButton);
  495. if (nState & ODS_DISABLED)
  496. {
  497. pIcon->Draw(pDC, pt, pIcon->GetDisabledIcon(), pButton->GetImageSize());
  498. }
  499. else if (nState & ODS_SELECTED)
  500. {
  501. pIcon->Draw(pDC, pt, pIcon->GetPressedIcon(), pButton->GetImageSize());
  502. }
  503. else if (pButton->GetHilite())
  504. {
  505. if (m_bAnimateIcon)
  506. {
  507. pIcon->Draw(pDC, CPoint(pt.x + 1, pt.y + 1), pIcon->GetShadowIcon(), pButton->GetImageSize());
  508. pIcon->Draw(pDC, CPoint(pt.x - 1, pt.y - 1), pIcon->GetHotIcon(), pButton->GetImageSize());
  509. }
  510. else
  511. {
  512. pIcon->Draw(pDC, pt, pIcon->GetHotIcon(), pButton->GetImageSize());
  513. }
  514. }
  515. else
  516. {
  517. pIcon->Draw(pDC, pt, m_bFadedIcon ? pIcon->GetFadedIcon() : pIcon->GetIcon(), pButton->GetImageSize());
  518. }
  519. }
  520. BOOL CXTButtonThemeOfficeXP::DrawButtonThemeBackground(LPDRAWITEMSTRUCT lpDIS, CXTButton* pButton)
  521. {
  522. // define some temporary variables.
  523. CDC*  pDC = CDC::FromHandle(lpDIS->hDC);
  524. CRect rcItem = lpDIS->rcItem;
  525. int   nState = lpDIS->itemState;
  526. BOOL bPressed = (nState & ODS_SELECTED);
  527. // Paint the background.
  528. if (pButton->GetHilite() || bPressed || pButton->GetChecked())
  529. {
  530. pDC->FillSolidRect(rcItem, bPressed ? m_crBackPushed :
  531. pButton->GetChecked() ? (pButton->GetHilite() ? m_crBackPushed : m_crBackChecked) : m_crBackHilite);
  532. pDC->Draw3dRect(rcItem, m_crBorderHilite,
  533. m_crBorderHilite);
  534. }
  535. else
  536. {
  537. pDC->FillSolidRect(rcItem, m_crBack);
  538. if (m_bWordTheme)
  539. {
  540. pDC->Draw3dRect(rcItem,
  541. m_crBorderShadow, m_crBorderShadow);
  542. }
  543. }
  544. if (m_bWordTheme && pButton->GetButtonStyle() == BS_DEFPUSHBUTTON)
  545. {
  546. pDC->Draw3dRect(rcItem, GetXtremeColor(COLOR_HIGHLIGHT),
  547. GetXtremeColor(COLOR_HIGHLIGHT));
  548. rcItem.DeflateRect(1, 1);
  549. pDC->Draw3dRect(rcItem, GetXtremeColor(COLOR_HIGHLIGHT),
  550. GetXtremeColor(COLOR_HIGHLIGHT));
  551. }
  552. return TRUE;
  553. }
  554. BOOL CXTButtonThemeOfficeXP::CanHilite(CXTButton* /*pButton*/)
  555. {
  556. return TRUE;
  557. }
  558. void CXTButtonThemeOfficeXP::DrawFocusRect(CDC* pDC, UINT nState, CRect& rcItem, CXTButton* pButton)
  559. {
  560. CXTButtonTheme::DrawFocusRect(pDC, nState, rcItem, pButton);
  561. }
  562. void CXTButtonThemeOfficeXP::SetBackPushedColor(COLORREF color)
  563. {
  564. m_crBackPushed.SetCustomValue(color);
  565. }
  566. void CXTButtonThemeOfficeXP::SetBackHiliteColor(COLORREF color)
  567. {
  568. m_crBackHilite.SetCustomValue(color);
  569. }
  570. void CXTButtonThemeOfficeXP::SetTextPushedColor(COLORREF color)
  571. {
  572. m_crTextPushed.SetCustomValue(color);
  573. }
  574. void CXTButtonThemeOfficeXP::SetTextHiliteColor(COLORREF color)
  575. {
  576. m_crTextHilite.SetCustomValue(color);
  577. }
  578. //===========================================================================
  579. // CXTButtonThemeOffice2003 class
  580. //===========================================================================
  581. CXTButtonThemeOffice2003::CXTButtonThemeOffice2003(BOOL bWordTheme/*= FALSE*/)
  582. {
  583. m_bWordTheme = bWordTheme;
  584. m_bOffsetHiliteText = FALSE;
  585. m_bFadedIcon = FALSE;
  586. m_bAnimateIcon = FALSE;
  587. }
  588. void CXTButtonThemeOffice2003::DrawButtonIcon(CDC* pDC, UINT nState, CRect& rcItem, CXTButton* pButton)
  589. {
  590. if (pButton == NULL || m_bShowIcon == FALSE)
  591. return;
  592. CXTPImageManagerIcon* pIcon = pButton->GetIcon();
  593. if (pIcon == NULL)
  594. return;
  595. CPoint pt = CalculateImagePosition(
  596. pDC, nState, rcItem, FALSE, pButton);
  597. if (nState & ODS_DISABLED)
  598. {
  599. pIcon->Draw(pDC, pt, pIcon->GetDisabledIcon(), pButton->GetImageSize());
  600. }
  601. else if (nState & ODS_SELECTED)
  602. {
  603. pIcon->Draw(pDC, pt, pIcon->GetPressedIcon(), pButton->GetImageSize());
  604. }
  605. else
  606. {
  607. pIcon->Draw(pDC, pt, pIcon->GetIcon(), pButton->GetImageSize());
  608. }
  609. }
  610. void CXTButtonThemeOffice2003::RefreshMetrics()
  611. {
  612. CXTButtonThemeOfficeXP::RefreshMetrics();
  613. XTPCurrentSystemTheme systemTheme = XTPColorManager()->GetCurrentSystemTheme();
  614. m_crBack.SetStandardValue(GetXtremeColor(COLOR_3DFACE));
  615. if (systemTheme != xtpSystemThemeUnknown)
  616. {
  617. m_crBackHilite.SetStandardValue(RGB(255, 238, 194));
  618. m_crBackPushed.SetStandardValue(RGB(254, 128, 62));
  619. m_crBackChecked.SetStandardValue(RGB(255, 192, 111));
  620. m_crText.SetStandardValue(0);
  621. }
  622. m_crTextHilite.SetStandardValue(0);
  623. m_crTextPushed.SetStandardValue(0);
  624. switch (systemTheme)
  625. {
  626. case xtpSystemThemeBlue:
  627. case xtpSystemThemeRoyale:
  628. case xtpSystemThemeAero:
  629. m_crBack.SetStandardValue(RGB(169, 199, 240));
  630. m_crBorderShadow.SetStandardValue(RGB(127, 157, 185));
  631. m_crBorderHilite.SetStandardValue(RGB(0, 0, 128));
  632. break;
  633. case xtpSystemThemeOlive:
  634. m_crBack.SetStandardValue(RGB(197, 212, 159));
  635. m_crBorderShadow.SetStandardValue(RGB(164, 185, 127));
  636. m_crBorderHilite.SetStandardValue(RGB(63, 93, 56));
  637. break;
  638. case xtpSystemThemeSilver:
  639. m_crBack.SetStandardValue(RGB(192, 192, 211));
  640. m_crBorderShadow.SetStandardValue(RGB(165, 172, 178));
  641. m_crBorderHilite.SetStandardValue(RGB(75, 75, 11));
  642. break;
  643. }
  644. if (!m_bWordTheme) m_crBack.SetStandardValue(GetXtremeColor(COLOR_BTNFACE));
  645. }
  646. BOOL CXTButtonThemeOffice2003::DrawButtonThemeBackground(LPDRAWITEMSTRUCT lpDIS, CXTButton* pButton)
  647. {
  648. // define some temporary variables.
  649. CDC*  pDC = CDC::FromHandle(lpDIS->hDC);
  650. CRect rcItem = lpDIS->rcItem;
  651. int   nState = lpDIS->itemState;
  652. BOOL bChecked = pButton->GetChecked();
  653. BOOL bHilight = pButton->GetHilite();
  654. BOOL bPressed = (nState & ODS_SELECTED);
  655. // Paint the background.
  656. if (bChecked || bHilight || bPressed)
  657. {
  658. if (bPressed)
  659. {
  660. XTPDrawHelpers()->GradientFill(pDC, &rcItem,
  661. XTPColorManager()->grcLunaPushed, FALSE);
  662. }
  663. else if (bHilight)
  664. {
  665. XTPDrawHelpers()->GradientFill(pDC, &rcItem,
  666. XTPColorManager()->grcLunaSelected, FALSE);
  667. }
  668. else if (bChecked)
  669. {
  670. XTPDrawHelpers()->GradientFill(pDC, &rcItem,
  671. XTPColorManager()->grcLunaChecked, FALSE);
  672. }
  673. pDC->Draw3dRect(rcItem, m_crBorderHilite,
  674. m_crBorderHilite);
  675. }
  676. else
  677. {
  678. pDC->FillSolidRect(rcItem, m_crBack);
  679. if (m_bWordTheme)
  680. {
  681. pDC->Draw3dRect(rcItem,
  682. m_crBorderShadow, m_crBorderShadow);
  683. }
  684. }
  685. if (m_bWordTheme && pButton->GetButtonStyle() == BS_DEFPUSHBUTTON)
  686. {
  687. pDC->Draw3dRect(rcItem, GetXtremeColor(COLOR_HIGHLIGHT),
  688. GetXtremeColor(COLOR_HIGHLIGHT));
  689. rcItem.DeflateRect(1, 1);
  690. pDC->Draw3dRect(rcItem, GetXtremeColor(COLOR_HIGHLIGHT),
  691. GetXtremeColor(COLOR_HIGHLIGHT));
  692. }
  693. return TRUE;
  694. }
  695. //===========================================================================
  696. // CXTDisabledButtonTheme class
  697. //===========================================================================
  698. void CXTDisabledButtonTheme::DrawButtonIcon(CDC* pDC, UINT nState, CRect& rcItem, CXTButton* pButton)
  699. {
  700. if (pButton == NULL || m_bShowIcon == FALSE)
  701. return;
  702. CXTPImageManagerIcon* pIconManager = pButton->GetIcon();
  703. if (pIconManager == NULL)
  704. return;
  705. CPoint pt = CalculateImagePosition(
  706. pDC, nState, rcItem, (pButton->GetSelectedIcon() != NULL), pButton);
  707. BOOL  bSelected = pButton->GetChecked() || (nState & ODS_SELECTED);
  708. if (bSelected)
  709. pt.Offset(1, 1);
  710. if (nState & ODS_DISABLED)
  711. {
  712. pDC->DrawState(pt, pIconManager->GetExtent(),
  713. pIconManager->GetIcon(), DSS_NORMAL | DSS_DISABLED, (HBRUSH)0);
  714. }
  715. else if (pButton->GetHilite() || bSelected)
  716. {
  717. pDC->DrawState(pt, pIconManager->GetExtent(),
  718. (nState & ODS_SELECTED) ? pIconManager->GetPressedIcon() : pIconManager->GetHotIcon(), DSS_NORMAL, (HBRUSH)0);
  719. }
  720. else
  721. {
  722. pDC->DrawState(pt, 0,
  723. pIconManager->GetIcon(), DSS_NORMAL, (HBRUSH)0);
  724. }
  725. }
  726. //===========================================================================
  727. // CXTToolbarButtonTheme class
  728. //===========================================================================
  729. BOOL CXTToolbarButtonTheme::DrawWinThemeBackground(LPDRAWITEMSTRUCT lpDIS, CXTButton* pButton)
  730. {
  731. lpDIS->itemState &= ~ODS_FOCUS;
  732. return CXTButtonTheme::DrawWinThemeBackground(lpDIS, pButton);
  733. }
  734. void CXTToolbarButtonTheme::RefreshMetrics()
  735. {
  736. CXTDisabledButtonTheme::RefreshMetrics();
  737. m_themeWrapper.OpenThemeData(0, L"TOOLBAR");
  738. }
  739. BOOL CXTToolbarButtonTheme::UseWinXPThemes(CXTButton* pButton)
  740. {
  741. // if the button should not use Windows XP themes return FALSE.
  742. if (!pButton || (pButton->GetXButtonStyle() & BS_XT_WINXP_COMPAT) == 0)
  743. return FALSE;
  744. // if we got this far then we try to load the theme data for
  745. // this control if it is not currently open.
  746. if (!m_themeWrapper.ThemeDataOpen())
  747. m_themeWrapper.OpenThemeData(pButton->m_hWnd, L"TOOLBAR");
  748. // if our application is not "Theme Ready" meaning that we cannot
  749. // display Windows XP themes, then return FALSE.
  750. if (!m_themeWrapper.IsAppThemeReady())
  751. return FALSE;
  752. // this will return TRUE if we can display visual styles.
  753. return m_themeWrapper.ThemeDataOpen();
  754. }