SSwitch2.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #include "stdafx.h"
  2. #include "SSwitch2.h"
  3. namespace SOUI
  4. {
  5. SSwitch2::SSwitch2() : m_BOpen(TRUE), m_BChangeing(FALSE), m_FrameNow(0), m_pSkin(NULL), m_pSkinOff(NULL), m_pSkinOn(NULL)
  6. {
  7. m_style.m_strCursor = _T("hand");
  8. m_evtSet.addEvent(EVENTID(EventSwitchChanging));
  9. }
  10. SSwitch2::~SSwitch2()
  11. {
  12. }
  13. void SSwitch2::GetTextRect(LPRECT pRect)
  14. {
  15. GetClientRect(pRect);
  16. SASSERT(m_pSkin);
  17. CSize szSwitch = m_pSkin->GetSkinSize();
  18. pRect->left += szSwitch.cx + SwitchSpacing;
  19. }
  20. CRect SSwitch2::GetSwitchRect()
  21. {
  22. CRect rcClient;
  23. GetClientRect(rcClient);
  24. SASSERT(m_pSkin);
  25. CSize szCheck = m_pSkin->GetSkinSize();
  26. CRect rcCheckBox(rcClient.TopLeft(), szCheck);
  27. rcCheckBox.OffsetRect(0, (rcClient.Height() - szCheck.cy) / 2);
  28. return rcCheckBox;
  29. }
  30. void SSwitch2::OnPaint(IRenderTarget *pRT)
  31. {
  32. //背景、前景皮肤中间状态数必须一致。自己保证,不再代码检查
  33. CRect rcSwitch =GetSwitchRect();
  34. if (IsDisabled(TRUE))
  35. {
  36. if (m_disableSkin == NULL)
  37. {
  38. if(m_disableSkin=m_pSkin->Scale(GetScale()))
  39. m_disableSkin->OnColorize(0XFF888888);
  40. }
  41. if (m_disableSkin)
  42. m_disableSkin->Draw(pRT, rcSwitch, m_BOpen ? m_FrameNow : m_pSkin->GetStates() - m_FrameNow - 1);
  43. }
  44. else
  45. {
  46. if (m_pSkin)
  47. m_pSkin->Draw(pRT, rcSwitch, m_BOpen ? m_FrameNow : m_pSkin->GetStates() - m_FrameNow - 1);
  48. }
  49. if (!m_pSkinOn || !m_pSkinOff)
  50. return;
  51. (m_BOpen ?m_pSkinOn:m_pSkinOff)->Draw(pRT, rcSwitch, m_FrameNow);
  52. __super::OnPaint(pRT);
  53. }
  54. CSize SSwitch2::GetDesiredSize(int wid, int hei)
  55. {
  56. CSize szSkinRet;
  57. if (m_pSkin)
  58. szSkinRet = m_pSkin->GetSkinSize();
  59. CSize szRet = __super::GetDesiredSize(wid,hei);
  60. szRet.cx += szSkinRet.cx + SwitchSpacing;
  61. szRet.cy = (std::max)(szRet.cy, szSkinRet.cy);
  62. return szRet;
  63. }
  64. HRESULT SSwitch2::OnAttrOpen(const SStringW& strValue, BOOL bLoading)
  65. {
  66. m_BOpen = (strValue != L"0");
  67. m_FrameNow = 0;
  68. if (!bLoading)
  69. SetOpen(m_BOpen);
  70. return bLoading ? S_FALSE : S_OK;
  71. }
  72. void SSwitch2::OnLButtonUp(UINT nFlags, CPoint point)
  73. {
  74. __super::OnLButtonUp(nFlags, point);
  75. if (!GetWindowRect().PtInRect(point)) return;
  76. SetOpen(!m_BOpen);
  77. }
  78. void SSwitch2::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
  79. {
  80. if (nChar == VK_SPACE)
  81. {
  82. SetOpen(!m_BOpen);
  83. }
  84. }
  85. //属性处理
  86. BOOL SSwitch2::IsOpen() { return m_BOpen; }
  87. void SSwitch2::SetOpen(BOOL bOpen)
  88. {
  89. if ((m_BOpen != bOpen) && !m_BChangeing)
  90. {
  91. EventSwitchChanging evt(this);
  92. evt.bTurnOn = bOpen;
  93. FireEvent(evt);
  94. if (evt.bCacnel)
  95. return;
  96. m_BOpen = bOpen;
  97. m_BChangeing = TRUE;
  98. m_FrameNow = m_pSkinOn->GetStates()-1;
  99. GetContainer()->RegisterTimelineHandler(this);
  100. }
  101. }
  102. void SSwitch2::OnStateChanged(DWORD dwOldState, DWORD dwNewState)
  103. {
  104. InvalidateRect(NULL);
  105. __super::OnStateChanged(dwOldState, dwNewState);
  106. }
  107. void SSwitch2::OnNextFrame()
  108. {
  109. if (m_BChangeing&&m_pSkinOn)
  110. {
  111. m_FrameNow--;
  112. if (m_FrameNow <=0)
  113. {
  114. m_FrameNow = 0;
  115. m_BChangeing = FALSE;
  116. GetContainer()->UnregisterTimelineHandler(this);
  117. }
  118. }
  119. else
  120. GetContainer()->UnregisterTimelineHandler(this);
  121. InvalidateRect(NULL);
  122. }
  123. }