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

对话框与窗口

开发平台:

Visual C++

  1. // XTPSkinObjectProgress.cpp: implementation of the CXTPSkinObjectProgress class.
  2. //
  3. // This file is a part of the XTREME SKINFRAMEWORK 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 "XTPSkinObjectProgress.h"
  23. #include "XTPSkinManager.h"
  24. #ifdef _DEBUG
  25. #undef THIS_FILE
  26. static char THIS_FILE[]=__FILE__;
  27. #define new DEBUG_NEW
  28. #endif
  29. #ifndef PBS_MARQUEE
  30. #define PBS_MARQUEE             0x08
  31. #endif
  32. #ifndef PBM_SETMARQUEE
  33. #define PBM_SETMARQUEE          (WM_USER+10)
  34. #endif
  35. #define TID_TIMER  102
  36. //////////////////////////////////////////////////////////////////////////
  37. // CXTPSkinObjectProgress
  38. IMPLEMENT_DYNCREATE(CXTPSkinObjectProgress, CXTPSkinObjectFrame)
  39. CXTPSkinObjectProgress::CXTPSkinObjectProgress()
  40. {
  41. m_strClassName = _T("PROGRESS");
  42. m_nMarqueePos = 0;
  43. m_nMarqueeDelay = 0;
  44. }
  45. CXTPSkinObjectProgress::~CXTPSkinObjectProgress()
  46. {
  47. }
  48. BEGIN_MESSAGE_MAP(CXTPSkinObjectProgress, CXTPSkinObjectFrame)
  49. //{{AFX_MSG_MAP(CXTPSkinObjectProgress)
  50. ON_WM_ERASEBKGND()
  51. ON_WM_PAINT()
  52. ON_WM_CREATE()
  53. ON_MESSAGE(WM_PRINTCLIENT, OnPrintClient)
  54. ON_MESSAGE(PBM_SETMARQUEE, OnStartMarquee)
  55. ON_MESSAGE(PBM_STEPIT, OnStepIt)
  56. ON_MESSAGE(PBM_SETPOS, OnSetPos)
  57. ON_WM_TIMER()
  58. //}}AFX_MSG_MAP
  59. END_MESSAGE_MAP()
  60. /////////////////////////////////////////////////////////////////////////////
  61. // CXTPSkinObjectProgress message handlers
  62. int CXTPSkinObjectProgress::OnCreate(LPCREATESTRUCT lpCreateStruct)
  63. {
  64. if (CXTPSkinObjectFrame::OnCreate(lpCreateStruct) == -1)
  65. return -1;
  66. if ((GetExStyle() & WS_EX_STATICEDGE) && m_pManager->IsEnabled())
  67. {
  68. ModifyStyleEx(WS_EX_STATICEDGE, 0);
  69. SetWindowPos(NULL, 0,0,0,0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
  70. }
  71. return 0;
  72. }
  73. void CXTPSkinObjectProgress::OnSkinChanged(BOOL bPrevState, BOOL bNewState)
  74. {
  75. CXTPSkinObjectFrame::OnSkinChanged(bPrevState, bNewState);
  76. BOOL bRemovedStaticEdge = m_pManager->IsEnabled() || CXTPWinThemeWrapper().IsThemeActive();
  77. BOOL bStaticEdgeRemoved = (GetExStyle() & WS_EX_STATICEDGE) == 0;
  78. if (bStaticEdgeRemoved != bRemovedStaticEdge)
  79. {
  80. if (bRemovedStaticEdge)
  81. ModifyStyleEx(WS_EX_STATICEDGE, 0);
  82. else
  83. ModifyStyleEx(0, WS_EX_STATICEDGE);
  84. SetWindowPos(NULL, 0,0,0,0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED);
  85. }
  86. }
  87. BOOL CXTPSkinObjectProgress::OnEraseBkgnd(CDC* /*pDC*/)
  88. {
  89. return TRUE;
  90. }
  91. LRESULT CXTPSkinObjectProgress::OnPrintClient(WPARAM wParam, LPARAM lParam)
  92. {
  93. if ((lParam & PRF_CLIENT) == 0)
  94. return Default();
  95. CDC* pDC = CDC::FromHandle((HDC)wParam);
  96. if (pDC) OnDraw(pDC);
  97. return 1;
  98. }
  99. void CXTPSkinObjectProgress::OnPaint()
  100. {
  101. CXTPSkinObjectPaintDC dc(this); // device context for painting
  102. OnDraw(&dc);
  103. }
  104. void CXTPSkinObjectProgress::OnDraw(CDC* pDC)
  105. {
  106. CRect rcClient;
  107. GetClientRect(&rcClient);
  108. CXTPBufferDC dcMem(*pDC, rcClient);
  109. dcMem.FillSolidRect(rcClient, GetColor(COLOR_3DFACE));
  110. DWORD dwStyle = GetStyle();
  111. BOOL bVert = dwStyle & PBS_VERTICAL;
  112. int nBarPart = bVert ? PP_BARVERT : PP_BAR;
  113. int nChunkPart = bVert ? PP_CHUNKVERT : PP_CHUNK;
  114. CXTPSkinManagerClass* pClassProgress = GetSkinClass();
  115. pClassProgress->DrawThemeBackground(&dcMem, nBarPart, 0,  rcClient);
  116. CRect rc = rcClient;
  117. CRect rcMargins = pClassProgress->GetThemeRect(nBarPart, 0,  TMT_SIZINGMARGINS);
  118. rc.DeflateRect(rcMargins);
  119. int iWidth, dxBlock;
  120. if (GetStyle() & PBS_MARQUEE)
  121. {
  122. rcClient = rc;
  123. dxBlock = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSCHUNKSIZE, rc.Height() * 2 / 3);
  124. int dxSpace = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSSPACESIZE, 2);
  125. rc.left = m_nMarqueePos + rcClient.left;
  126. for (int i = 0; i < 5; i++)
  127. {
  128. if (rc.left >= rcClient.right)
  129. rc.left = rcClient.left;
  130. rc.right = rc.left + dxBlock;
  131. if (rc.right > rcClient.right)
  132. rc.right = rcClient.right;
  133. pClassProgress->DrawThemeBackground(&dcMem, nChunkPart, 0,  rc);
  134. rc.left = rc.right + dxSpace;
  135. }
  136. return;
  137. }
  138. PBRANGE range;
  139. SendMessage(PBM_GETRANGE, (WPARAM) FALSE, (LPARAM) &range);
  140. int iLow = range.iLow;
  141. int iHigh = range.iHigh;
  142. int iPos =  (int)SendMessage(PBM_GETPOS);
  143. if (bVert)
  144. {
  145. iWidth = rc.Height();
  146. dxBlock = (rcClient.right - rcClient.left) * 2 / 3;
  147. }
  148. else
  149. {
  150. iWidth = rc.Width();
  151. dxBlock = (rcClient.bottom - rcClient.top) * 2 / 3;
  152. }
  153. int x = MulDiv(iWidth, iPos - iLow, iHigh - iLow);
  154. dxBlock = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSCHUNKSIZE, dxBlock);
  155. int dxSpace = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSSPACESIZE, 2);
  156. if (dxBlock == 0)
  157. dxBlock = 1;
  158. if (dxBlock == 1 && dxSpace == 0)
  159. {
  160. if (bVert)
  161. {
  162. rc.top = rc.bottom - x;
  163. }
  164. else
  165. {
  166. rc.right = rc.left + x;
  167. }
  168. pClassProgress->DrawThemeBackground(&dcMem, nChunkPart, 0,  rc);
  169. return;
  170. }
  171. int nBlocks = (x + (dxBlock + dxSpace) - 1) / (dxBlock + dxSpace);
  172. for (int i = 0; i < nBlocks; i++)
  173. {
  174. if (bVert)
  175. {
  176. rc.top = rc.bottom - dxBlock;
  177. if (rc.bottom <= rcClient.top)
  178. break;
  179. if (rc.top <= rcClient.top)
  180. rc.top = rcClient.top + 1;
  181. }
  182. else
  183. {
  184. rc.right = rc.left + dxBlock;
  185. if (rc.left >= rcClient.right)
  186. break;
  187. if (rc.right >= rcClient.right)
  188. rc.right = rcClient.right - 1;
  189. }
  190. pClassProgress->DrawThemeBackground(&dcMem, nChunkPart, 0,  rc);
  191. if (bVert)
  192. rc.bottom = rc.top - dxSpace;
  193. else
  194. rc.left = rc.right + dxSpace;
  195. }
  196. }
  197. LRESULT CXTPSkinObjectProgress::OnStepIt(WPARAM /*wParam*/, LPARAM /*lParam*/)
  198. {
  199. if (((GetStyle() & PBS_MARQUEE) == 0))
  200. return Default();
  201. DoStep(1);
  202. return 1;
  203. }
  204. LRESULT CXTPSkinObjectProgress::OnSetPos(WPARAM /*wParam*/, LPARAM /*lParam*/)
  205. {
  206. LRESULT lResult = Default();
  207. Invalidate(FALSE);
  208. return lResult;
  209. }
  210. LRESULT CXTPSkinObjectProgress::OnStartMarquee(WPARAM wParam, LPARAM lParam)
  211. {
  212. m_nMarqueePos = 0;
  213. m_nMarqueeDelay = 0;
  214. if (((GetStyle() & PBS_MARQUEE) == 0))
  215. return Default();
  216. BOOL bMarquee = wParam && (lParam > 0);
  217. m_nMarqueePos = 0;
  218. KillTimer(TID_TIMER);
  219. if (bMarquee)
  220. {
  221. m_nMarqueeDelay = (UINT)lParam;
  222. SetTimer(TID_TIMER, m_nMarqueeDelay, NULL);
  223. }
  224. return 1;
  225. }
  226. void CXTPSkinObjectProgress::DoStep(int nStep)
  227. {
  228. CXTPClientRect rcClient(this);
  229. CXTPSkinManagerClass* pClassProgress = GetSkinClass();
  230. int dxBlock = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSCHUNKSIZE, (rcClient.Height() - 6) * 2 / 3);
  231. int dxSpace = pClassProgress->GetThemeInt(0, 0, TMT_PROGRESSSPACESIZE, 2);
  232. m_nMarqueePos += (dxBlock + dxSpace) * nStep;
  233. if (m_nMarqueePos > rcClient.right)
  234. m_nMarqueePos = 0;
  235. Invalidate(FALSE);
  236. }
  237. void CXTPSkinObjectProgress::OnTimer(UINT_PTR nIDEvent)
  238. {
  239. if (nIDEvent == TID_TIMER && (GetStyle() & PBS_MARQUEE))
  240. {
  241. DoStep(m_nMarqueeDelay > 50 ? 1 : 2);
  242. return;
  243. }
  244. CWnd::OnTimer(nIDEvent);
  245. }