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

界面编程

开发平台:

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_SPIN)
  23. #if (!defined __EXT_SPIN_H)
  24. #include <ExtSpinWnd.h>
  25. #endif
  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. #if (!defined __EXT_POPUP_MENU_WND_H)
  33. #include <ExtPopupMenuWnd.h>
  34. #endif
  35. #ifdef _DEBUG
  36. #define new DEBUG_NEW
  37. #undef THIS_FILE
  38. static char THIS_FILE[] = __FILE__;
  39. #endif
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CExtSpinWnd
  42. IMPLEMENT_DYNCREATE( CExtSpinWnd, CSpinButtonCtrl );
  43. CExtSpinWnd::CExtSpinWnd()
  44. : m_clrBackground( COLORREF(-1L) )
  45. , m_bCanceling( false )
  46. , m_bButtonUpHovered( false )
  47. , m_bButtonDownHovered( false )
  48. , m_bButtonUpPressed( false )
  49. , m_bButtonDownPressed( false )
  50. , m_bNcCalcSize( false )
  51. {
  52. }
  53. CExtSpinWnd::~CExtSpinWnd()
  54. {
  55. CExtAnimationSite * pAcAS = AnimationClient_SiteGet();
  56. if( pAcAS != NULL )
  57. pAcAS->AnimationSite_ClientRemove( this );
  58. }
  59. BEGIN_MESSAGE_MAP(CExtSpinWnd, CSpinButtonCtrl)
  60. //{{AFX_MSG_MAP(CExtSpinWnd)
  61. ON_WM_PAINT()
  62. ON_WM_ERASEBKGND()
  63. ON_WM_CANCELMODE()
  64. ON_WM_LBUTTONDOWN()
  65. ON_WM_LBUTTONUP()
  66. ON_WM_MOUSEMOVE()
  67. ON_WM_CAPTURECHANGED()
  68. ON_WM_NCCALCSIZE()
  69. ON_WM_NCPAINT()
  70. ON_WM_SIZE()
  71. //}}AFX_MSG_MAP
  72. ON_WM_ACTIVATEAPP()
  73. END_MESSAGE_MAP()
  74. /////////////////////////////////////////////////////////////////////////////
  75. // CExtSpinWnd message handlers
  76. void CExtSpinWnd::OnPaint() 
  77. {
  78. ASSERT_VALID( this );
  79.     if( ! m_bNcCalcSize )
  80.         SetWindowPos(
  81.             NULL, 0, 0, 0, 0,
  82.             SWP_NOMOVE|SWP_NOSIZE 
  83.             |SWP_NOZORDER|SWP_NOOWNERZORDER|SWP_FRAMECHANGED
  84.             );
  85. CPaintDC dcPaint( this );
  86. CRect rcClient;
  87. GetClientRect( &rcClient );
  88. if( ! dcPaint.RectVisible(&rcClient) )
  89. return;
  90. CExtMemoryDC dc( &dcPaint, &rcClient );
  91. OnSpinDrawEntire( dc, rcClient );
  92. }
  93. bool CExtSpinWnd::_IsBuddyToEdit()
  94. {
  95. ASSERT_VALID( this );
  96. DWORD dwStyle = GetStyle();
  97. bool bBuddyToEdit = false;
  98. bool bSpinAlignRight = false;
  99. bool bSpinAlignLeft = false;
  100. if( (dwStyle&UDS_AUTOBUDDY) != 0 )
  101. {
  102. CWnd * pWnd = this->GetWindow( GW_HWNDPREV );
  103. if( pWnd != NULL )
  104. {
  105. ASSERT_VALID( pWnd );
  106. static const TCHAR szEdit[] = _T("EDIT");
  107. TCHAR szCompare[ sizeof(szEdit)/sizeof(szEdit[0]) + 1 ] = _T("");
  108. ::GetClassName( 
  109. pWnd->GetSafeHwnd(), 
  110. szCompare, 
  111. sizeof(szCompare)/sizeof(szCompare[0]) 
  112. );
  113. if( !lstrcmpi( szCompare, szEdit ) )
  114. {
  115. bSpinAlignRight = ( (dwStyle&UDS_ALIGNRIGHT) != 0 ) ? true : false;
  116. bSpinAlignLeft = ( (dwStyle&UDS_ALIGNLEFT) != 0 ) ? true : false;
  117. bBuddyToEdit = (bSpinAlignRight || bSpinAlignLeft) ? true : false;
  118. }
  119. }
  120. }
  121. return bBuddyToEdit;
  122. }
  123. bool CExtSpinWnd::_IsEnabled()
  124. {
  125. ASSERT_VALID( this );
  126. bool bEnabled  = IsWindowEnabled() ? true : false;
  127. if( !bEnabled )
  128. return bEnabled;
  129. DWORD dwStyle = GetStyle();
  130. if( (dwStyle&UDS_AUTOBUDDY) != 0 )
  131. {
  132. CWnd * pWnd = this->GetWindow( GW_HWNDPREV );
  133. if( pWnd != NULL )
  134. {
  135. ASSERT_VALID( pWnd );
  136. bEnabled  = pWnd->IsWindowEnabled() ? true : false;
  137. }
  138. }
  139. return bEnabled;
  140. }
  141. bool CExtSpinWnd::_IsReadOnly()
  142. {
  143. ASSERT_VALID( this );
  144. bool bReadOnly = false;
  145. if( _IsBuddyToEdit() )
  146. {
  147. CWnd * pWnd = this->GetWindow( GW_HWNDPREV );
  148. if( pWnd != NULL )
  149. {
  150. ASSERT_VALID( pWnd );
  151. DWORD dwStyle = pWnd->GetStyle();
  152. if( (dwStyle&ES_READONLY) != 0 )
  153. bReadOnly = true;
  154. }
  155. }
  156. return bReadOnly;
  157. }
  158. bool CExtSpinWnd::GetButtonRect( 
  159. CRect & rcButtonUp,
  160. CRect & rcButtonDown,
  161. const CRect * prcClient // = NULL
  162. )
  163. {
  164. ASSERT_VALID( this );
  165. CRect rcClient;
  166. if( prcClient == NULL )
  167. GetClientRect( &rcClient );
  168. else
  169. rcClient = *prcClient;
  170. DWORD dwStyle = GetStyle();
  171. bool bHorz = ((dwStyle&UDS_HORZ) != 0) ? true : false;
  172. rcButtonUp = rcButtonDown = rcClient;
  173. if( !bHorz )
  174. {
  175. rcButtonUp.bottom = rcButtonUp.top + (rcClient.Height() / 2);
  176. rcButtonDown.top = rcButtonUp.bottom;
  177. }
  178. else
  179. {
  180. rcButtonUp.right = (rcClient.Width() / 2);
  181. rcButtonDown.left = rcButtonUp.right;
  182. }
  183. return true;
  184. }
  185. void CExtSpinWnd::OnSpinEraseClientArea(
  186. CDC & dc,
  187. const CRect & rcClient
  188. )
  189. {
  190. ASSERT_VALID( this );
  191. ASSERT( dc.GetSafeHdc() != NULL );
  192. if( !dc.RectVisible( rcClient ) )
  193. return;
  194. COLORREF clrBackground = OnQueryBkColor();
  195. if( _IsBuddyToEdit() 
  196. && clrBackground == COLORREF(-1L)
  197. )
  198. {
  199. if( (!_IsEnabled())
  200. || _IsReadOnly()
  201. )
  202. clrBackground = PmBridge_GetPM()->GetColor( COLOR_3DFACE, this );
  203. else
  204. clrBackground = PmBridge_GetPM()->GetColor( COLOR_WINDOW, this );
  205. }
  206. bool bTransparent = false;
  207. if( (! bTransparent )
  208. && PmBridge_GetPM()->GetCb2DbTransparentMode(this)
  209. && ( clrBackground == COLORREF(-1L) )
  210. )
  211. {
  212. CExtPaintManager::stat_ExcludeChildAreas(
  213. dc,
  214. GetSafeHwnd(),
  215. CExtPaintManager::stat_DefExcludeChildAreaCallback
  216. );
  217. if( PmBridge_GetPM()->PaintDockerBkgnd( true, dc, this ) )
  218. bTransparent = true;
  219. }
  220. if( ! bTransparent )
  221. dc.FillSolidRect(
  222. &rcClient,
  223. (clrBackground != COLORREF(-1L)) 
  224. ? clrBackground 
  225. : PmBridge_GetPM()->GetColor( CExtPaintManager::CLR_3DFACE_OUT, this ) 
  226. );
  227. PmBridge_GetPM()->OnPaintSessionComplete( this );
  228. }
  229. void CExtSpinWnd::OnSpinDrawEntire(
  230. CDC & dc,
  231. const CRect & rcClient
  232. )
  233. {
  234. ASSERT_VALID( this );
  235. ASSERT( dc.GetSafeHdc() != NULL );
  236. if( ! dc.RectVisible( rcClient ) )
  237. return;
  238. if( AnimationClient_StatePaint( dc ) )
  239. return;
  240. OnSpinEraseClientArea( 
  241. dc, 
  242. rcClient 
  243. );
  244. DWORD dwStyle = GetStyle();
  245. bool bHorz = ((dwStyle&UDS_HORZ) != 0) ? true : false;
  246. bool bEnabled  = _IsEnabled();
  247. bool bFlat = false;
  248. bool bHotTrack = ((dwStyle&UDS_HOTTRACK) != 0) ? true : false;
  249. bool bDrawBorder = true;
  250. CRect rcButtonUp;
  251. CRect rcButtonDown;
  252. GetButtonRect( 
  253. rcButtonUp, 
  254. rcButtonDown,
  255. &rcClient 
  256. );
  257. PmBridge_GetPM()->PaintSpinButton(
  258. dc,
  259. rcButtonUp,
  260. true,
  261. bHorz,
  262. bEnabled,
  263. bFlat,
  264. bDrawBorder,
  265. m_bButtonUpPressed,
  266. m_bButtonUpHovered,
  267. bHotTrack,
  268. this,
  269. 0L
  270. );
  271. PmBridge_GetPM()->PaintSpinButton(
  272. dc,
  273. rcButtonDown,
  274. false,
  275. bHorz,
  276. bEnabled,
  277. bFlat,
  278. bDrawBorder,
  279. m_bButtonDownPressed,
  280. m_bButtonDownHovered,
  281. bHotTrack,
  282. this,
  283. 0L
  284. );
  285. }
  286. BOOL CExtSpinWnd::OnEraseBkgnd(CDC* pDC) 
  287. {
  288. pDC;
  289. return TRUE;
  290. }
  291. #if _MFC_VER < 0x700
  292. void CExtSpinWnd::OnActivateApp(BOOL bActive, HTASK hTask) 
  293. #else
  294. void CExtSpinWnd::OnActivateApp(BOOL bActive, DWORD hTask) 
  295. #endif
  296. {
  297. CSpinButtonCtrl::OnActivateApp(bActive, hTask);
  298. if( ! bActive )
  299. SendMessage( WM_CANCELMODE );
  300. }
  301. void CExtSpinWnd::OnCancelMode() 
  302. {
  303. CSpinButtonCtrl::OnCancelMode();
  304. if( m_bCanceling )
  305. return;
  306. m_bCanceling = true;
  307. if( ::GetCapture() == GetSafeHwnd() )
  308. ::ReleaseCapture();
  309. if( m_bButtonUpHovered
  310. || m_bButtonDownHovered
  311. || m_bButtonUpPressed
  312. || m_bButtonDownPressed
  313. )
  314. {
  315. bool bExitingPushedState = ( m_bButtonUpPressed || m_bButtonDownPressed ) ? true : false;
  316. bool bAnimationLocked = AnimationClient_CacheGeneratorIsLocked();
  317. if( ! bAnimationLocked )
  318. {
  319. AnimationClient_CacheGeneratorLock();
  320. // if( AnimationClient_StateGet(true).IsEmpty() )
  321.   AnimationClient_CacheNextStateMinInfo(
  322. false,
  323. bExitingPushedState ? __EAPT_BY_PRESSED_STATE_TURNED_OFF : __EAPT_BY_HOVERED_STATE_TURNED_OFF
  324. );
  325. }
  326. m_bButtonUpHovered = false;
  327. m_bButtonDownHovered = false;
  328. m_bButtonUpPressed = false;
  329. m_bButtonDownPressed = false;
  330. if( ! bAnimationLocked )
  331. {
  332.   AnimationClient_CacheNextStateMinInfo(
  333. true,
  334. bExitingPushedState ? __EAPT_BY_PRESSED_STATE_TURNED_OFF : __EAPT_BY_HOVERED_STATE_TURNED_OFF
  335. );
  336. AnimationClient_CacheGeneratorUnlock();
  337. }
  338. Invalidate();
  339. }
  340. m_bCanceling = false;
  341. }
  342. void CExtSpinWnd::OnCaptureChanged(CWnd *pWnd) 
  343. {
  344. CSpinButtonCtrl::OnCaptureChanged(pWnd);
  345. if( m_bCanceling )
  346. return;
  347. HWND hWndCapture = ::GetCapture();
  348. if( hWndCapture != m_hWnd
  349. && hWndCapture != NULL
  350. )
  351. SendMessage( WM_CANCELMODE );
  352. }
  353. void CExtSpinWnd::OnLButtonDown(UINT nFlags, CPoint point) 
  354. {
  355. CSpinButtonCtrl::OnLButtonDown(nFlags, point);
  356. _ProcessMouseClick( point, true, MK_LBUTTON );
  357. }
  358. void CExtSpinWnd::OnLButtonUp(UINT nFlags, CPoint point) 
  359. {
  360. CSpinButtonCtrl::OnLButtonUp(nFlags, point);
  361. _ProcessMouseClick( point, false, MK_LBUTTON );
  362. }
  363. void CExtSpinWnd::OnMouseMove(UINT nFlags, CPoint point) 
  364. {
  365. CSpinButtonCtrl::OnMouseMove(nFlags, point);
  366. _ProcessMouseMove( point );
  367. }
  368. void CExtSpinWnd::PreSubclassWindow() 
  369. {
  370. CSpinButtonCtrl::PreSubclassWindow();
  371. m_bCanceling = false;
  372. m_bButtonUpHovered = false;
  373. m_bButtonDownHovered = false;
  374. m_bButtonUpPressed = false;
  375. m_bButtonDownPressed = false;
  376. m_bNcCalcSize = false;
  377. AnimationSite_ClientProgressStop( this );
  378. AnimationClient_StateGet( false ).Empty();
  379. AnimationClient_StateGet( true ).Empty();
  380. CRect rcClient;
  381. GetClientRect( &rcClient );
  382. AnimationClient_TargetRectSet( rcClient );
  383. }
  384. LRESULT CExtSpinWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
  385. {
  386. #if (defined WM_UPDATEUISTATE)
  387. ASSERT( WM_UPDATEUISTATE == 0x0128 );
  388. #endif
  389. // WM_UPDATEUISTATE causes repaint without WM_PAINT, so we eat it
  390. if( message == 0x0128 )
  391. return 0;
  392. if( message == WM_SETTEXT 
  393. || message == WM_ENABLE
  394. )
  395. {
  396. LRESULT lResult = CSpinButtonCtrl::WindowProc(message, wParam, lParam);
  397. Invalidate();
  398. UpdateWindow();
  399. return lResult;
  400. }
  401. if( message == WM_TIMER )
  402. {
  403. if( AnimationSite_OnHookTimer( UINT(wParam) ) )
  404. return 0L;
  405. }
  406. if( message == WM_PRINT || message == WM_PRINTCLIENT )
  407. {
  408. CDC * pDC = CDC::FromHandle( (HDC)wParam );
  409. CRect rcClient;
  410. GetClientRect( &rcClient );
  411. OnSpinDrawEntire( *pDC, rcClient );
  412. return (!0);
  413. }
  414. return CSpinButtonCtrl::WindowProc(message, wParam, lParam);
  415. }
  416. void CExtSpinWnd::SetBkColor( COLORREF clrBk )
  417. ASSERT_VALID( this );
  418. m_clrBackground = clrBk; 
  419. if( GetSafeHwnd() != NULL )
  420. Invalidate();
  421. }
  422. COLORREF CExtSpinWnd::GetBkColor() const
  423. ASSERT_VALID( this );
  424. return m_clrBackground; 
  425. }
  426. COLORREF CExtSpinWnd::OnQueryBkColor() const
  427. ASSERT_VALID( this );
  428. return GetBkColor(); 
  429. }
  430. bool CExtSpinWnd::_ProcessMouseClick(
  431. CPoint point,
  432. bool bButtonPressed,
  433. INT nMouseButton // MK_... values
  434. )
  435. {
  436. ASSERT_VALID( this );
  437. // process only left mouse button clicks
  438. if( nMouseButton != MK_LBUTTON )
  439. return false;
  440. CRect rcButtonUp, rcButtonDown;
  441. GetButtonRect( rcButtonUp, rcButtonDown );
  442. bool bButtonUpHoveredPrev = m_bButtonUpHovered;
  443. bool bButtonDownHoveredPrev = m_bButtonDownHovered;
  444. bool bButtonUpHoveredNext = false;
  445. bool bButtonDownHoveredNext = false;
  446. bool bButtonUpPressedPrev = m_bButtonUpPressed;
  447. bool bButtonDownPressedPrev = m_bButtonDownPressed;
  448. bool bButtonUpPressedNext = false;
  449. bool bButtonDownPressedNext = false;
  450. if( (! rcButtonUp.IsRectEmpty() )
  451. && rcButtonUp.PtInRect( point )
  452. )
  453. {
  454. bButtonUpHoveredNext = true;
  455. if( bButtonPressed )
  456. bButtonUpPressedNext = true;
  457. }
  458. if( (! rcButtonDown.IsRectEmpty() )
  459. && rcButtonDown.PtInRect( point )
  460. )
  461. {
  462. bButtonDownHoveredNext = true;
  463. if( bButtonPressed )
  464. bButtonDownPressedNext = true;
  465. }
  466. if( bButtonUpHoveredNext
  467. || bButtonDownHoveredNext
  468. || bButtonUpPressedNext
  469. || bButtonDownPressedNext
  470. )
  471. {
  472. if( ::GetCapture() != GetSafeHwnd() )
  473. ::SetCapture( GetSafeHwnd() );
  474. }
  475. else
  476. {
  477. if( ::GetCapture() == GetSafeHwnd() )
  478. ::ReleaseCapture();
  479. }
  480. if( bButtonUpHoveredNext != bButtonUpHoveredPrev
  481. || bButtonDownHoveredNext != bButtonDownHoveredPrev
  482. || bButtonUpPressedNext != bButtonUpPressedPrev
  483. || bButtonDownPressedNext != bButtonDownPressedPrev
  484. )
  485. {
  486. bool bAnimationLocked = AnimationClient_CacheGeneratorIsLocked();
  487. if( ! bAnimationLocked )
  488. {
  489. AnimationClient_CacheGeneratorLock();
  490. // if( AnimationClient_StateGet(true).IsEmpty() )
  491.   AnimationClient_CacheNextStateMinInfo(
  492. false,
  493. ( ( bButtonUpPressedNext != bButtonUpPressedPrev
  494. || bButtonDownPressedNext != bButtonDownPressedPrev
  495. )
  496. && ( bButtonUpPressedNext || bButtonDownPressedNext )
  497. )
  498. ? __EAPT_BY_PRESSED_STATE_TURNED_ON : __EAPT_BY_PRESSED_STATE_TURNED_OFF
  499. );
  500. }
  501. m_bButtonUpHovered = bButtonUpHoveredNext;
  502. m_bButtonDownHovered = bButtonDownHoveredNext;
  503. m_bButtonUpPressed = bButtonUpPressedNext;
  504. m_bButtonDownPressed = bButtonDownPressedNext;
  505. if( ! bAnimationLocked )
  506. {
  507.   AnimationClient_CacheNextStateMinInfo(
  508. true,
  509. ( ( bButtonUpPressedNext != bButtonUpPressedPrev
  510. || bButtonDownPressedNext != bButtonDownPressedPrev
  511. )
  512. && ( bButtonUpPressedNext || bButtonDownPressedNext )
  513. )
  514. ? __EAPT_BY_PRESSED_STATE_TURNED_ON : __EAPT_BY_PRESSED_STATE_TURNED_OFF
  515. );
  516. AnimationClient_CacheGeneratorUnlock();
  517. }
  518. Invalidate();
  519. }
  520. return true;
  521. }
  522. bool CExtSpinWnd::_ProcessMouseMove( CPoint point )
  523. {
  524. ASSERT_VALID( this );
  525. if( CExtPopupMenuWnd::IsMenuTracking() 
  526. || (! CExtPopupMenuWnd::TestHoverEnabledFromActiveHWND( GetSafeHwnd() ) )
  527. )
  528. return false;
  529. CRect rcButtonUp, rcButtonDown;
  530. GetButtonRect( rcButtonUp, rcButtonDown );
  531. bool bButtonUpHoveredPrev   = m_bButtonUpHovered;
  532. bool bButtonDownHoveredPrev = m_bButtonDownHovered;
  533. bool bButtonUpHoveredNext   = false;
  534. bool bButtonDownHoveredNext = false;
  535. if( (! rcButtonUp.IsRectEmpty() )
  536. && rcButtonUp.PtInRect( point )
  537. )
  538. bButtonUpHoveredNext = true;
  539. if( (! rcButtonDown.IsRectEmpty() )
  540. && rcButtonDown.PtInRect( point )
  541. )
  542. bButtonDownHoveredNext = true;
  543. if( bButtonUpHoveredNext
  544. || bButtonDownHoveredNext
  545. )
  546. {
  547. if( ::GetCapture() != GetSafeHwnd() )
  548. ::SetCapture( GetSafeHwnd() );
  549. }
  550. else if( (! m_bButtonUpPressed )
  551. && (! m_bButtonDownPressed)
  552. )
  553. {
  554. if( ::GetCapture() == GetSafeHwnd() )
  555. ::ReleaseCapture();
  556. }
  557. if( bButtonUpHoveredNext != bButtonUpHoveredPrev
  558. || bButtonDownHoveredNext != bButtonDownHoveredPrev
  559. )
  560. {
  561. bool bAnimationLocked = AnimationClient_CacheGeneratorIsLocked();
  562. if( ! bAnimationLocked )
  563. {
  564. AnimationClient_CacheGeneratorLock();
  565.   AnimationClient_CacheNextStateMinInfo(
  566. false,
  567. ( bButtonUpHoveredNext || bButtonDownHoveredNext )
  568. ? __EAPT_BY_HOVERED_STATE_TURNED_ON : __EAPT_BY_HOVERED_STATE_TURNED_OFF
  569. );
  570. }
  571. m_bButtonUpHovered = bButtonUpHoveredNext;
  572. m_bButtonDownHovered = bButtonDownHoveredNext;
  573. if( ! bAnimationLocked )
  574. {
  575.   AnimationClient_CacheNextStateMinInfo(
  576. true,
  577. ( bButtonUpHoveredNext || bButtonDownHoveredNext )
  578. ? __EAPT_BY_HOVERED_STATE_TURNED_ON : __EAPT_BY_HOVERED_STATE_TURNED_OFF
  579. );
  580. AnimationClient_CacheGeneratorUnlock();
  581. }
  582. Invalidate();
  583. }
  584. return true;
  585. }
  586. void CExtSpinWnd::OnNcCalcSize( BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp ) 
  587. {
  588. bCalcValidRects;
  589. CRect & rcNcRect = reinterpret_cast < CRect & > ( lpncsp->rgrc[0] );
  590. if( _IsBuddyToEdit() )
  591. {
  592. DWORD dwStyle = GetStyle();
  593. bool bSpinAlignRight = ( (dwStyle&UDS_ALIGNRIGHT) != 0 ) ? true : false;
  594. bool bSpinAlignLeft = ( (dwStyle&UDS_ALIGNLEFT) != 0 ) ? true : false;
  595. bool bHasScrolBars = false;
  596. CWnd * pWnd = this->GetWindow( GW_HWNDPREV );
  597. if( pWnd != NULL )
  598. {
  599. ASSERT_VALID( pWnd );
  600. DWORD dwStyle = pWnd->GetStyle();
  601. if( (dwStyle&WS_VSCROLL) != 0
  602. || (dwStyle&WS_HSCROLL) != 0
  603. )
  604. bHasScrolBars = true;
  605. }
  606. CRect rcNcAreaMargins = 
  607. PmBridge_GetPM()->Spin_QueryNcAreaMargins(
  608. bSpinAlignRight,
  609. bSpinAlignLeft,
  610. bHasScrolBars
  611. );
  612.   rcNcRect.DeflateRect( rcNcAreaMargins );
  613. __EXT_MFC_LONG_PTR dwExStyle = ::__EXT_MFC_GetWindowLong( GetSafeHwnd(), GWL_EXSTYLE );
  614. bool bRTL = ( (dwExStyle & WS_EX_LAYOUTRTL) != 0 ) ? true : false;
  615. if( bRTL )
  616. rcNcRect.OffsetRect( 3, 0 );
  617. }
  618. m_bNcCalcSize = true;
  619. }
  620. void CExtSpinWnd::OnNcPaint() 
  621. {
  622. if( _IsBuddyToEdit() )
  623. {
  624. CWnd * pWnd = this->GetWindow( GW_HWNDPREV );
  625. if( pWnd != NULL )
  626. {
  627. ASSERT_VALID( pWnd );
  628. pWnd->SendMessage( WM_NCPAINT );
  629. }
  630. }
  631. }
  632. void CExtSpinWnd::OnSize(UINT nType, int cx, int cy) 
  633. {
  634. AnimationSite_ClientProgressStop( this );
  635. AnimationClient_StateGet( false ).Empty();
  636. AnimationClient_StateGet( true ).Empty();
  637. CRect rectButton;
  638. GetClientRect( &rectButton );
  639. AnimationClient_TargetRectSet( rectButton );
  640. CSpinButtonCtrl::OnSize( nType, cx, cy );
  641. }
  642. void CExtSpinWnd::PmBridge_OnPaintManagerChanged(
  643. CExtPaintManager * pGlobalPM
  644. )
  645. {
  646. m_bNcCalcSize = false;
  647. if( GetSafeHwnd() != NULL )
  648. SetWindowPos(
  649. NULL, 0, 0, 0, 0,
  650. SWP_NOMOVE|SWP_NOSIZE 
  651. |SWP_NOZORDER|SWP_NOOWNERZORDER|SWP_FRAMECHANGED
  652. );
  653. CExtAnimationSingleton::PmBridge_OnPaintManagerChanged( pGlobalPM );
  654. }
  655. HWND CExtSpinWnd::AnimationSite_GetSafeHWND() const
  656. {
  657. __PROF_UIS_MANAGE_STATE;
  658. HWND hWnd = GetSafeHwnd();
  659. return hWnd;
  660. }
  661. const CExtAnimationParameters *
  662. CExtSpinWnd::AnimationClient_OnQueryAnimationParameters(
  663. INT eAPT // __EAPT_*** animation type
  664. ) const
  665. {
  666. ASSERT_VALID( this );
  667. const CExtAnimationParameters * pAnimationParameters =
  668. PmBridge_GetPM()->Animation_GetParameters(
  669. eAPT,
  670. (CObject*)this,
  671. this
  672. );
  673. return pAnimationParameters;
  674. }
  675. bool CExtSpinWnd::AnimationClient_CacheNextState(
  676. CDC & dc,
  677. const RECT & rcAcAnimationTarget,
  678. bool bAnimate,
  679. INT eAPT // __EAPT_*** animation type
  680. )
  681. {
  682. ASSERT_VALID( this );
  683. ASSERT_VALID( (&dc) );
  684. ASSERT( dc.GetSafeHdc() != NULL );
  685. ASSERT( AnimationClient_CacheGeneratorIsLocked() );
  686. OnSpinDrawEntire( dc, &rcAcAnimationTarget );
  687. return
  688. CExtAnimationSingleton::AnimationClient_CacheNextState(
  689. dc,
  690. rcAcAnimationTarget,
  691. bAnimate,
  692. eAPT
  693. );
  694. }
  695. #endif // (!defined __EXT_MFC_NO_SPIN)