ExtProgressWnd.cpp
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:11k
源码类别:

界面编程

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2009 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // mailto:support@prof-uis.com
  7. //
  8. // This source code can be used, modified and redistributed
  9. // under the terms of the license agreement that is included
  10. // in the Professional User Interface Suite package.
  11. //
  12. // Warranties and Disclaimers:
  13. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  14. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  16. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  17. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  18. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  19. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  20. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  21. #include "stdafx.h"
  22. #if (!defined __EXT_MFC_NO_PROGRESS_WND)
  23. #if (!defined __EXT_PROGRESS_WND_H)
  24. #include <ExtProgressWnd.h>
  25. #endif // (!defined __EXT_PROGRESS_WND_H)
  26. #if (!defined __EXT_PAINT_MANAGER_H)
  27. #include <ExtPaintManager.h>
  28. #endif
  29. #if (!defined __EXT_MEMORY_DC_H)
  30. #include <../Src/ExtMemoryDC.h>
  31. #endif
  32. //#include <Resources/Resource.h>
  33. #ifdef _DEBUG
  34. #define new DEBUG_NEW
  35. #undef THIS_FILE
  36. static char THIS_FILE[] = __FILE__;
  37. #endif
  38. IMPLEMENT_SERIAL( CExtProgressWnd, CProgressCtrl, VERSIONABLE_SCHEMA|1 );
  39. IMPLEMENT_CExtPmBridge_MEMBERS( CExtProgressWnd );
  40. CExtProgressWnd::CExtProgressWnd()
  41. : m_clrProgressBarFrom( COLORREF(-1L) )
  42. , m_clrProgressBarTo( COLORREF(-1L) )
  43. , m_clrBackgroundArea( COLORREF(-1L) )
  44. , m_lfEnlightClrProgressBarFrom( -0.25 )
  45. , m_lfEnlightClrProgressBarTo( 0.25 )
  46. , m_clrBorderLT( COLORREF(-1L) )
  47. , m_clrBorderRB( COLORREF(-1L) )
  48. , m_sizeBorderSpace( 2, 2 )
  49. , m_sizeDistanceBetweenBlocks( 2, 2 )
  50. , m_sizeBlockScaleFactorH( 7, 10 )
  51. , m_sizeBlockScaleFactorV( 7, 10 )
  52. , m_bHasBorder( true )
  53. , m_bHorizontalGradientBars( true )
  54. , m_bImmediateUpdating( true )
  55. , m_bUsePaintManager( true )
  56. , m_bEndlessMode( false )
  57. , m_nEndlessNominator( 1 )
  58. , m_nEndlessDenominator( 3 )
  59. {
  60. }
  61. CExtProgressWnd::~CExtProgressWnd()
  62. {
  63. }
  64. BEGIN_MESSAGE_MAP( CExtProgressWnd, CProgressCtrl )
  65.     //{{AFX_MSG_MAP(CExtProgressWnd)
  66. ON_WM_PAINT()
  67. ON_WM_ERASEBKGND()
  68. ON_WM_NCCALCSIZE()
  69. //}}AFX_MSG_MAP
  70. END_MESSAGE_MAP()
  71. void CExtProgressWnd::OnPaint() 
  72. {
  73. ASSERT_VALID( this );
  74. CRect rcClient;
  75. GetClientRect( &rcClient );
  76. CPaintDC dcPaint(this);
  77. CExtMemoryDC dc( &dcPaint );
  78. OnPaintProgress( dc, rcClient );
  79. }
  80. void CExtProgressWnd::OnPaintProgress(
  81. CDC & dc,
  82. CRect rcClient
  83. )
  84. {
  85. ASSERT_VALID( this );
  86. ASSERT_VALID( (&dc) );
  87. ASSERT( dc.GetSafeHdc() != NULL );
  88. if( rcClient.Width() <= 0
  89. || rcClient.Height() <= 0
  90. )
  91. return;
  92. if( ! dc.RectVisible( &rcClient ) )
  93. return;
  94. CExtPaintManager * pPM = PmBridge_GetPM();
  95. ASSERT_VALID( pPM );
  96. int nRangeMin, nRangeMax;
  97. GetRange( nRangeMin, nRangeMax );
  98. int nRange = nRangeMax - nRangeMin;
  99. int nPos = GetPos() - nRangeMin;
  100. DWORD dwStyle = GetStyle();
  101. bool bHorz = ( ( dwStyle & PBS_VERTICAL ) == 0 ) ? true : false;
  102. bool bSmooth =  ( ( dwStyle & PBS_SMOOTH ) != 0 ) ? true : false;
  103. bool bBorder = m_bHasBorder; //( ( dwStyle & WS_BORDER ) != 0 ) ? true : false;
  104. CRect rcProgress( rcClient );
  105. if( ( ! pPM->GetCb2DbTransparentMode( this ) )
  106. || ( ! pPM->PaintDockerBkgnd( true, dc, this ) )
  107. )
  108. {
  109. COLORREF clrBackgroundArea =
  110. ( m_clrBackgroundArea == COLORREF(-1L) )
  111. ? pPM->GetColor( COLOR_3DFACE )
  112. : m_clrBackgroundArea
  113. ;
  114. clrBackgroundArea = dc.GetNearestColor( clrBackgroundArea );
  115. dc.FillSolidRect( &rcProgress, clrBackgroundArea );
  116. }
  117. if( m_bUsePaintManager )
  118. {
  119. CExtPaintManager::PAINTPROGRESSDATA _ppd(
  120. nPos,
  121. nRange,
  122. rcClient,
  123. bHorz,
  124. bSmooth,
  125. bBorder,
  126. this
  127. );
  128. _ppd.m_bEndlessMode = m_bEndlessMode;
  129. _ppd.m_nEndlessNominator = m_nEndlessNominator;
  130. _ppd.m_nEndlessDenominator = m_nEndlessDenominator;
  131. if( pPM->PaintProgress( dc, _ppd ) )
  132. return;
  133. } // if( m_bUsePaintManager )
  134. if( bBorder )
  135. {
  136. COLORREF clrBorderLT =
  137. ( m_clrBorderLT == COLORREF(-1L) )
  138. ? pPM->GetColor( COLOR_3DDKSHADOW )
  139. : m_clrBorderLT
  140. ;
  141. COLORREF clrBorderRB =
  142. ( m_clrBorderRB == COLORREF(-1L) )
  143. ? clrBorderLT
  144. : m_clrBorderRB
  145. ;
  146. clrBorderLT = dc.GetNearestColor( clrBorderLT );
  147. clrBorderRB = dc.GetNearestColor( clrBorderRB );
  148. dc.Draw3dRect( &rcProgress, clrBorderLT, clrBorderRB );
  149. rcProgress.DeflateRect(
  150. pPM->UiScalingDo( m_sizeBorderSpace.cx, CExtPaintManager::__EUIST_X ),
  151. pPM->UiScalingDo( m_sizeBorderSpace.cy, CExtPaintManager::__EUIST_Y )
  152. );
  153. if( rcProgress.Width() <= 0
  154. || rcProgress.Height() <= 0
  155. )
  156. return;
  157. } // if( bBorder )
  158. CRect rcBar( rcProgress );
  159. if( m_bEndlessMode )
  160. {
  161. ASSERT( m_nEndlessNominator > 0 );
  162. ASSERT( m_nEndlessDenominator > 0 );
  163. ASSERT( m_nEndlessNominator < m_nEndlessDenominator );
  164. if( bHorz )
  165. {
  166. LONG nBasic = rcBar.Width();
  167. LONG nCross = rcBar.Height();
  168. if( nCross <= 0 )
  169. nCross = 1;
  170. LONG nAll = nBasic - ( bSmooth ? 0 : ( nBasic % nCross ) );
  171. LONG nPart = ::MulDiv( nAll, m_nEndlessNominator, m_nEndlessDenominator );
  172. LONG nExt = nAll - nPart;
  173. rcBar.left += ::MulDiv( nExt, nPos, nRange );
  174. rcBar.right = rcBar.left + nPart;
  175. }
  176. else
  177. {
  178. LONG nBasic = rcBar.Height();
  179. LONG nCross = rcBar.Width();
  180. if( nCross <= 0 )
  181. nCross = 1;
  182. LONG nAll = nBasic - ( bSmooth ? 0 : ( nBasic % nCross ) );
  183. LONG nPart = ::MulDiv( nAll, m_nEndlessNominator, m_nEndlessDenominator );
  184. LONG nExt = nAll - nPart;
  185. rcBar.bottom -= ::MulDiv( nExt, nPos, nRange );
  186. rcBar.top = rcBar.bottom - nPart;
  187. }
  188. } // if( m_bEndlessMode )
  189. else
  190. {
  191. if( bHorz )
  192. rcBar.right = rcBar.left + ::MulDiv( rcBar.Width(), nPos, nRange );
  193. else
  194. rcBar.top = rcBar.bottom - ::MulDiv( rcBar.Height(), nPos, nRange );
  195. } // else from if( m_bEndlessMode )
  196. if( dc.RectVisible( &rcBar ) )
  197. {
  198. COLORREF clrProgressBarFrom =
  199. ( m_clrProgressBarFrom == COLORREF(-1L) )
  200. ? pPM->GetColor( COLOR_HIGHLIGHT )
  201. : m_clrProgressBarFrom
  202. ;
  203. COLORREF clrProgressBarTo =
  204. ( m_clrProgressBarTo == COLORREF(-1L) )
  205. ? clrProgressBarFrom
  206. : m_clrProgressBarTo
  207. ;
  208. if( m_lfEnlightClrProgressBarFrom != 0.0 )
  209. clrProgressBarFrom =
  210. CExtPaintManager::stat_HLS_Adjust(
  211. clrProgressBarFrom,
  212. 0.0,
  213. m_lfEnlightClrProgressBarFrom
  214. );
  215. if( m_lfEnlightClrProgressBarTo != 0.0 )
  216. clrProgressBarTo =
  217. CExtPaintManager::stat_HLS_Adjust(
  218. clrProgressBarFrom,
  219. 0.0,
  220. m_lfEnlightClrProgressBarTo
  221. );
  222. clrProgressBarFrom = dc.GetNearestColor( clrProgressBarFrom );
  223. clrProgressBarTo = dc.GetNearestColor( clrProgressBarTo );
  224. if( bSmooth )
  225. {
  226. if( clrProgressBarFrom != clrProgressBarTo )
  227. CExtPaintManager::stat_PaintGradientRect(
  228. dc,
  229. &rcBar,
  230. clrProgressBarFrom,
  231. clrProgressBarTo,
  232. m_bHorizontalGradientBars
  233. );
  234. else
  235. dc.FillSolidRect( &rcBar, clrProgressBarFrom );
  236. } // if( bSmooth )
  237. else
  238. {
  239. INT nDistanceBetweenBlocks =
  240. pPM->UiScalingDo(
  241. bHorz ? m_sizeDistanceBetweenBlocks.cx : m_sizeDistanceBetweenBlocks.cy,
  242. bHorz ? CExtPaintManager::__EUIST_X : CExtPaintManager::__EUIST_Y
  243. );
  244. CRect rcBlock;
  245. if( m_bEndlessMode )
  246. rcBlock = rcBar;
  247. else
  248. rcBlock = rcProgress;
  249. if( bHorz )
  250. rcBlock.right =
  251.   rcBlock.left
  252. + ::MulDiv( rcBlock.Height(), m_sizeBlockScaleFactorH.cx, m_sizeBlockScaleFactorH.cy );
  253. else
  254. rcBlock.top =
  255.   rcBlock.bottom
  256. - ::MulDiv( rcBlock.Width(), m_sizeBlockScaleFactorV.cx, m_sizeBlockScaleFactorV.cy );
  257. if( rcBlock.Width() <= 0 )
  258. rcBlock.right = rcBlock.left + 1;
  259. if( rcBlock.Height() <= 0 )
  260. rcBlock.top = rcBlock.bottom - 1;
  261. for( INT nIndex = 0; true; nIndex ++ )
  262. {
  263. if( bHorz )
  264. {
  265. if( rcBlock.left > rcBar.right )
  266. break;
  267. if( dc.RectVisible( &rcBlock ) )
  268. {
  269. if( clrProgressBarFrom != clrProgressBarTo )
  270. CExtPaintManager::stat_PaintGradientRect(
  271. dc,
  272. &rcBlock,
  273. clrProgressBarFrom,
  274. clrProgressBarTo,
  275. m_bHorizontalGradientBars
  276. );
  277. else
  278. dc.FillSolidRect( &rcBlock, clrProgressBarFrom );
  279. } // if( dc.RectVisible( &rcBlock ) )
  280. rcBlock.OffsetRect( rcBlock.Width() + nDistanceBetweenBlocks, 0 );
  281. } // if( bHorz )
  282. else
  283. {
  284. if( rcBlock.bottom < rcBar.top )
  285. break;
  286. if( dc.RectVisible( &rcBlock ) )
  287. {
  288. if( clrProgressBarFrom != clrProgressBarTo )
  289. CExtPaintManager::stat_PaintGradientRect(
  290. dc,
  291. &rcBlock,
  292. clrProgressBarFrom,
  293. clrProgressBarTo,
  294. m_bHorizontalGradientBars
  295. );
  296. else
  297. dc.FillSolidRect( &rcBlock, clrProgressBarFrom );
  298. } // if( dc.RectVisible( &rcBlock ) )
  299. rcBlock.OffsetRect( 0, - rcBlock.Height() - nDistanceBetweenBlocks );
  300. } // else from if( bHorz )
  301. } // for( INT nIndex = 0; true; nIndex ++ )
  302. } // else from if( bSmooth )
  303. } // if( dc.RectVisible( &rcBar ) )
  304. }
  305. BOOL CExtProgressWnd::OnEraseBkgnd( CDC * pDC ) 
  306. {
  307. ASSERT_VALID( this );
  308. pDC;
  309.     return TRUE;
  310. }
  311. void CExtProgressWnd::OnNcCalcSize( BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR * lpncsp ) 
  312. {
  313. bCalcValidRects;
  314. lpncsp;
  315. }
  316. void CExtProgressWnd::PreSubclassWindow() 
  317. {
  318. ASSERT_VALID( this );
  319. CProgressCtrl::PreSubclassWindow();
  320. CRect rcClient, rcWnd,
  321. GetClientRect( &rcClient );
  322. GetWindowRect( &rcWnd );
  323. rcWnd.OffsetRect( -rcWnd.TopLeft() );
  324. if( rcWnd != rcClient )
  325. SetWindowPos(
  326. NULL, 0, 0, 0, 0,
  327. SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE
  328. |SWP_NOZORDER|SWP_NOOWNERZORDER
  329. |SWP_FRAMECHANGED
  330. );
  331. }
  332. LRESULT CExtProgressWnd::WindowProc( UINT message, WPARAM wParam, LPARAM lParam ) 
  333. {
  334. if( message == WM_PRINT || message == WM_PRINTCLIENT )
  335. {
  336. CRect rcClient;
  337. GetClientRect( &rcClient );
  338. CDC * pDC = CDC::FromHandle( (HDC)wParam );
  339. OnPaintProgress( *pDC, rcClient );
  340. return (!0);
  341. } // if( message == WM_PRINT || message == WM_PRINTCLIENT )
  342. HWND hWndOwn = m_hWnd;
  343. LRESULT lResult = CProgressCtrl::WindowProc( message, wParam, lParam );
  344. if( ::IsWindow( hWndOwn )
  345. && m_bImmediateUpdating
  346. && ( message == PBM_SETRANGE
  347. || message == PBM_SETPOS
  348. || message == PBM_DELTAPOS
  349. || message == PBM_STEPIT
  350. || message == PBM_SETRANGE32
  351. )
  352. && IsWindowVisible()
  353. )
  354. {
  355. Invalidate();
  356. UpdateWindow();
  357. }
  358. return lResult;
  359. }
  360. #endif // (!defined __EXT_MFC_NO_PROGRESS_WND)