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

对话框与窗口

开发平台:

Visual C++

  1. // XTPMarkupButton.cpp: implementation of the CXTPMarkupButton class.
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO 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/XTPWinThemeWrapper.h"
  22. #include "Common/XTPDrawHelpers.h"
  23. #include "XTPMarkupButton.h"
  24. #include "XTPMarkupDrawingContext.h"
  25. #ifdef _DEBUG
  26. #undef THIS_FILE
  27. static char THIS_FILE[]=__FILE__;
  28. #define new DEBUG_NEW
  29. #endif
  30. //////////////////////////////////////////////////////////////////////////
  31. // CXTPMarkupButtonBase
  32. CXTPMarkupRoutedEvent* CXTPMarkupButtonBase::m_pClickEvent = NULL;
  33. CXTPMarkupDependencyProperty* CXTPMarkupButtonBase::m_pIsPressedProperty = NULL;
  34. IMPLEMENT_MARKUPCLASS(NULL, CXTPMarkupButtonBase, CXTPMarkupContentControl)
  35. void CXTPMarkupButtonBase::RegisterMarkupClass()
  36. {
  37. m_pClickEvent = CXTPMarkupRoutedEvent::RegisterRoutedEvent(L"Click", CXTPMarkupRoutedEvent::routingBubble, MARKUP_TYPE(CXTPMarkupButtonBase));
  38. m_pIsPressedProperty = CXTPMarkupDependencyProperty::Register(L"IsPressed", MARKUP_TYPE(CXTPMarkupBool), MARKUP_TYPE(CXTPMarkupButtonBase),
  39. new CXTPMarkupPropertyMetadata(CXTPMarkupBool::CreateFalseValue(), CXTPMarkupPropertyMetadata::flagAffectsArrange));
  40. }
  41. CXTPMarkupButtonBase::CXTPMarkupButtonBase()
  42. {
  43. m_bPushed = FALSE;
  44. m_bMouseOver = FALSE;
  45. SetValue(m_pFocusableProperty, CXTPMarkupBool::CreateTrueValue());
  46. }
  47. void CXTPMarkupButtonBase::OnMouseLeave(CXTPMarkupMouseEventArgs* e)
  48. {
  49. m_bMouseOver = FALSE;
  50. if (m_bPushed)
  51. {
  52. SetValue(m_pIsPressedProperty, NULL);
  53. }
  54. else
  55. {
  56. CXTPMarkupContentControl::OnMouseLeave(e);
  57. InvalidateVisual();
  58. }
  59. }
  60. void CXTPMarkupButtonBase::OnMouseEnter(CXTPMarkupMouseEventArgs* e)
  61. {
  62. m_bMouseOver = TRUE;
  63. if (m_bPushed)
  64. {
  65. SetValue(m_pIsPressedProperty, CXTPMarkupBool::CreateTrueValue());
  66. }
  67. else
  68. {
  69. CXTPMarkupContentControl::OnMouseEnter(e);
  70. InvalidateVisual();
  71. }
  72. }
  73. void CXTPMarkupButtonBase::OnLostMouseCapture(CXTPMarkupMouseEventArgs* /*e*/)
  74. {
  75. SetPressed(FALSE);
  76. }
  77. void CXTPMarkupButtonBase::SetPressed(BOOL bPressed)
  78. {
  79. if (!bPressed && m_bPushed)
  80. {
  81. m_bPushed = FALSE;
  82. SetValue(m_pIsPressedProperty, NULL);
  83. if (!m_bMouseOver && IsMouseOver())
  84. {
  85. SetValue(m_pIsMouseOverProperty, NULL);
  86. InvalidateVisual();
  87. }
  88. }
  89. else if (bPressed && !m_bPushed)
  90. {
  91. m_bPushed = TRUE;
  92. SetValue(m_pIsPressedProperty, CXTPMarkupBool::CreateTrueValue());
  93. }
  94. }
  95. void CXTPMarkupButtonBase::OnMouseLeftButtonUp(CXTPMarkupMouseButtonEventArgs* e)
  96. {
  97. if (m_bPushed)
  98. {
  99. ReleaseMouseCapture();
  100. SetPressed(FALSE);
  101. if (m_bMouseOver)
  102. {
  103. OnClick();
  104. }
  105. e->SetHandled();
  106. }
  107. }
  108. void CXTPMarkupButtonBase::OnMouseLeftButtonDown(CXTPMarkupMouseButtonEventArgs* e)
  109. {
  110. Focus();
  111. SetPressed(TRUE);
  112. e->SetHandled();
  113. CaptureMouse();
  114. }
  115. void CXTPMarkupButtonBase::OnClick()
  116. {
  117. CXTPMarkupRoutedEventArgs e(m_pClickEvent, this);
  118. RaiseEvent(&e);
  119. }
  120. //////////////////////////////////////////////////////////////////////////
  121. // CXTPMarkupButton
  122. CXTPMarkupButton::CXTPMarkupButton()
  123. {
  124. }
  125. CXTPMarkupButton::~CXTPMarkupButton()
  126. {
  127. }
  128. IMPLEMENT_MARKUPCLASS(L"Button", CXTPMarkupButton, CXTPMarkupButtonBase)
  129. void CXTPMarkupButton::RegisterMarkupClass()
  130. {
  131. }
  132. CSize CXTPMarkupButton::ArrangeOverride(CSize szFinalSize)
  133. {
  134. CXTPMarkupUIElement* pContent = GetContent();
  135. if (pContent != NULL)
  136. {
  137. CRect rt(0, 0, szFinalSize.cx, szFinalSize.cy);
  138. if (IsPressed() && (!m_themeButton.IsAppThemed() || GetValue(m_pBackgroundProperty) != NULL))
  139. {
  140. rt.OffsetRect(1, 1);
  141. }
  142. CRect finalRect = CXTPMarkupThickness::HelperDeflateRect(rt, GetPadding());
  143. finalRect.DeflateRect(4, 4);
  144. pContent->Arrange(finalRect);
  145. }
  146. return szFinalSize;
  147. }
  148. CSize CXTPMarkupButton::MeasureOverride(CXTPMarkupDrawingContext* pDC, CSize szAvailableSize)
  149. {
  150. m_themeButton.OpenTheme(0, L"BUTTON");
  151. CSize size3 = GetPadding()->Size();
  152. size3.cx += 8;
  153. size3.cy += 8;
  154. CXTPMarkupUIElement* pContent = GetContent();
  155. if (pContent != NULL)
  156. {
  157. CSize availableSize(max(0, szAvailableSize.cx - size3.cx), max(0, szAvailableSize.cy - size3.cy));
  158. pContent->Measure(pDC, availableSize);
  159. CSize desiredSize = pContent->GetDesiredSize();
  160. return CSize(desiredSize.cx + size3.cx, desiredSize.cy + size3.cy);
  161. }
  162. return size3;
  163. }
  164. void CXTPMarkupButton::OnRender(CXTPMarkupDrawingContext* pDC)
  165. {
  166. BOOL bPressed = IsPressed();
  167. BOOL bHot = IsMouseOver();
  168. BOOL bDefault = FALSE;
  169. BOOL bEnabled = TRUE;
  170. BOOL bChecked = FALSE;
  171. CRect rc(0, 0, GetRenderSize().cx, GetRenderSize().cy);
  172. CXTPMarkupBrush* pBackground = MARKUP_STATICCAST(CXTPMarkupBrush, GetValue(m_pBackgroundProperty));
  173. if (pBackground == NULL && m_themeButton.IsAppThemed())
  174. {
  175. int nState = !bEnabled? PBS_DISABLED: bPressed? PBS_PRESSED: bHot? PBS_HOT: bChecked ? PBS_PRESSED : bDefault? PBS_DEFAULTED: PBS_NORMAL;
  176. m_themeButton.DrawThemeBackground(pDC->GetSafeHdc(), BP_PUSHBUTTON, nState, rc, NULL);
  177. }
  178. else
  179. {
  180. COLORREF clrLight, clrDark, clrDarkDark, clrBackground;
  181. if (pBackground)
  182. {
  183. clrBackground = pBackground->GetHintColor();
  184. DWORD dwHSLBackground = CXTPDrawHelpers::RGBtoHSL(clrBackground);
  185. DWORD dwL = GetBValue(dwHSLBackground);
  186. DWORD dwLight = (dwL + 240) / 2;
  187. clrLight = CXTPDrawHelpers::HSLtoRGB(RGB(GetRValue(dwHSLBackground), GetGValue(dwHSLBackground), dwLight));
  188. DWORD dwDark = MulDiv(dwL, 2, 3);
  189. clrDark = CXTPDrawHelpers::HSLtoRGB(RGB(GetRValue(dwHSLBackground), GetGValue(dwHSLBackground), dwDark));
  190. clrDarkDark = RGB(GetRValue(clrDark) / 2, GetGValue(clrDark) / 2, GetBValue(clrDark) / 2);
  191. pDC->DrawRectangle(pBackground, rc);
  192. }
  193. else
  194. {
  195. clrBackground = GetSysColor(COLOR_3DFACE);
  196. clrLight = GetSysColor(COLOR_WINDOW);
  197. clrDark = GetSysColor(COLOR_BTNSHADOW);
  198. clrDarkDark = GetSysColor(COLOR_3DDKSHADOW);
  199. CXTPMarkupSolidColorBrush brushBackground(clrBackground);
  200. pDC->DrawRectangle(&brushBackground, rc);
  201. }
  202. CXTPMarkupSolidColorBrush brushDark(clrDark);
  203. if (bPressed)
  204. {
  205. CXTPMarkupSolidColorBrush brushFrame(GetSysColor(COLOR_WINDOWFRAME));
  206. pDC->DrawFrame(&brushFrame, rc);
  207. rc.DeflateRect(1, 1);
  208. pDC->DrawFrame(&brushDark, rc);
  209. }
  210. else
  211. {
  212. CXTPMarkupSolidColorBrush brushLight(clrLight);
  213. CXTPMarkupSolidColorBrush brushDarkDark(clrDarkDark);
  214. pDC->DrawRectangle(&brushLight, CRect(rc.left, rc.top, rc.right, 1));
  215. pDC->DrawRectangle(&brushLight, CRect(rc.left, rc.top, rc.left + 1, rc.bottom));
  216. pDC->DrawRectangle(&brushDark, CRect(rc.left + 1, rc.bottom - 2, rc.right - 1, rc.bottom - 1));
  217. pDC->DrawRectangle(&brushDark, CRect(rc.right - 2, rc.top + 1, rc.right - 1, rc.bottom - 1));
  218. pDC->DrawRectangle(&brushDarkDark, CRect(rc.left, rc.bottom - 1, rc.right - 1, rc.bottom));
  219. pDC->DrawRectangle(&brushDarkDark, CRect(rc.right - 1, rc.top, rc.right, rc.bottom));
  220. }
  221. }
  222. }
  223. void CXTPMarkupButton::OnRenderFocusVisual(CXTPMarkupDrawingContext* drawingContext)
  224. {
  225. CRect rc(0, 0, GetRenderSize().cx, GetRenderSize().cy);
  226. rc.DeflateRect(3, 3);
  227. SetTextColor(drawingContext->GetSafeHdc(), 0xFFFFFF);
  228. SetBkColor(drawingContext->GetSafeHdc(), 0);
  229. DrawFocusRect(drawingContext->GetSafeHdc(), rc);
  230. }
  231. //////////////////////////////////////////////////////////////////////////
  232. // CXTPMarkupToggleButton
  233. CXTPMarkupDependencyProperty* CXTPMarkupToggleButton::m_pIsThreeStateProperty = NULL;
  234. CXTPMarkupDependencyProperty* CXTPMarkupToggleButton::m_pIsCheckedProperty = NULL;
  235. CXTPMarkupRoutedEvent* CXTPMarkupToggleButton::m_pCheckedEvent = NULL;
  236. CXTPMarkupRoutedEvent* CXTPMarkupToggleButton::m_pUncheckedEvent = NULL;
  237. CXTPMarkupRoutedEvent* CXTPMarkupToggleButton::m_pIndeterminateEvent = NULL;
  238. IMPLEMENT_MARKUPCLASS(NULL, CXTPMarkupToggleButton, CXTPMarkupButtonBase)
  239. void CXTPMarkupToggleButton::RegisterMarkupClass()
  240. {
  241. m_pCheckedEvent = CXTPMarkupRoutedEvent::RegisterRoutedEvent(L"Checked", CXTPMarkupRoutedEvent::routingBubble, MARKUP_TYPE(CXTPMarkupToggleButton));
  242. m_pUncheckedEvent = CXTPMarkupRoutedEvent::RegisterRoutedEvent(L"Unchecked", CXTPMarkupRoutedEvent::routingBubble, MARKUP_TYPE(CXTPMarkupToggleButton));
  243. m_pIndeterminateEvent = CXTPMarkupRoutedEvent::RegisterRoutedEvent(L"Indeterminate", CXTPMarkupRoutedEvent::routingBubble, MARKUP_TYPE(CXTPMarkupToggleButton));
  244. m_pIsCheckedProperty = CXTPMarkupDependencyProperty::Register(L"IsChecked", MARKUP_TYPE(CXTPMarkupEnum), MARKUP_TYPE(CXTPMarkupToggleButton),
  245. new CXTPMarkupPropertyMetadata(CXTPMarkupEnum::CreateValue(0), &CXTPMarkupToggleButton::ConvertIsChecked, &CXTPMarkupToggleButton::OnIsCheckedChanged, CXTPMarkupPropertyMetadata::flagAffectsRender));
  246. m_pIsThreeStateProperty = CXTPMarkupDependencyProperty::Register(L"IsThreeState", MARKUP_TYPE(CXTPMarkupBool), MARKUP_TYPE(CXTPMarkupToggleButton),
  247. new CXTPMarkupPropertyMetadata(CXTPMarkupBool::CreateFalseValue(), CXTPMarkupPropertyMetadata::flagAffectsRender));
  248. }
  249. CXTPMarkupObject* CXTPMarkupToggleButton::ConvertIsChecked(CXTPMarkupContext* /*pContext*/, CXTPMarkupObject* pObject)
  250. {
  251. if (IsStringObject(pObject))
  252. {
  253. if (_wcsicmp(*((CXTPMarkupString*)pObject), L"True") == 0)
  254. {
  255. return CXTPMarkupEnum::CreateValue(BST_CHECKED);
  256. }
  257. if (_wcsicmp(*((CXTPMarkupString*)pObject), L"False") == 0)
  258. {
  259. return CXTPMarkupEnum::CreateValue(BST_UNCHECKED);
  260. }
  261. if (_wcsicmp(*((CXTPMarkupString*)pObject), L"") == 0)
  262. {
  263. return CXTPMarkupEnum::CreateValue(BST_INDETERMINATE);
  264. }
  265. }
  266. return NULL;
  267. }
  268. void CXTPMarkupToggleButton::OnClick()
  269. {
  270. OnToggle();
  271. CXTPMarkupButtonBase::OnClick();
  272. }
  273. void CXTPMarkupToggleButton::OnToggle()
  274. {
  275. if (GetChecked() == BST_CHECKED)
  276. {
  277. SetChecked(IsThreeState() ? BST_INDETERMINATE : BST_UNCHECKED);
  278. }
  279. else
  280. {
  281. SetChecked(GetChecked() == BST_INDETERMINATE ? BST_UNCHECKED : BST_CHECKED);
  282. }
  283. }
  284. void CXTPMarkupToggleButton::OnChecked(CXTPMarkupRoutedEventArgs* e)
  285. {
  286. RaiseEvent(e);
  287. }
  288. void CXTPMarkupToggleButton::OnUnchecked(CXTPMarkupRoutedEventArgs* e)
  289. {
  290. RaiseEvent(e);
  291. }
  292. void CXTPMarkupToggleButton::OnIndeterminate(CXTPMarkupRoutedEventArgs* e)
  293. {
  294. RaiseEvent(e);
  295. }
  296. void CXTPMarkupToggleButton::OnIsCheckedChanged(CXTPMarkupObject* d, CXTPMarkupPropertyChangedEventArgs* e)
  297. {
  298. CXTPMarkupToggleButton* pButton = MARKUP_DYNAMICCAST(CXTPMarkupToggleButton, d);
  299. if (!pButton)
  300. return;
  301. CXTPMarkupEnum* pValue = MARKUP_STATICCAST(CXTPMarkupEnum, e->m_pNewValue);
  302. int bValue = pValue != NULL ? (int)*pValue : FALSE;
  303. if (bValue == BST_CHECKED)
  304. {
  305. CXTPMarkupRoutedEventArgs args(CXTPMarkupToggleButton::m_pCheckedEvent, pButton);
  306. pButton->OnChecked(&args);
  307. }
  308. else if (bValue == BST_UNCHECKED)
  309. {
  310. CXTPMarkupRoutedEventArgs args(CXTPMarkupToggleButton::m_pUncheckedEvent, pButton);
  311. pButton->OnUnchecked(&args);
  312. }
  313. else
  314. {
  315. CXTPMarkupRoutedEventArgs args(CXTPMarkupToggleButton::m_pIndeterminateEvent, pButton);
  316. pButton->OnIndeterminate(&args);
  317. }
  318. }
  319. //////////////////////////////////////////////////////////////////////////
  320. // CXTPMarkupCheckBox
  321. IMPLEMENT_MARKUPCLASS(L"CheckBox", CXTPMarkupCheckBox, CXTPMarkupToggleButton)
  322. void CXTPMarkupCheckBox::RegisterMarkupClass()
  323. {
  324. }
  325. CXTPMarkupCheckBox::CXTPMarkupCheckBox()
  326. {
  327. }
  328. CXTPMarkupCheckBox::~CXTPMarkupCheckBox()
  329. {
  330. }
  331. CSize CXTPMarkupCheckBox::ArrangeOverride(CSize szFinalSize)
  332. {
  333. CXTPMarkupUIElement* pContent = GetContent();
  334. if (pContent != NULL)
  335. {
  336. CRect rt(0, 0, szFinalSize.cx, szFinalSize.cy);
  337. CRect finalRect = CXTPMarkupThickness::HelperDeflateRect(rt, GetPadding());
  338. finalRect.DeflateRect(13 + 3, 0, 0, 0);
  339. pContent->Arrange(finalRect);
  340. }
  341. return szFinalSize;
  342. }
  343. CSize CXTPMarkupCheckBox::MeasureOverride(CXTPMarkupDrawingContext* pDC, CSize szAvailableSize)
  344. {
  345. m_themeButton.OpenTheme(0, L"BUTTON");
  346. CSize size3 = GetPadding()->Size();
  347. size3.cx += 13 + 3;
  348. CXTPMarkupUIElement* pContent = GetContent();
  349. if (pContent != NULL)
  350. {
  351. CSize availableSize(max(0, szAvailableSize.cx - size3.cx), max(0, szAvailableSize.cy - size3.cy));
  352. pContent->Measure(pDC, availableSize);
  353. CSize desiredSize = pContent->GetDesiredSize();
  354. return CSize(desiredSize.cx + size3.cx, max(13, desiredSize.cy + size3.cy));
  355. }
  356. return size3;
  357. }
  358. void CXTPMarkupCheckBox::OnRender(CXTPMarkupDrawingContext* pDC)
  359. {
  360. BOOL bPressed = IsPressed();
  361. BOOL bHot = IsMouseOver();
  362. BOOL bEnabled = TRUE;
  363. BOOL bChecked = GetChecked();
  364. CRect rc(0, GetRenderSize().cy / 2 - 6, 13, GetRenderSize().cy / 2 + 7);
  365. if (m_themeButton.IsAppThemed())
  366. {
  367. int nState = !bEnabled? CBS_UNCHECKEDDISABLED: bPressed? CBS_UNCHECKEDPRESSED: bHot?
  368. CBS_UNCHECKEDHOT: CBS_UNCHECKEDNORMAL;
  369. if (bChecked == BST_CHECKED)
  370. nState += 4;
  371. if (bChecked == BST_INDETERMINATE)
  372. nState += 8;
  373. m_themeButton.DrawThemeBackground(pDC->GetSafeHdc(), BP_CHECKBOX, nState, rc, NULL);
  374. }
  375. else
  376. {
  377. DrawFrameControl(pDC->GetSafeHdc(), rc, DFC_BUTTON, DFCS_BUTTONCHECK | (bPressed ? DFCS_PUSHED : 0)
  378. | (bChecked == BST_CHECKED ? DFCS_CHECKED : 0) | (bChecked == BST_INDETERMINATE ? DFCS_BUTTON3STATE | DFCS_CHECKED : 0));
  379. }
  380. }
  381. void CXTPMarkupCheckBox::OnRenderFocusVisual(CXTPMarkupDrawingContext* drawingContext)
  382. {
  383. CRect rc(0, 0, GetRenderSize().cx, GetRenderSize().cy);
  384. CXTPMarkupVisual* pContent = GetContent();
  385. if (!pContent)
  386. return;
  387. rc.left += 13 + 2;
  388. SetTextColor(drawingContext->GetSafeHdc(), 0xFFFFFF);
  389. SetBkColor(drawingContext->GetSafeHdc(), 0);
  390. DrawFocusRect(drawingContext->GetSafeHdc(), rc);
  391. }
  392. //////////////////////////////////////////////////////////////////////////
  393. // CXTPMarkupRadioButton
  394. IMPLEMENT_MARKUPCLASS(L"RadioButton", CXTPMarkupRadioButton, CXTPMarkupToggleButton)
  395. void CXTPMarkupRadioButton::RegisterMarkupClass()
  396. {
  397. }
  398. CXTPMarkupRadioButton::CXTPMarkupRadioButton()
  399. {
  400. }
  401. CXTPMarkupRadioButton::~CXTPMarkupRadioButton()
  402. {
  403. }
  404. CSize CXTPMarkupRadioButton::ArrangeOverride(CSize szFinalSize)
  405. {
  406. CXTPMarkupUIElement* pContent = GetContent();
  407. if (pContent != NULL)
  408. {
  409. CRect rt(0, 0, szFinalSize.cx, szFinalSize.cy);
  410. CRect finalRect = CXTPMarkupThickness::HelperDeflateRect(rt, GetPadding());
  411. finalRect.DeflateRect(13 + 3, 0, 0, 0);
  412. pContent->Arrange(finalRect);
  413. }
  414. return szFinalSize;
  415. }
  416. CSize CXTPMarkupRadioButton::MeasureOverride(CXTPMarkupDrawingContext* pDC, CSize szAvailableSize)
  417. {
  418. m_themeButton.OpenTheme(0, L"BUTTON");
  419. CSize size3 = GetPadding()->Size();
  420. size3.cx += 13 + 3;
  421. CXTPMarkupUIElement* pContent = GetContent();
  422. if (pContent != NULL)
  423. {
  424. CSize availableSize(max(0, szAvailableSize.cx - size3.cx), max(0, szAvailableSize.cy - size3.cy));
  425. pContent->Measure(pDC, availableSize);
  426. CSize desiredSize = pContent->GetDesiredSize();
  427. return CSize(desiredSize.cx + size3.cx, max(13, desiredSize.cy + size3.cy));
  428. }
  429. return CSize(size3.cx, max(13, size3.cy));
  430. }
  431. void CXTPMarkupRadioButton::OnRender(CXTPMarkupDrawingContext* pDC)
  432. {
  433. BOOL bPressed = IsPressed();
  434. BOOL bHot = IsMouseOver();
  435. BOOL bEnabled = TRUE;
  436. BOOL bChecked = GetChecked();
  437. CRect rc(0, GetRenderSize().cy / 2 - 6, 13, GetRenderSize().cy / 2 + 7);
  438. if (m_themeButton.IsAppThemed())
  439. {
  440. int nState = !bEnabled? RBS_UNCHECKEDDISABLED: bPressed? RBS_UNCHECKEDPRESSED: bHot?
  441. RBS_UNCHECKEDHOT: RBS_UNCHECKEDNORMAL;
  442. if (bChecked)
  443. nState += 4;
  444. m_themeButton.DrawThemeBackground(pDC->GetSafeHdc(), BP_RADIOBUTTON, nState, rc, NULL);
  445. }
  446. else
  447. {
  448. DrawFrameControl(pDC->GetSafeHdc(), rc, DFC_BUTTON, DFCS_BUTTONRADIO | (bPressed ? DFCS_PUSHED : 0)
  449. | (bChecked ? DFCS_CHECKED : 0));
  450. }
  451. }
  452. void CXTPMarkupRadioButton::OnRenderFocusVisual(CXTPMarkupDrawingContext* drawingContext)
  453. {
  454. CRect rc(0, 0, GetRenderSize().cx, GetRenderSize().cy);
  455. CXTPMarkupVisual* pContent = GetContent();
  456. if (!pContent)
  457. return;
  458. rc.left += 13 + 2;
  459. SetTextColor(drawingContext->GetSafeHdc(), 0xFFFFFF);
  460. SetBkColor(drawingContext->GetSafeHdc(), 0);
  461. DrawFocusRect(drawingContext->GetSafeHdc(), rc);
  462. }
  463. void CXTPMarkupRadioButton::OnToggle()
  464. {
  465. SetChecked(TRUE);
  466. }
  467. void CXTPMarkupRadioButton::OnChecked(CXTPMarkupRoutedEventArgs* e)
  468. {
  469. UpdateRadioButtonGroup();
  470. CXTPMarkupToggleButton::OnChecked(e);
  471. }
  472. void CXTPMarkupRadioButton::UpdateRadioButtonGroup()
  473. {
  474. CXTPMarkupVisual* pParent = GetVisualParent();
  475. if (!pParent)
  476. return;
  477. int nCount = pParent->GetVisualChildrenCount();
  478. for (int i = 0; i < nCount; i++)
  479. {
  480. CXTPMarkupRadioButton* pButton = MARKUP_DYNAMICCAST(CXTPMarkupRadioButton, pParent->GetVisualChild(i));
  481. if (pButton && pButton != this && pButton->GetChecked())
  482. {
  483. pButton->SetChecked(FALSE);
  484. }
  485. }
  486. }