SkinProgressCtrl.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. // SkinProgressCtrl.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "SkinUI.h"
  5. #include "SkinProgressCtrl.h"
  6. // CSkinProgressCtrl
  7. IMPLEMENT_DYNAMIC(CSkinProgressCtrl, CProgressCtrl)
  8. CSkinProgressCtrl::CSkinProgressCtrl()
  9. {
  10. m_pBackImg = m_pStepImg = m_pFloatImg = NULL;
  11. m_nFloatPos = 0;
  12. m_szFloatsize.SetSize(0,0);
  13. }
  14. CSkinProgressCtrl::~CSkinProgressCtrl()
  15. {
  16. }
  17. BEGIN_MESSAGE_MAP(CSkinProgressCtrl, CProgressCtrl)
  18. ON_WM_PAINT()
  19. ON_WM_ERASEBKGND()
  20. ON_WM_DESTROY()
  21. ON_WM_TIMER()
  22. ON_WM_NCPAINT()
  23. END_MESSAGE_MAP()
  24. // CSkinProgressCtrl 消息处理程序
  25. void CSkinProgressCtrl::OnPaint()
  26. {
  27. CPaintDC dc(this); // device context for painting
  28. CRect rcClient,rcStep;
  29. GetClientRect(&rcClient);
  30. CMemoryDC MemDC(&dc, rcClient);
  31. //绘制背景
  32. DrawParentWndBg(GetSafeHwnd(),MemDC->GetSafeHdc());
  33. if (m_pBackImg != NULL && !m_pBackImg->IsNull())
  34. {
  35. m_pBackImg->DrawImage(&MemDC,0,0,rcClient.Width(),rcClient.Height());
  36. }
  37. if (m_pStepImg != NULL && !m_pStepImg->IsNull())
  38. {
  39. rcStep.CopyRect(&rcClient);
  40. int nMin,nMax;
  41. GetRange(nMin,nMax);
  42. if ( GetStyle() & PBS_VERTICAL )
  43. {
  44. rcStep.bottom=rcStep.Height()*GetPos()/(nMax-nMin);
  45. m_pStepImg->DrawImage(&MemDC,0,rcClient.Height()-rcStep.Height(),rcStep.Width(),rcStep.Height(),0,m_pStepImg->GetHeight()-(m_pStepImg->GetHeight()*GetPos()/(nMax-nMin)),m_pStepImg->GetWidth(),m_pStepImg->GetHeight()*GetPos()/(nMax-nMin));
  46. }
  47. else
  48. {
  49. rcStep.right=rcStep.Width()*GetPos()/(nMax-nMin);
  50. // m_pStepImg->DrawImage(&MemDC,0,0,rcStep.Width(),rcStep.Height(),0,0,m_pStepImg->GetWidth(),m_pStepImg->GetHeight()*GetPos()/(nMax-nMin));
  51. m_pStepImg->DrawImage(&MemDC,0,0,rcStep.right,rcStep.Height());
  52. }
  53. }
  54. if (m_pFloatImg != NULL && !m_pFloatImg->IsNull())
  55. {
  56. if ( GetStyle() & PBS_VERTICAL )
  57. m_pFloatImg->DrawImage(&MemDC,0,rcClient.Height()-m_nFloatPos,rcClient.Width(),m_pFloatImg->GetHeight());
  58. else
  59. m_pFloatImg->DrawImage(&MemDC,m_nFloatPos,0,m_pFloatImg->GetWidth(),rcClient.Height());
  60. }
  61. }
  62. BOOL CSkinProgressCtrl::OnEraseBkgnd(CDC* pDC)
  63. {
  64. return TRUE;
  65. }
  66. BOOL CSkinProgressCtrl::SetBackImage( LPCTSTR lpszFileName,bool bFixed /*= true*/ )
  67. {
  68. RenderEngine->RemoveImage(m_pBackImg);
  69. m_pBackImg = RenderEngine->GetImage(lpszFileName);
  70. if (NULL == m_pBackImg)
  71. return FALSE;
  72. else
  73. {
  74. if(bFixed) SetWindowPos(NULL,0,0,m_pBackImg->GetWidth()+2,m_pBackImg->GetHeight()+2,SWP_NOMOVE);
  75. return TRUE;
  76. }
  77. }
  78. void CSkinProgressCtrl::OnDestroy()
  79. {
  80. __super::OnDestroy();
  81. RenderEngine->RemoveImage(m_pBackImg);
  82. RenderEngine->RemoveImage(m_pStepImg);
  83. RenderEngine->RemoveImage(m_pFloatImg);
  84. }
  85. BOOL CSkinProgressCtrl::SetStepImage( LPCTSTR lpszFileName)
  86. {
  87. RenderEngine->RemoveImage(m_pStepImg);
  88. m_pStepImg = RenderEngine->GetImage(lpszFileName);
  89. if (NULL == m_pStepImg)
  90. return FALSE;
  91. else
  92. {
  93. return TRUE;
  94. }
  95. }
  96. BOOL CSkinProgressCtrl::SetFloatImage( LPCTSTR lpszFileName,int nTime/*=100*/ )
  97. {
  98. RenderEngine->RemoveImage(m_pFloatImg);
  99. m_pFloatImg = RenderEngine->GetImage(lpszFileName);
  100. if (NULL == m_pFloatImg)
  101. return FALSE;
  102. else
  103. {
  104. if ( GetSafeHwnd() != NULL )
  105. {
  106. m_szFloatsize.SetSize(m_pFloatImg->GetWidth(),m_pFloatImg->GetHeight());
  107. SetTimer(0,nTime,NULL);
  108. }
  109. return TRUE;
  110. }
  111. }
  112. void CSkinProgressCtrl::OnTimer(UINT_PTR nIDEvent)
  113. {
  114. if ( nIDEvent == 0 )
  115. {
  116. CRect rcClient;
  117. GetClientRect(&rcClient);
  118. int nMin,nMax;
  119. GetRange(nMin,nMax);
  120. int nFloat=0;
  121. if ( GetStyle() & PBS_VERTICAL )
  122. nFloat = rcClient.Height()*GetPos()/(nMax-nMin);
  123. else
  124. nFloat = rcClient.Width()*GetPos()/(nMax-nMin);
  125. if ( m_nFloatPos > nFloat)
  126. {
  127. if ( GetStyle() & PBS_VERTICAL )
  128. m_nFloatPos = m_szFloatsize.cy*(-1);
  129. else
  130. m_nFloatPos = m_szFloatsize.cx*(-1);
  131. }
  132. else m_nFloatPos+=5;
  133. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  134. }
  135. __super::OnTimer(nIDEvent);
  136. }
  137. void CSkinProgressCtrl::OnNcPaint()
  138. {
  139. return;
  140. }
  141. void CSkinProgressCtrl::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )
  142. {
  143. ISkinControl::SetAttribute(pstrName,pstrValue);
  144. if( _tcscmp(pstrName, _T("bkimage")) == 0 )
  145. {
  146. SetBackImage(pstrValue);
  147. }
  148. else if( _tcscmp(pstrName, _T("vertical")) == 0 )
  149. {
  150. if( _tcscmp(pstrValue, _T("true")) == 0 ) ModifyStyle(0,PBS_VERTICAL);
  151. }
  152. else if( _tcscmp(pstrName, _T("stepimage")) == 0 )
  153. {
  154. SetStepImage(pstrValue);
  155. }
  156. else if( _tcscmp(pstrName, _T("floatimage")) == 0 )
  157. {
  158. SetFloatImage(pstrValue);
  159. }
  160. else if( _tcscmp(pstrName, _T("range")) == 0 )
  161. {
  162. LPTSTR pstr = NULL;
  163. int cx = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr);
  164. int cy = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  165. SetRange(cx,cy);
  166. }
  167. else if( _tcscmp(pstrName, _T("value")) == 0 )
  168. {
  169. SetPos(_ttoi(pstrValue));
  170. }
  171. else if( _tcscmp(pstrName, _T("step")) == 0 )
  172. {
  173. SetStep(_ttoi(pstrValue));
  174. }
  175. else if( _tcscmp(pstrName, _T("floattime")) == 0 )
  176. {
  177. if( GetSafeHwnd() != NULL )
  178. SetTimer(0,_ttoi(pstrValue),NULL);
  179. }
  180. }
  181. BOOL CSkinProgressCtrl::CreateControl( CWnd* pParentWnd )
  182. {
  183. if( !Create(WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),pParentWnd,0) )
  184. return FALSE;
  185. m_pOwnWnd = this;
  186. return TRUE;
  187. }