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

界面编程

开发平台:

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_SCROLLWND_H)
  23. #include <ExtScrollWnd.h>
  24. #endif 
  25. #if (!defined __AFXPRIV_H__)
  26. #include <AfxPriv.h>
  27. #endif 
  28. #if (!defined __EXT_TOOLCONTROLBAR_H)
  29. #include <ExtToolControlBar.h>
  30. #endif
  31. #if (!defined __EXT_POPUP_MENU_WND_H)
  32. #include <ExtPopupMenuWnd.h>
  33. #endif
  34. #if (!defined __EXT_PAINT_MANAGER_H)
  35. #include <ExtPaintManager.h>
  36. #endif
  37. #if (!defined __EXT_MEMORY_DC_H)
  38. #include <../src/ExtMemoryDC.h>
  39. #endif
  40. #if _MFC_VER < 0x700
  41. #include <../src/AfxImpl.h>
  42. #else
  43. #ifndef __AFXSTATE_H__
  44. #include <../src/mfc/afxstat_.h>
  45. #endif
  46. #include <../src/mfc/AfxImpl.h>
  47. #endif
  48. #if (!defined __EXT_LOCALIZATION_H)
  49. #include <../Src/ExtLocalization.h>
  50. #endif
  51. #if (!defined __EXT_STATUSCONTROLBAR_H)
  52. #include <ExtStatusControlBar.h>
  53. #endif
  54. #include <Resources/Resource.h>
  55. #ifdef _DEBUG
  56. #define new DEBUG_NEW
  57. #undef THIS_FILE
  58. static char THIS_FILE[] = __FILE__;
  59. #endif
  60. /////////////////////////////////////////////////////////////////////////////
  61. // CExtScrollBar
  62. IMPLEMENT_DYNCREATE( CExtScrollBar, CScrollBar );
  63. CExtScrollBar::CExtScrollBar()
  64. : m_bAutoDeleteOnPostNcDestroy( false )
  65. , m_bReflectParentSizing( true )
  66. , m_eSO( CExtScrollBar::__ESO_AUTO )
  67. , m_bDisableAutoReserveSpace( false )
  68. , m_bAutoReserveSpaceBefore( false )
  69. , m_bAutoReserveSpaceAfter( false )
  70. , m_bSmoothPainting( true )
  71. , m_hWndBefore( NULL )
  72. , m_hWndAfter( NULL )
  73. , m_bHideHwndBefore( false )
  74. , m_bHideHwndAfter( false )
  75. , m_bCompleteRepaint( true )
  76. , m_nHorzBarHeight( 0 )
  77. , m_nVertBarWidth( 0 )
  78. , m_nHorzButtonWidth( 0 )
  79. , m_nVertButtonHeight( 0 )
  80. , m_nHorzThumbMinWidth( 0 )
  81. , m_nVertThumbMinHeight( 0 )
  82. , m_bProcessingClick( false )
  83. , m_bProcessingOutClick( false )
  84. , m_bProcessingHover( false )
  85. , m_bProcessingCancelMode( false )
  86. , m_nSBMHT( INT(CExtPaintManager::__ESBMHT_NOWHERE) )
  87. , m_nHelperTrackPos( -1 )
  88. , m_bHelperHaveTrackPos( false )
  89. , m_bHelperLightAccent( true )
  90. , m_bEnabledToolTips( false )
  91. , m_bEnabledTrackingToolTips( false )
  92. , m_bEnableHookSpy( false )
  93. , m_bHookCapturedState( false )
  94. , m_nMouseActivateCode( MA_ACTIVATE )
  95. , m_bSendActionNotifications( true )
  96. , m_bPopupInactiveLightMode( false )
  97. , m_nStepSize( 1 )
  98. , m_bAlwaysSendThumbButtonNotifications( false )
  99. , m_bSendEqualNotifications( false )
  100. , m_ptCtxMenuCache( 0, 0 )
  101. , m_bEnableCtxMenu( false )
  102. {
  103. m_bHookConvertLocationsToClient = true;
  104. if( ! g_PaintManager.m_bIsWinNT4orLater )
  105. m_bCompleteRepaint = false;
  106. /*
  107. ::memset( &m_scrollInfo, 0, sizeof(SCROLLINFO) );
  108. m_scrollInfo.cbSize = sizeof(SCROLLINFO);
  109. m_scrollInfo.fMask = SIF_ALL;
  110. */
  111. }
  112. CExtScrollBar::~CExtScrollBar()
  113. {
  114. CExtAnimationSite * pAcAS = AnimationClient_SiteGet();
  115. if( pAcAS != NULL )
  116. pAcAS->AnimationSite_ClientRemove( this );
  117. }
  118. INT CExtScrollBar::GetStepSize() const
  119. {
  120. ASSERT_VALID( this );
  121. return m_nStepSize;
  122. }
  123. BEGIN_MESSAGE_MAP(CExtScrollBar, CScrollBar)
  124. //{{AFX_MSG_MAP(CExtScrollBar)
  125. ON_WM_ERASEBKGND()
  126. ON_WM_PAINT()
  127. ON_WM_WINDOWPOSCHANGING()
  128. ON_WM_WINDOWPOSCHANGED()
  129. ON_WM_SIZE()
  130. ON_WM_NCCALCSIZE()
  131. ON_WM_CONTEXTMENU()
  132. ON_WM_MOUSEACTIVATE()
  133. ON_WM_SHOWWINDOW()
  134. ON_WM_ENABLE()
  135. ON_WM_CANCELMODE()
  136. ON_WM_CAPTURECHANGED()
  137. ON_WM_SETCURSOR()
  138. ON_WM_MOUSEMOVE()
  139. ON_WM_LBUTTONDOWN()
  140. ON_WM_LBUTTONUP()
  141. ON_WM_LBUTTONDBLCLK()
  142. ON_WM_MBUTTONDOWN()
  143. ON_WM_MBUTTONUP()
  144. ON_WM_MBUTTONDBLCLK()
  145. ON_WM_RBUTTONDOWN()
  146. ON_WM_RBUTTONUP()
  147. ON_WM_RBUTTONDBLCLK()
  148. //}}AFX_MSG_MAP
  149. __EXT_MFC_ON_WM_NCHITTEST()
  150. ON_WM_TIMER()
  151. __EXT_MFC_SAFE_ON_WM_SETTINGCHANGE()
  152. ON_MESSAGE( WM_SIZEPARENT, OnSizeParent )
  153. ON_COMMAND( __EXT_ID_SCROLL_HERE, OnScrollHere )
  154. ON_COMMAND( __EXT_ID_SCROLL_EDGE_LOWER, OnScrollEdgeLower )
  155. ON_COMMAND( __EXT_ID_SCROLL_EDGE_UPPER, OnScrollEdgeUpper )
  156. ON_COMMAND( __EXT_ID_SCROLL_PAGE_LOWER, OnScrollPageLower )
  157. ON_COMMAND( __EXT_ID_SCROLL_PAGE_UPPER, OnScrollPageUpper )
  158. ON_COMMAND( __EXT_ID_SCROLL_LINE_LOWER, OnScrollLineLower )
  159. ON_COMMAND( __EXT_ID_SCROLL_LINE_UPPER, OnScrollLineUpper )
  160. END_MESSAGE_MAP()
  161. bool CExtScrollBar::AnimationClient_EnabledGet() const
  162. {
  163. ASSERT_VALID( this );
  164. if( ! m_bCompleteRepaint )
  165. return false;
  166. return CExtAnimationSingleton::AnimationClient_EnabledGet();
  167. }
  168. bool CExtScrollBar::AnimationSite_EnabledGet() const
  169. {
  170. ASSERT_VALID( this );
  171. if( ! m_bCompleteRepaint )
  172. return false;
  173. return CExtAnimationSingleton::AnimationSite_EnabledGet();
  174. }
  175. void CExtScrollBar::AnimationSite_OnProgressShutdownTimer( UINT nTimerID )
  176. {
  177. ASSERT_VALID( this );
  178. CExtAnimationSingleton::AnimationSite_OnProgressShutdownTimer( nTimerID );
  179. //  AnimationClient_StateGet( false ).Empty();
  180. //  AnimationClient_StateGet( true ).Empty();
  181. }
  182. HWND CExtScrollBar::AnimationSite_GetSafeHWND() const
  183. {
  184. __PROF_UIS_MANAGE_STATE;
  185. HWND hWnd = GetSafeHwnd();
  186. return hWnd;
  187. }
  188. const CExtAnimationParameters *
  189. CExtScrollBar::AnimationClient_OnQueryAnimationParameters(
  190. INT eAPT // __EAPT_*** animation type
  191. ) const
  192. {
  193. ASSERT_VALID( this );
  194. //return (&PmBridge_GetPM()->g_DefAnimationParametersVerySlow);
  195. const CExtAnimationParameters * pAnimationParameters =
  196. PmBridge_GetPM()->Animation_GetParameters(
  197. eAPT,
  198. (CObject*)this,
  199. this
  200. );
  201. return pAnimationParameters;
  202. }
  203. bool CExtScrollBar::AnimationClient_CacheNextState(
  204. CDC & dc,
  205. const RECT & rcAcAnimationTarget,
  206. bool bAnimate,
  207. INT eAPT // __EAPT_*** animation type
  208. )
  209. {
  210. ASSERT_VALID( this );
  211. ASSERT_VALID( (&dc) );
  212. ASSERT( dc.GetSafeHdc() != NULL );
  213. ASSERT( AnimationClient_CacheGeneratorIsLocked() );
  214. OnSbPaint( dc );
  215. return
  216. CExtAnimationSingleton::AnimationClient_CacheNextState(
  217. dc,
  218. rcAcAnimationTarget,
  219. bAnimate,
  220. eAPT
  221. );
  222. }
  223. void CExtScrollBar::PmBridge_OnPaintManagerChanged(
  224. CExtPaintManager * pGlobalPM
  225. )
  226. {
  227. ASSERT_VALID( this );
  228. CExtAnimationSingleton::PmBridge_OnPaintManagerChanged( pGlobalPM );
  229. if( m_bCompleteRepaint )
  230. {
  231. _ScanSysMertics();
  232. if( GetSafeHwnd() != NULL )
  233. {
  234. SetWindowPos(
  235. NULL, 0, 0, 0, 0,
  236. SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER
  237. |SWP_NOACTIVATE|SWP_FRAMECHANGED
  238. );
  239. Invalidate();
  240. }
  241. } // if( m_bCompleteRepaint )
  242. }
  243. void CExtScrollBar::_ScanSysMertics()
  244. {
  245. ASSERT_VALID( this );
  246. bool bGetDefaultMetrics = true;
  247. if( m_bCompleteRepaint )
  248. {
  249. if( PmBridge_GetPM()->ScrollBar_GetMetrics(
  250. &m_nHorzBarHeight,
  251. &m_nVertBarWidth,
  252. &m_nHorzButtonWidth,
  253. &m_nVertButtonHeight,
  254. &m_nHorzThumbMinWidth,
  255. &m_nVertThumbMinHeight,
  256. this
  257. )
  258. )
  259. bGetDefaultMetrics = false;
  260. } // if( m_bCompleteRepaint )
  261. if( bGetDefaultMetrics )
  262. {
  263. m_nHorzBarHeight   = ::GetSystemMetrics( SM_CYHSCROLL );
  264. m_nVertBarWidth   = ::GetSystemMetrics( SM_CXVSCROLL );
  265. m_nHorzButtonWidth    = ::GetSystemMetrics( SM_CXHSCROLL );
  266. m_nVertButtonHeight   = ::GetSystemMetrics( SM_CYVSCROLL );
  267. m_nHorzThumbMinWidth  = 9; // ::GetSystemMetrics( SM_CXHTHUMB );
  268. m_nVertThumbMinHeight = 9; // ::GetSystemMetrics( SM_CYVTHUMB );
  269. } // if( bGetDefaultMetrics )
  270. }
  271. void CExtScrollBar::SyncReservedSpace( CExtScrollBar * pOtherBar )
  272. {
  273. ASSERT_VALID( this );
  274. ASSERT_VALID( pOtherBar );
  275. ASSERT( this != pOtherBar );
  276. CWnd * pWndNext = GetWindow( GW_HWNDNEXT );
  277. if( pWndNext != pOtherBar )
  278. return;
  279. m_bAutoReserveSpaceBefore = m_bAutoReserveSpaceAfter = false;
  280. pOtherBar->m_bAutoReserveSpaceBefore = pOtherBar->m_bAutoReserveSpaceAfter = false;
  281. if( m_bDisableAutoReserveSpace )
  282. return;
  283. if( (GetStyle()&WS_VISIBLE) == 0 || (pOtherBar->GetStyle()&WS_VISIBLE) == 0 )
  284. return;
  285. eScrollerOrientation_t _eSOown = GetScrollerOrientation();
  286. eScrollerOrientation_t _eSOother = pOtherBar->GetScrollerOrientation();
  287. switch( _eSOown )
  288. {
  289. case __ESO_TOP:
  290. case __ESO_BOTTOM:
  291. switch( _eSOother )
  292. {
  293. case __ESO_LEFT:
  294. m_bAutoReserveSpaceBefore = true;
  295. break;
  296. case __ESO_RIGHT:
  297. m_bAutoReserveSpaceAfter = true;
  298. break;
  299. case __ESO_TOP:
  300. case __ESO_BOTTOM:
  301. case __ESO_NONE:
  302. return;
  303. #ifdef _DEBUG
  304. default:
  305. ASSERT( FALSE );
  306. return;
  307. #endif // _DEBUG
  308. } // switch( _eSOother )
  309. break;
  310. case __ESO_LEFT:
  311. case __ESO_RIGHT:
  312. switch( _eSOother )
  313. {
  314. case __ESO_TOP:
  315. m_bAutoReserveSpaceBefore = true;
  316. break;
  317. case __ESO_BOTTOM:
  318. m_bAutoReserveSpaceAfter = true;
  319. break;
  320. case __ESO_LEFT:
  321. case __ESO_RIGHT:
  322. case __ESO_NONE:
  323. return;
  324. #ifdef _DEBUG
  325. default:
  326. ASSERT( FALSE );
  327. return;
  328. #endif // _DEBUG
  329. } // switch( _eSOother )
  330. break;
  331. case __ESO_NONE:
  332. return;
  333. #ifdef _DEBUG
  334. default:
  335. ASSERT( FALSE );
  336. return;
  337. #endif // _DEBUG
  338. } // switch( _eSOown )
  339. }
  340. CExtScrollBar::eScrollerOrientation_t
  341. CExtScrollBar::GetScrollerOrientation() const
  342. {
  343. ASSERT_VALID( this );
  344. ASSERT( __ESO_MIN_VALUE <= m_eSO && m_eSO <= __ESO_MAX_VALUE );
  345. eScrollerOrientation_t _eSO = m_eSO;
  346. if( _eSO == __ESO_AUTO )
  347. {
  348. DWORD dwWndStyle = CWnd::GetStyle();
  349. if( ( dwWndStyle & (SBS_TOPALIGN|SBS_VERT) ) == (SBS_TOPALIGN) )
  350. _eSO = __ESO_TOP;
  351. else if( ( dwWndStyle & (SBS_BOTTOMALIGN|SBS_VERT) ) == (SBS_BOTTOMALIGN) )
  352. _eSO = __ESO_BOTTOM;
  353. else if( ( dwWndStyle & (SBS_LEFTALIGN|SBS_VERT) ) == (SBS_LEFTALIGN|SBS_VERT) )
  354. _eSO = __ESO_LEFT;
  355. else if( ( dwWndStyle & (SBS_RIGHTALIGN|SBS_VERT) ) == (SBS_RIGHTALIGN|SBS_VERT) )
  356. _eSO = __ESO_RIGHT;
  357. else if( ( dwWndStyle & SBS_VERT ) != 0 )
  358. _eSO = __ESO_RIGHT;
  359. else
  360. _eSO = __ESO_BOTTOM;
  361. // _eSO = __ESO_NONE;
  362. } // if( _eSO == __ESO_AUTO )
  363. return _eSO;
  364. }
  365. void CExtScrollBar::PreSubclassWindow()
  366. {
  367. m_bProcessingClick
  368. = m_bProcessingOutClick
  369. = m_bProcessingHover
  370. = m_bProcessingCancelMode
  371. = m_bHelperHaveTrackPos
  372. = false;
  373. m_nHelperTrackPos = -1;
  374. m_nSBMHT = INT(CExtPaintManager::__ESBMHT_NOWHERE);
  375. CScrollBar::PreSubclassWindow();
  376. if( ( ! IsKindOf( RUNTIME_CLASS(CExtZoomScrollBar) ) )
  377. && ( (GetExStyle()&WS_EX_LAYOUTRTL) != 0 )
  378. )
  379. ModifyStyleEx( WS_EX_LAYOUTRTL, 0, SWP_FRAMECHANGED );
  380. _ScanSysMertics();
  381. AnimationSite_ClientProgressStop( this );
  382. AnimationClient_StateGet( false ).Empty();
  383. AnimationClient_StateGet( true ).Empty();
  384. CRect rcClient;
  385. GetClientRect( &rcClient );
  386. AnimationClient_TargetRectSet( rcClient );
  387. if( m_bEnableHookSpy )
  388. HookSpyRegister( __EHSEF_MOUSE_ALL_WITHOUT_WHEEL|__EHSEF_WND_PROC_IN|__EHSEF_PRE_TRANSLATION );
  389. }
  390. LRESULT CExtScrollBar::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  391. {
  392. LRESULT lResult =
  393. CScrollBar::DefWindowProc( message, wParam, lParam );
  394. return lResult;
  395. }
  396. LRESULT CExtScrollBar::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  397. {
  398. if( message == WM_PRINT || message == WM_PRINTCLIENT )
  399. {
  400. CDC * pDC = CDC::FromHandle( (HDC)wParam );
  401. if( m_bCompleteRepaint )
  402. OnSbPaint( *pDC );
  403. else
  404. DefWindowProc( WM_PAINT, (WPARAM)pDC->GetSafeHdc(), 0L );
  405. return (!0);
  406. }
  407. bool bUnLockRedraw = false;
  408. HWND hWndOwn = m_hWnd;
  409. if( hWndOwn != NULL
  410. && ::IsWindow( hWndOwn )
  411. && m_bCompleteRepaint
  412. && _IsLockAbleMessage( message )
  413. && (GetStyle()&WS_VISIBLE) != 0
  414. )
  415. {
  416. bUnLockRedraw = true;
  417. ::SendMessage( hWndOwn, WM_SETREDRAW, FALSE, 0 );
  418. }
  419. LRESULT lResult = CScrollBar::WindowProc( message, wParam, lParam );
  420. if( message == SBM_GETSCROLLINFO
  421. && m_bCompleteRepaint
  422. && lResult != 0L
  423. )
  424. {
  425. SCROLLINFO * pSI = (SCROLLINFO *)lParam;
  426. if( pSI != NULL
  427. && pSI->cbSize == sizeof(SCROLLINFO)
  428. && ( ( pSI->fMask & SIF_TRACKPOS ) != 0 )
  429. && m_bHelperHaveTrackPos // && m_nHelperTrackPos != -1
  430. )
  431. pSI->nTrackPos = m_nHelperTrackPos;
  432. }
  433. /*
  434. //if( m_bCompleteRepaint )
  435. {
  436. switch( message )
  437. {
  438. case SBM_GETPOS:
  439. lResult = LRESULT(m_scrollInfo.nPos);
  440. break;
  441. case SBM_SETPOS:
  442. m_scrollInfo.nPos = INT(wParam);
  443. m_scrollInfo.nPos = max( m_scrollInfo.nPos, m_scrollInfo.nMin );
  444. m_scrollInfo.nPos = min( m_scrollInfo.nPos, m_scrollInfo.nMax );
  445. lResult = LRESULT(m_scrollInfo.nPos);
  446. if( lParam != 0 )
  447. Invalidate();
  448. break;
  449. case SBM_GETRANGE:
  450. {
  451. LPINT pMin = (LPINT)wParam;
  452. LPINT pMax = (LPINT)lParam;
  453. if( pMin != NULL )
  454. (*pMin) = m_scrollInfo.nMin;
  455. if( pMax != NULL )
  456. (*pMax) = m_scrollInfo.nMax;
  457. }
  458. break;
  459. case SBM_SETRANGEREDRAW:
  460. Invalidate();
  461. // continue falling
  462. case SBM_SETRANGE:
  463. m_scrollInfo.nMin = INT(wParam);
  464. m_scrollInfo.nMax = INT(lParam);
  465. m_scrollInfo.nMax = max( m_scrollInfo.nMax, m_scrollInfo.nMin );
  466. m_scrollInfo.nTrackPos = max( m_scrollInfo.nTrackPos, m_scrollInfo.nMin );
  467. m_scrollInfo.nTrackPos = min( m_scrollInfo.nTrackPos, m_scrollInfo.nMax );
  468. m_scrollInfo.nPos = max( m_scrollInfo.nPos, m_scrollInfo.nMin );
  469. m_scrollInfo.nPos = min( m_scrollInfo.nPos, m_scrollInfo.nMax );
  470. lResult = LRESULT(m_scrollInfo.nPos);
  471. break;
  472. //case SBM_ENABLE_ARROWS:
  473. //break;
  474. case SBM_GETSCROLLINFO:
  475. {
  476. lResult = 0;
  477. SCROLLINFO * pSI = (SCROLLINFO*)lParam;
  478. if( pSI != NULL && pSI->cbSize >= sizeof(SCROLLINFO) )
  479. {
  480. if( ( pSI->fMask & SIF_POS ) != 0 )
  481. {
  482. lResult = 1;
  483. pSI->nPos = m_scrollInfo.nPos;
  484. }
  485. if( ( pSI->fMask & SIF_TRACKPOS ) != 0 )
  486. {
  487. lResult = 1;
  488. pSI->nTrackPos = m_scrollInfo.nTrackPos;
  489. }
  490. if( ( pSI->fMask & SIF_PAGE ) != 0 )
  491. {
  492. lResult = 1;
  493. pSI->nPage = m_scrollInfo.nPage;
  494. }
  495. if( ( pSI->fMask & SIF_RANGE ) != 0 )
  496. {
  497. lResult = 1;
  498. pSI->nMin = m_scrollInfo.nMin;
  499. pSI->nMax = m_scrollInfo.nMax;
  500. }
  501. }
  502. }
  503. break;
  504. case SBM_SETSCROLLINFO:
  505. {
  506. SCROLLINFO * pSI = (SCROLLINFO*)lParam;
  507. if( pSI != NULL && pSI->cbSize >= sizeof(SCROLLINFO) )
  508. {
  509. if( ( pSI->fMask & SIF_POS ) != 0 )
  510. m_scrollInfo.nPos = pSI->nPos;
  511. if( ( pSI->fMask & SIF_TRACKPOS ) != 0 )
  512. m_scrollInfo.nTrackPos = pSI->nTrackPos;
  513. if( ( pSI->fMask & SIF_PAGE ) != 0 )
  514. m_scrollInfo.nPage = pSI->nPage;
  515. if( ( pSI->fMask & SIF_RANGE ) != 0 )
  516. {
  517. m_scrollInfo.nMin = pSI->nMin;
  518. m_scrollInfo.nMax = pSI->nMax;
  519. }
  520. }
  521. m_scrollInfo.nMax = max( m_scrollInfo.nMax, m_scrollInfo.nMin );
  522. m_scrollInfo.nTrackPos = max( m_scrollInfo.nTrackPos, m_scrollInfo.nMin );
  523. m_scrollInfo.nTrackPos = min( m_scrollInfo.nTrackPos, m_scrollInfo.nMax );
  524. m_scrollInfo.nPos = max( m_scrollInfo.nPos, m_scrollInfo.nMin );
  525. m_scrollInfo.nPos = min( m_scrollInfo.nPos, m_scrollInfo.nMax );
  526. lResult = LRESULT(m_scrollInfo.nPos);
  527. if( wParam != 0 )
  528. Invalidate();
  529. }
  530. break;
  531. } // switch( message )
  532. }
  533. */
  534. if( hWndOwn != NULL
  535. && ::IsWindow( hWndOwn )
  536. && bUnLockRedraw
  537. )
  538. {
  539. CWnd * pWnd = CWnd::FromHandlePermanent( hWndOwn );
  540. if( pWnd == this )
  541. {
  542. ::SendMessage( hWndOwn, WM_SETREDRAW, TRUE, 0 );
  543. if( (GetStyle()&WS_VISIBLE) != 0 )
  544. {
  545. Invalidate();
  546. if( ScrollBar_CaptureGet() == m_hWnd )
  547. UpdateWindow();
  548. }
  549. }
  550. }
  551. return lResult;
  552. }
  553. bool CExtScrollBar::_IsLockAbleMessage( UINT message ) const
  554. {
  555. if( ! m_bCompleteRepaint )
  556. return false;
  557. switch( message )
  558. {
  559. case SBM_SETPOS:
  560. case SBM_SETRANGE:
  561. case SBM_SETRANGEREDRAW:
  562. case SBM_SETSCROLLINFO:
  563. case SBM_ENABLE_ARROWS:
  564. return true;
  565. } // switch( message )
  566. return false;
  567. }
  568. INT CExtScrollBar::_GetScrollPos(
  569. bool bTrackPos // = false
  570. ) const
  571. {
  572. ASSERT_VALID( this );
  573. ASSERT( GetSafeHwnd() != NULL );
  574. SCROLLINFO _scroll_info;
  575. ::memset( &_scroll_info, 0, sizeof(SCROLLINFO) );
  576. _scroll_info.cbSize = sizeof(SCROLLINFO);
  577. CScrollBar * pSB = ( CScrollBar * )this;
  578. if( pSB->GetScrollInfo(
  579. &_scroll_info,
  580. bTrackPos ? SIF_TRACKPOS : SIF_POS
  581. )
  582. )
  583. {
  584. LONG nRetVal = (LONG)
  585. ( bTrackPos
  586. ? _scroll_info.nTrackPos
  587. : _scroll_info.nPos
  588. );
  589. return nRetVal;
  590. }
  591. return CScrollBar::GetScrollPos();
  592. }
  593. void CExtScrollBar::_SetScrollPos(
  594. INT nPos,
  595. bool bTrackPos, // = false
  596. bool bRedraw, // = true
  597. bool bSendScrollingNotification // = true
  598. )
  599. {
  600. ASSERT_VALID( this );
  601. ASSERT( GetSafeHwnd() != NULL );
  602. AnimationSite_ClientProgressStop( this );
  603. AnimationClient_StateGet( false ).Empty();
  604. AnimationClient_StateGet( true ).Empty();
  605. CExtPaintManager::PAINTSCROLLBARDATA _psbd( this );
  606. SCROLLINFO _scroll_info;
  607. ::memset( &_scroll_info, 0, sizeof(SCROLLINFO) );
  608. _scroll_info.cbSize = sizeof(SCROLLINFO);
  609. if( bTrackPos )
  610. {
  611. _scroll_info.fMask = SIF_TRACKPOS;
  612. _scroll_info.nTrackPos = (int)nPos;
  613. }
  614. else
  615. {
  616. _scroll_info.fMask = SIF_POS;
  617. _scroll_info.nPos = (int)nPos;
  618. }
  619. m_nHelperTrackPos = (int)nPos;
  620. if( ! CScrollBar::SetScrollInfo(
  621. &_scroll_info,
  622. bRedraw ? TRUE : FALSE
  623. )
  624. )
  625. CScrollBar::SetScrollPos( nPos, bRedraw ? TRUE : FALSE );
  626. else
  627. bRedraw = false;
  628. if( bSendScrollingNotification
  629. && _psbd.m_bEnabled
  630. && ( m_nSBMHT == CExtPaintManager::__ESBMHT_THUMB
  631. || m_bAlwaysSendThumbButtonNotifications
  632. )
  633. )
  634. {
  635. HWND hWndParent = ::GetParent( m_hWnd );
  636. if( hWndParent != NULL )
  637. {
  638. ::SendMessage(
  639. hWndParent,
  640. _psbd.m_bHorzBar ? WM_HSCROLL : WM_VSCROLL,
  641. MAKEWPARAM(
  642. ( bTrackPos ? SB_THUMBTRACK : SB_THUMBPOSITION ),
  643. nPos
  644. ),
  645. LPARAM(m_hWnd)
  646. );
  647. }
  648. }
  649. if( bRedraw )
  650. {
  651. Invalidate();
  652. if( ScrollBar_CaptureGet() == m_hWnd )
  653. UpdateWindow();
  654. }
  655. }
  656. CExtNCSB_ScrollContainer * CExtScrollBar::_GetParentScrollContainer()
  657. {
  658. if( GetSafeHwnd() == NULL )
  659. return NULL;
  660. ASSERT_VALID( this );
  661. HWND hWndParent = ::GetParent( m_hWnd );
  662. if( hWndParent == NULL )
  663. return NULL;
  664. CWnd * pWndParent = CWnd::FromHandlePermanent( hWndParent );
  665. if( pWndParent == NULL )
  666. return NULL;
  667. CExtNCSB_ScrollContainer * pScrollContainer = DYNAMIC_DOWNCAST( CExtNCSB_ScrollContainer, pWndParent );
  668. return pScrollContainer;
  669. }
  670. CExtPopupMenuTipWnd * CExtScrollBar::OnAdvancedPopupMenuTipWndGet() const
  671. {
  672. if( ! m_bEnabledToolTips )
  673. return NULL;
  674. return (&( CExtPopupMenuSite::g_DefPopupMenuSite.GetTip() ));
  675. }
  676. bool CExtScrollBar::OnAdvancedPopupMenuTipWndGetInfo(
  677. CExtPopupMenuTipWnd & _ATTW,
  678. INT nSBMHT,
  679. bool bTrackingTip,
  680. CRect & rcExcludeArea,
  681. CExtSafeString & strTipText
  682. ) const
  683. {
  684. ASSERT_VALID( this );
  685. _ATTW;
  686. strTipText.Empty();
  687. if( ( ! m_bEnabledToolTips )
  688. || ( bTrackingTip && ( ! m_bEnabledTrackingToolTips ) )
  689. )
  690. return false;
  691. CExtPaintManager::PAINTSCROLLBARDATA _psbd(
  692. const_cast < CExtScrollBar * > ( this ),
  693. bTrackingTip,
  694. CExtPaintManager::e_scroll_bar_mouse_hover_type_t(nSBMHT)
  695. );
  696. switch( nSBMHT )
  697. {
  698. case INT(CExtPaintManager::__ESBMHT_BUTTON_UP):
  699. rcExcludeArea = _psbd.m_rcButtonUp;
  700. strTipText = m_strTipTextForUpButton;
  701. break;
  702. case INT(CExtPaintManager::__ESBMHT_BUTTON_DOWN):
  703. rcExcludeArea = _psbd.m_rcButtonDown;
  704. strTipText = m_strTipTextForDownButton;
  705. break;
  706. case INT(CExtPaintManager::__ESBMHT_THUMB):
  707. rcExcludeArea = _psbd.m_rcThumb;
  708. strTipText = m_strTipTextForThumbButton;
  709. break;
  710. case INT(CExtPaintManager::__ESBMHT_PAGE_UP):
  711. rcExcludeArea = _psbd.m_rcPageUp;
  712. strTipText = m_strTipTextForPageUpArea;
  713. break;
  714. case INT(CExtPaintManager::__ESBMHT_PAGE_DOWN):
  715. rcExcludeArea = _psbd.m_rcPageDown;
  716. strTipText = m_strTipTextForPageDownArea;
  717. break;
  718. default:
  719. return false;
  720. } // switch( nSBMHT )
  721. ClientToScreen( &rcExcludeArea );
  722. return true;
  723. }
  724. void CExtScrollBar::OnAdvancedPopupMenuTipWndDisplay(
  725. CExtPopupMenuTipWnd & _ATTW,
  726. INT nSBMHT,
  727. bool bTrackingTip
  728. ) const
  729. {
  730. ASSERT_VALID( this );
  731. if( ( ! m_bEnabledToolTips )
  732. || ( bTrackingTip && ( ! m_bEnabledTrackingToolTips ) )
  733. )
  734. {
  735. _ATTW.Hide();
  736. return;
  737. }
  738. CRect rcExcludeArea( 0, 0, 0, 0 );
  739. CExtSafeString strTipText;
  740. if( ! OnAdvancedPopupMenuTipWndGetInfo(
  741. _ATTW,
  742. nSBMHT,
  743. bTrackingTip,
  744. rcExcludeArea,
  745. strTipText
  746. )
  747. )
  748. {
  749. _ATTW.Hide();
  750. return;
  751. }
  752. if( strTipText.IsEmpty() )
  753. {
  754. _ATTW.Hide();
  755. return;
  756. }
  757. OnAdvancedPopupMenuTipWndDisplay(
  758. _ATTW,
  759. rcExcludeArea,
  760. LPCTSTR( strTipText ),
  761. bTrackingTip
  762. );
  763. }
  764. void CExtScrollBar::OnAdvancedPopupMenuTipWndDisplay(
  765. CExtPopupMenuTipWnd & _ATTW,
  766. const RECT & rcExcludeArea,
  767. __EXT_MFC_SAFE_LPCTSTR strTipText,
  768. bool bTrackingTip
  769. ) const
  770. {
  771. ASSERT_VALID( this );
  772. ASSERT( strTipText != NULL && _tcslen( strTipText ) > 0 );
  773. if( ( ! m_bEnabledToolTips )
  774. || ( bTrackingTip && ( ! m_bEnabledTrackingToolTips ) )
  775. )
  776. {
  777. _ATTW.Hide();
  778. return;
  779. }
  780. if( _ATTW.GetSafeHwnd() != NULL
  781. && (_ATTW.GetStyle()&WS_VISIBLE) != 0
  782. && _ATTW.GetExcludeArea() == rcExcludeArea
  783. )
  784. {
  785. LPCTSTR strTipTextOld = _ATTW.GetText();
  786. if( strTipTextOld != NULL
  787. && _tcscmp( strTipTextOld, strTipText ) == 0
  788. )
  789. return;
  790. }
  791. if( m_eSO == __ESO_BOTTOM )
  792. _ATTW.SetTipStyle( CExtPopupMenuTipWnd::__ETS_INV_RECTANGLE_NO_ICON );
  793. else
  794. _ATTW.SetTipStyle( CExtPopupMenuTipWnd::__ETS_RECTANGLE_NO_ICON );
  795. _ATTW.SetText( strTipText );
  796. _ATTW.Show( (CWnd*)this, rcExcludeArea, bTrackingTip );
  797. if( bTrackingTip )
  798. CExtPaintManager::stat_PassPaintMessages();
  799. }
  800. void CExtScrollBar::PostNcDestroy()
  801. {
  802. ASSERT_VALID( this );
  803. m_bProcessingClick
  804. = m_bProcessingOutClick
  805. = m_bProcessingHover
  806. = m_bProcessingCancelMode
  807. = m_bHelperHaveTrackPos
  808. = false;
  809. m_nHelperTrackPos = -1;
  810. m_nSBMHT = INT(CExtPaintManager::__ESBMHT_NOWHERE);
  811. if( m_bEnableHookSpy )
  812. HookSpyUnregister();
  813. if( m_bAutoDeleteOnPostNcDestroy )
  814. delete this;
  815. }
  816. BOOL CExtScrollBar::OnEraseBkgnd(CDC* pDC) 
  817. {
  818. if( (! m_bSmoothPainting ) && (! m_bCompleteRepaint ) )
  819. return CScrollBar::OnEraseBkgnd( pDC );
  820. return TRUE;
  821. }
  822. void CExtScrollBar::OnSbPaint( CDC & dc )
  823. {
  824. ASSERT_VALID( this );
  825. ASSERT( dc.GetSafeHdc() != NULL );
  826. CExtPaintManager::PAINTSCROLLBARDATA _psbd( this );
  827. _psbd.m_bHelperLightAccent = m_bHelperLightAccent;
  828. if( _psbd.m_bEnabled )
  829. {
  830. _psbd.m_eSBMHT =
  831. (CExtPaintManager::e_scroll_bar_mouse_hover_type_t)
  832. m_nSBMHT;
  833. _psbd.m_bHoveredAreaIsPressed
  834. = m_bProcessingClick && (! m_bProcessingOutClick );
  835. } // if( _psbd.m_bEnabled )
  836. PmBridge_GetPM()->ScrollBar_Paint( dc, _psbd );
  837. }
  838. void CExtScrollBar::OnPaint() 
  839. {
  840. if( (! m_bSmoothPainting ) && (! m_bCompleteRepaint ) )
  841. {
  842. CScrollBar::OnPaint();
  843. return;
  844. } // if( !m_bSmoothPainting )
  845. CRect rcClient;
  846. GetClientRect( &rcClient );
  847. CPaintDC dcPaint( this );
  848. CExtMemoryDC dc(
  849. &dcPaint,
  850. &rcClient
  851. );
  852. if( m_bCompleteRepaint )
  853. {
  854. if( AnimationClient_StatePaint( dc ) )
  855. return;
  856. OnSbPaint( dc );
  857. } // if( m_bCompleteRepaint )
  858. else
  859. DefWindowProc( WM_PAINT, (WPARAM)dc.GetSafeHdc(), 0L );
  860. }
  861. void CExtScrollBar::OnSettingChange(UINT uFlags, __EXT_MFC_SAFE_LPCTSTR lpszSection) 
  862. {
  863. ASSERT_VALID( this );
  864. CScrollBar::OnSettingChange(uFlags, lpszSection);
  865. _ScanSysMertics();
  866. }
  867. LRESULT CExtScrollBar::OnSizeParent( WPARAM wParam, LPARAM lParam )
  868. {
  869. ASSERT_VALID( this );
  870. if( ! m_bReflectParentSizing )
  871. return (LRESULT)0;
  872. wParam;
  873. DWORD dwWndStyle = CWnd::GetStyle();
  874. if( (dwWndStyle & WS_VISIBLE) == 0 )
  875. return 0;
  876. AFX_SIZEPARENTPARAMS * lpLayout = (AFX_SIZEPARENTPARAMS*)lParam;
  877. ASSERT( lpLayout != NULL );
  878. CRect rcOwnLayout( lpLayout->rect );
  879. eScrollerOrientation_t _eSO = GetScrollerOrientation();
  880. CSize _sizeNeeded( 0, 0 );
  881. CRect rcWndBeforeSrc( 0, 0, 0, 0 ),
  882. rcWndBeforeDst( 0, 0, 0, 0 ),
  883. rcWndAfterSrc( 0, 0, 0, 0 ),
  884. rcWndAfterDst( 0, 0, 0, 0 );
  885. bool bHwndBeforeVisible = false, bHwndAfterVisible = false,
  886. bForceHideBefore = false, bForceHideAfter = false;
  887. HWND hWndBefore = NULL, hWndAfter = NULL, hWndParent = NULL;
  888. if( lpLayout->hDWP != NULL )
  889. {
  890. if( m_hWndBefore != NULL
  891. && ::IsWindow( m_hWndBefore )
  892. )
  893. {
  894. bHwndBeforeVisible =
  895. ( ::__EXT_MFC_GetWindowLong( m_hWndBefore, GWL_STYLE ) & WS_VISIBLE )
  896. ? true : false;
  897. if( ! m_bHideHwndBefore )
  898. {
  899. ::GetWindowRect( m_hWndBefore, &rcWndBeforeSrc );
  900. if( hWndParent == NULL )
  901. {
  902. hWndParent = ::GetParent( m_hWnd );
  903. ASSERT( hWndParent != NULL && ::IsWindow(hWndParent) );
  904. ASSERT( hWndParent ==  ::GetParent( m_hWndBefore ) );
  905. } // if( hWndParent == NULL )
  906. ::ScreenToClient( m_hWndBefore, LPPOINT(&rcWndBeforeSrc) );
  907. ::ScreenToClient( m_hWndBefore, LPPOINT(&rcWndBeforeSrc) + 1 );
  908. __EXT_MFC_LONG_PTR dwExStyle = ::__EXT_MFC_GetWindowLong( m_hWndBefore, GWL_EXSTYLE );
  909. if( dwExStyle & WS_EX_LAYOUTRTL )
  910. __EXT_MFC_SwapLeftRight( rcWndBeforeSrc );
  911. rcWndBeforeDst = rcWndBeforeSrc;
  912. } // if( !m_bHideHwndBefore )
  913. hWndBefore = m_hWndBefore;
  914. }
  915. if( m_hWndAfter != NULL
  916. && ::IsWindow( m_hWndAfter )
  917. )
  918. {
  919. bHwndAfterVisible =
  920. ( ::__EXT_MFC_GetWindowLong( m_hWndAfter, GWL_STYLE ) & WS_VISIBLE )
  921. ? true : false;
  922. if( ! m_bHideHwndAfter )
  923. {
  924. ::GetWindowRect( m_hWndAfter, &rcWndAfterSrc );
  925. if( hWndParent == NULL )
  926. {
  927. hWndParent = ::GetParent( m_hWnd );
  928. ASSERT( hWndParent != NULL && ::IsWindow(hWndParent) );
  929. ASSERT( hWndParent ==  ::GetParent( m_hWndAfter ) );
  930. } // if( hWndParent == NULL )
  931. ::ScreenToClient( m_hWndAfter, LPPOINT(&rcWndAfterSrc) );
  932. ::ScreenToClient( m_hWndAfter, LPPOINT(&rcWndAfterSrc) + 1 );
  933. __EXT_MFC_LONG_PTR dwExStyle = ::__EXT_MFC_GetWindowLong( m_hWndAfter, GWL_EXSTYLE );
  934. if( dwExStyle & WS_EX_LAYOUTRTL )
  935. __EXT_MFC_SwapLeftRight( rcWndAfterSrc );
  936. rcWndAfterDst = rcWndAfterSrc;
  937. } // if( !m_bHideHwndAfter )
  938. hWndAfter = m_hWndAfter;
  939. }
  940. } // if( lpLayout->hDWP != NULL )
  941. int nMinExtent;
  942. switch( _eSO )
  943. {
  944. case __ESO_TOP:
  945. _sizeNeeded.cy = m_nHorzBarHeight;
  946. lpLayout->rect.top += _sizeNeeded.cy;
  947. rcOwnLayout.bottom = rcOwnLayout.top + _sizeNeeded.cy;
  948. lpLayout->sizeTotal.cy += _sizeNeeded.cy;
  949. if( m_bAutoReserveSpaceBefore )
  950. rcOwnLayout.left += m_nVertBarWidth;
  951. if( m_bAutoReserveSpaceAfter )
  952. rcOwnLayout.right -= m_nVertBarWidth;
  953. nMinExtent = ::GetSystemMetrics(SM_CXHSCROLL)*2;
  954. if( hWndAfter != NULL )
  955. {
  956. rcWndAfterDst.OffsetRect(
  957. rcOwnLayout.right - rcWndAfterDst.left - rcWndAfterDst.Width(),
  958. rcOwnLayout.top - rcWndAfterDst.top
  959. );
  960. if( rcWndAfterDst.left <= (rcOwnLayout.left + nMinExtent) )
  961. bForceHideAfter = true;
  962. else
  963. {
  964. rcWndAfterDst.bottom =
  965. rcWndAfterDst.top + rcOwnLayout.Height();
  966. rcOwnLayout.right -= rcWndAfterDst.Width();
  967. } // if( rcWndAfterDst.left <= (rcOwnLayout.left + nMinExtent) )
  968. } // if( hWndAfter != NULL )
  969. if( hWndBefore != NULL )
  970. {
  971. rcWndBeforeDst.OffsetRect(
  972. rcOwnLayout.left - rcWndBeforeDst.left,
  973. rcOwnLayout.top - rcWndBeforeDst.top
  974. );
  975. if( rcWndBeforeDst.right >= (rcOwnLayout.right - nMinExtent) )
  976. bForceHideBefore = true;
  977. else
  978. {
  979. rcWndBeforeDst.bottom =
  980. rcWndBeforeDst.top + rcOwnLayout.Height();
  981. rcOwnLayout.left += rcWndBeforeDst.Width();
  982. } // else from if( rcWndBeforeDst.right >= (rcOwnLayout.right - nMinExtent) )
  983. } // if( hWndBefore != NULL )
  984. break;
  985. case __ESO_BOTTOM:
  986. _sizeNeeded.cy = m_nHorzBarHeight;
  987. lpLayout->rect.bottom -= _sizeNeeded.cy;
  988. rcOwnLayout.top = rcOwnLayout.bottom - _sizeNeeded.cy;
  989. lpLayout->sizeTotal.cy += _sizeNeeded.cy;
  990. if( m_bAutoReserveSpaceBefore )
  991. rcOwnLayout.left += m_nVertBarWidth;
  992. if( m_bAutoReserveSpaceAfter )
  993. rcOwnLayout.right -= m_nVertBarWidth;
  994. nMinExtent = ::GetSystemMetrics(SM_CXHSCROLL)*2;
  995. if( hWndAfter != NULL )
  996. {
  997. rcWndAfterDst.OffsetRect(
  998. rcOwnLayout.right - rcWndAfterDst.left - rcWndAfterDst.Width(),
  999. rcOwnLayout.top - rcWndAfterDst.top
  1000. );
  1001. if( rcWndAfterDst.left <= (rcOwnLayout.left + nMinExtent) )
  1002. bForceHideAfter = true;
  1003. else
  1004. {
  1005. rcWndAfterDst.bottom =
  1006. rcWndAfterDst.top + rcOwnLayout.Height();
  1007. rcOwnLayout.right -= rcWndAfterDst.Width();
  1008. } // if( rcWndAfterDst.left <= (rcOwnLayout.left + nMinExtent) )
  1009. } // if( hWndAfter != NULL )
  1010. if( hWndBefore != NULL )
  1011. {
  1012. rcWndBeforeDst.OffsetRect(
  1013. rcOwnLayout.left - rcWndBeforeDst.left,
  1014. rcOwnLayout.top - rcWndBeforeDst.top
  1015. );
  1016. if( rcWndBeforeDst.right >= (rcOwnLayout.right - nMinExtent) )
  1017. bForceHideBefore = true;
  1018. else
  1019. {
  1020. rcWndBeforeDst.bottom =
  1021. rcWndBeforeDst.top + rcOwnLayout.Height();
  1022. rcOwnLayout.left += rcWndBeforeDst.Width();
  1023. } // else from if( rcWndBeforeDst.right >= (rcOwnLayout.right - nMinExtent) )
  1024. } // if( hWndBefore != NULL )
  1025. break;
  1026. case __ESO_LEFT:
  1027. _sizeNeeded.cx = m_nVertBarWidth;
  1028. lpLayout->rect.left += _sizeNeeded.cx;
  1029. rcOwnLayout.right = rcOwnLayout.left + _sizeNeeded.cx;
  1030. lpLayout->sizeTotal.cx += _sizeNeeded.cx;
  1031. if( m_bAutoReserveSpaceBefore )
  1032. rcOwnLayout.top += m_nHorzBarHeight;
  1033. if( m_bAutoReserveSpaceAfter )
  1034. rcOwnLayout.bottom -= m_nHorzBarHeight;
  1035. break;
  1036. case __ESO_RIGHT:
  1037. _sizeNeeded.cx = m_nVertBarWidth;
  1038. lpLayout->rect.right -= _sizeNeeded.cx;
  1039. rcOwnLayout.left = rcOwnLayout.right - _sizeNeeded.cx;
  1040. lpLayout->sizeTotal.cx += _sizeNeeded.cx;
  1041. if( m_bAutoReserveSpaceBefore )
  1042. rcOwnLayout.top += m_nHorzBarHeight;
  1043. if( m_bAutoReserveSpaceAfter )
  1044. rcOwnLayout.bottom -= m_nHorzBarHeight;
  1045. nMinExtent = ::GetSystemMetrics(SM_CYVSCROLL)*2;
  1046. if( hWndAfter != NULL )
  1047. {
  1048. rcWndAfterDst.OffsetRect(
  1049. rcOwnLayout.left - rcWndAfterDst.left,
  1050. rcOwnLayout.bottom - rcWndAfterDst.top - rcWndAfterDst.Height()
  1051. );
  1052. if( rcWndAfterDst.top <= (rcOwnLayout.top + nMinExtent) )
  1053. bForceHideAfter = true;
  1054. else
  1055. {
  1056. rcWndAfterDst.right =
  1057. rcWndAfterDst.left + rcOwnLayout.Width();
  1058. rcOwnLayout.bottom -= rcWndAfterDst.Height();
  1059. } // if( rcWndAfterDst.top <= (rcOwnLayout.top + nMinExtent) )
  1060. } // if( hWndAfter != NULL )
  1061. if( hWndBefore != NULL )
  1062. {
  1063. rcWndBeforeDst.OffsetRect(
  1064. rcOwnLayout.left - rcWndBeforeDst.left,
  1065. rcOwnLayout.top - rcWndBeforeDst.top
  1066. );
  1067. if( rcWndBeforeDst.bottom >= (rcOwnLayout.bottom - nMinExtent) )
  1068. bForceHideBefore = true;
  1069. else
  1070. {
  1071. rcWndBeforeDst.right =
  1072. rcWndBeforeDst.left + rcOwnLayout.Width();
  1073. rcOwnLayout.top += rcWndBeforeDst.Height();
  1074. } // else from if( rcWndBeforeDst.bottom >= (rcOwnLayout.bottom - nMinExtent) )
  1075. } // if( hWndBefore != NULL )
  1076. break;
  1077. case __ESO_NONE:
  1078. break;
  1079. #ifdef _DEBUG
  1080. default:
  1081. ASSERT( FALSE );
  1082. break;
  1083. #endif // _DEBUG
  1084. } // switch( _eSO )
  1085. // ASSERT( ! rcOwnLayout.IsRectEmpty() );
  1086. if( lpLayout->hDWP != NULL )
  1087. {
  1088. ::AfxRepositionWindow(
  1089. lpLayout,
  1090. m_hWnd,
  1091. &rcOwnLayout
  1092. );
  1093. if( hWndBefore != NULL )
  1094. {
  1095. if( (m_bHideHwndBefore && bHwndBeforeVisible)
  1096. || bForceHideBefore
  1097. )
  1098. lpLayout->hDWP =
  1099. ::DeferWindowPos(
  1100. lpLayout->hDWP,
  1101. hWndBefore, NULL, 0, 0, 0, 0,
  1102. SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE
  1103. |SWP_NOZORDER|SWP_NOOWNERZORDER
  1104. |SWP_HIDEWINDOW
  1105. );
  1106. else if( rcWndBeforeDst != rcWndBeforeSrc )
  1107. lpLayout->hDWP =
  1108. ::DeferWindowPos(
  1109. lpLayout->hDWP,
  1110. hWndBefore, NULL,
  1111. rcWndBeforeDst.left, rcWndBeforeDst.top,
  1112. rcWndBeforeDst.Width(), rcWndBeforeDst.Height(),
  1113. SWP_NOACTIVATE|SWP_SHOWWINDOW
  1114. |SWP_NOZORDER|SWP_NOOWNERZORDER
  1115. );
  1116. } // if( hWndBefore != NULL )
  1117. if( hWndAfter != NULL )
  1118. {
  1119. if( (m_bHideHwndAfter && bHwndAfterVisible)
  1120. || bForceHideAfter
  1121. )
  1122. lpLayout->hDWP =
  1123. ::DeferWindowPos(
  1124. lpLayout->hDWP,
  1125. hWndAfter, NULL, 0, 0, 0, 0,
  1126. SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE
  1127. |SWP_NOZORDER|SWP_NOOWNERZORDER
  1128. |SWP_HIDEWINDOW
  1129. );
  1130. else if( rcWndAfterDst != rcWndAfterSrc )
  1131. lpLayout->hDWP =
  1132. ::DeferWindowPos(
  1133. lpLayout->hDWP,
  1134. hWndAfter, NULL,
  1135. rcWndAfterDst.left, rcWndAfterDst.top,
  1136. rcWndAfterDst.Width(), rcWndAfterDst.Height(),
  1137. SWP_NOACTIVATE|SWP_SHOWWINDOW
  1138. |SWP_NOZORDER|SWP_NOOWNERZORDER
  1139. );
  1140. } // if( hWndAfter != NULL )
  1141. } // if( lpLayout->hDWP != NULL )
  1142. return 0L;
  1143. }
  1144. void CExtScrollBar::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
  1145. {
  1146. ASSERT_VALID( this );
  1147. if( ! m_bCompleteRepaint )
  1148. CScrollBar::OnWindowPosChanging( lpwndpos );
  1149. }
  1150. void CExtScrollBar::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
  1151. {
  1152. ASSERT_VALID( this );
  1153. if( ! m_bCompleteRepaint )
  1154. {
  1155. CScrollBar::OnWindowPosChanged( lpwndpos );
  1156. return;
  1157. }
  1158. AnimationSite_ClientProgressStop( this );
  1159. AnimationClient_StateGet( false ).Empty();
  1160. AnimationClient_StateGet( true ).Empty();
  1161. CRect rcClient;
  1162. GetClientRect( &rcClient );
  1163. AnimationClient_TargetRectSet( rcClient );
  1164. if( (GetStyle()&WS_VISIBLE) == 0 )
  1165. return;
  1166. Invalidate();
  1167. if( ScrollBar_CaptureGet() == m_hWnd )
  1168. UpdateWindow();
  1169. }
  1170. void CExtScrollBar::OnSize(UINT nType, int cx, int cy)
  1171. {
  1172. ASSERT_VALID( this );
  1173. if( ! m_bCompleteRepaint )
  1174. {
  1175. CScrollBar::OnSize( nType, cx, cy );
  1176. return;
  1177. }
  1178. AnimationSite_ClientProgressStop( this );
  1179. AnimationClient_StateGet( false ).Empty();
  1180. AnimationClient_StateGet( true ).Empty();
  1181. CRect rcClient;
  1182. GetClientRect( &rcClient );
  1183. AnimationClient_TargetRectSet( rcClient );
  1184. CExtPopupMenuTipWnd * pATTW =
  1185. OnAdvancedPopupMenuTipWndGet();
  1186. if( pATTW != NULL )
  1187. pATTW->Hide();
  1188. if( (GetStyle()&WS_VISIBLE) == 0 )
  1189. return;
  1190. Invalidate();
  1191. if( ScrollBar_CaptureGet() == m_hWnd )
  1192. UpdateWindow();
  1193. }
  1194. void CExtScrollBar::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
  1195. {
  1196. ASSERT_VALID( this );
  1197. if( m_bCompleteRepaint )
  1198. return;
  1199. CScrollBar::OnNcCalcSize( bCalcValidRects, lpncsp );
  1200. }
  1201. UINT CExtScrollBar::OnNcHitTest(CPoint point)
  1202. {
  1203. ASSERT_VALID( this );
  1204. if( ! m_bCompleteRepaint )
  1205. return UINT( CScrollBar::OnNcHitTest( point ) );
  1206. return HTCLIENT;
  1207. }
  1208. int CExtScrollBar::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
  1209. {
  1210. ASSERT_VALID( this );
  1211. if( ! m_bCompleteRepaint )
  1212. return CScrollBar::OnMouseActivate( pDesktopWnd, nHitTest, message );
  1213. return m_nMouseActivateCode;
  1214. }
  1215. void CExtScrollBar::OnShowWindow(BOOL bShow, UINT nStatus) 
  1216. {
  1217. CScrollBar::OnShowWindow( bShow, nStatus);
  1218. if( ! bShow )
  1219. {
  1220. CExtPopupMenuTipWnd * pATTW =
  1221. OnAdvancedPopupMenuTipWndGet();
  1222. if( pATTW != NULL )
  1223. pATTW->Hide();
  1224. } // if( ! bShow )
  1225. }
  1226. void CExtScrollBar::OnEnable(BOOL bEnable)
  1227. {
  1228. ASSERT_VALID( this );
  1229. CScrollBar::OnEnable( bEnable );
  1230. if( (! m_bCompleteRepaint )
  1231. || ( GetStyle() & WS_VISIBLE ) == 0
  1232. )
  1233. return;
  1234. if( ! bEnable )
  1235. {
  1236. CExtPopupMenuTipWnd * pATTW =
  1237. OnAdvancedPopupMenuTipWndGet();
  1238. if( pATTW != NULL )
  1239. pATTW->Hide();
  1240. } // if( ! bEnable )
  1241. Invalidate();
  1242. if( ScrollBar_CaptureGet() == m_hWnd )
  1243. UpdateWindow();
  1244. }
  1245. void CExtScrollBar::OnCancelMode()
  1246. {
  1247. ASSERT_VALID( this );
  1248. if( ! m_bCompleteRepaint )
  1249. {
  1250. CScrollBar::OnCancelMode();
  1251. return;
  1252. }
  1253. if( m_bProcessingCancelMode )
  1254. return;
  1255. m_bProcessingCancelMode = true;
  1256. m_bProcessingClick
  1257. = m_bProcessingOutClick
  1258. = m_bProcessingHover
  1259. = false;
  1260. m_nSBMHT = INT(CExtPaintManager::__ESBMHT_NOWHERE);
  1261. ScrollBar_CaptureRelease();
  1262. CExtPopupMenuTipWnd * pATTW =
  1263. OnAdvancedPopupMenuTipWndGet();
  1264. if( pATTW != NULL )
  1265. pATTW->Hide();
  1266. Invalidate();
  1267. ///UpdateWindow();
  1268. m_bProcessingCancelMode = false;
  1269. }
  1270. void CExtScrollBar::OnCaptureChanged(CWnd *pWnd)
  1271. {
  1272. ASSERT_VALID( this );
  1273. if( ! m_bCompleteRepaint )
  1274. {
  1275. CScrollBar::OnCaptureChanged( pWnd );
  1276. return;
  1277. }
  1278.   if( pWnd != this )
  1279. {
  1280. m_bHookCapturedState = false;
  1281. if( pWnd != NULL )
  1282. SendMessage( WM_CANCELMODE );
  1283. }
  1284. else
  1285. m_bHookCapturedState = true;
  1286. }
  1287. BOOL CExtScrollBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
  1288. {
  1289. ASSERT_VALID( this );
  1290. if( ! m_bCompleteRepaint )
  1291. return CScrollBar::OnSetCursor( pWnd, nHitTest, message );
  1292. SetCursor( ::LoadCursor( NULL, IDC_ARROW ) );
  1293. return TRUE;
  1294. }
  1295. bool CExtScrollBar::OnHookSpyPreTranslateMessage(
  1296. MSG * pMSG
  1297. )
  1298. {
  1299. __PROF_UIS_MANAGE_STATE;
  1300. ASSERT_VALID( this );
  1301. ASSERT( pMSG != NULL );
  1302. if( pMSG->hwnd == m_hWnd
  1303. && GetSafeHwnd() != NULL
  1304. && ( GetStyle() & WS_VISIBLE ) != 0
  1305. && pMSG->message == WM_TIMER
  1306. && AnimationSite_OnHookTimer( UINT(pMSG->wParam) )
  1307. )
  1308. return true;
  1309. return false;
  1310. }
  1311. bool CExtScrollBar::OnHookSpyMouseMoveMsg(
  1312. MSG * pMSG
  1313. )
  1314. {
  1315. __PROF_UIS_MANAGE_STATE;
  1316. ASSERT_VALID( this );
  1317. ASSERT( pMSG != NULL );
  1318. if( (! m_bEnableHookSpy )
  1319. || ( ! m_bCompleteRepaint )
  1320. || pMSG->hwnd == NULL
  1321. || GetSafeHwnd() == NULL
  1322. )
  1323. return false;
  1324. //  if( pMSG->hwnd != m_hWnd
  1325. //  && ( ! m_bHookCapturedState )
  1326. //  )
  1327. //  return false;
  1328. DWORD dwOwnWndStyle = GetStyle();
  1329. if( (dwOwnWndStyle&(WS_VISIBLE|WS_DISABLED)) != WS_VISIBLE )
  1330. return false;
  1331. CPoint ptScreen( -32767, -32767 );
  1332. MSG _msg;
  1333. ::memcpy( &_msg, pMSG, sizeof(MSG) );
  1334. if( pMSG->message == WM_NCMOUSEMOVE )
  1335. {
  1336. _msg.message = WM_MOUSEMOVE;
  1337. _msg.wParam = 0;
  1338. CPoint point( short(LOWORD(DWORD(_msg.lParam))), short(HIWORD(DWORD(_msg.lParam))) );
  1339. ptScreen = point;
  1340. ScreenToClient( &point );
  1341. _msg.lParam = MAKELPARAM( point.x ,point.y );
  1342. }
  1343. else if( pMSG->message == WM_MOUSEMOVE )
  1344. {
  1345. if( _msg.hwnd != m_hWnd )
  1346. {
  1347. CPoint point( short(LOWORD(DWORD(_msg.lParam))), short(HIWORD(DWORD(_msg.lParam))) );
  1348. ::ClientToScreen( _msg.hwnd, &point );
  1349. ptScreen = point;
  1350. ScreenToClient( &point );
  1351. _msg.lParam = MAKELPARAM( point.x ,point.y );
  1352. }
  1353. }
  1354. else
  1355. return false;
  1356. // return ScrollBar_OnMouseMoveMsg( pMSG );
  1357. HWND hWndFromPoint = ::WindowFromPoint( ptScreen );
  1358. if( hWndFromPoint == m_hWnd )
  1359. ScrollBar_CaptureSet();
  1360. if( pMSG->hwnd != m_hWnd
  1361. && ( ! m_bHookCapturedState )
  1362. )
  1363. return false;
  1364. WNDPROC pWNDPROC = (WNDPROC) ::__EXT_MFC_GetWindowLong( m_hWnd, __EXT_MFC_GWL_WNDPROC );
  1365. ::CallWindowProc( pWNDPROC, m_hWnd, _msg.message, _msg.wParam, _msg.lParam );
  1366. return true;
  1367. }
  1368. bool CExtScrollBar::OnHookSpyMouseClickMsg(
  1369. MSG * pMSG
  1370. )
  1371. {
  1372. __PROF_UIS_MANAGE_STATE;
  1373. ASSERT_VALID( this );
  1374. ASSERT( pMSG != NULL );
  1375. if( (! m_bEnableHookSpy )
  1376. || ( ! m_bCompleteRepaint )
  1377. || pMSG->hwnd == NULL
  1378. || GetSafeHwnd() == NULL
  1379. )
  1380. return false;
  1381. // if( pMSG->hwnd != m_hWnd
  1382. // && ( ! m_bHookCapturedState )
  1383. // )
  1384. // return false;
  1385. DWORD dwOwnWndStyle = GetStyle();
  1386. if( (dwOwnWndStyle&(WS_VISIBLE|WS_DISABLED)) != WS_VISIBLE )
  1387. return false;
  1388. CPoint ptScreen( -32767, -32767 );
  1389. MSG _msg;
  1390. ::memcpy( &_msg, pMSG, sizeof(MSG) );
  1391. bool bNcTranslate = false;
  1392. switch( _msg.message )
  1393. {
  1394. case WM_LBUTTONDOWN:
  1395. case WM_LBUTTONUP:
  1396. case WM_LBUTTONDBLCLK:
  1397. case WM_RBUTTONDOWN:
  1398. case WM_RBUTTONUP:
  1399. case WM_RBUTTONDBLCLK:
  1400. case WM_MBUTTONDOWN:
  1401. case WM_MBUTTONUP:
  1402. case WM_MBUTTONDBLCLK:
  1403. if( _msg.hwnd != m_hWnd )
  1404. {
  1405. CPoint point( short(LOWORD(DWORD(_msg.lParam))), short(HIWORD(DWORD(_msg.lParam))) );
  1406. ::ClientToScreen( _msg.hwnd, &point );
  1407. ptScreen = point;
  1408. ScreenToClient( &point );
  1409. _msg.lParam = MAKELPARAM( point.x ,point.y );
  1410. }
  1411. break;
  1412. case WM_NCLBUTTONDOWN:
  1413. _msg.message = WM_LBUTTONDOWN;
  1414. bNcTranslate = true;
  1415. break;
  1416. case WM_NCLBUTTONUP:
  1417. _msg.message = WM_LBUTTONUP;
  1418. bNcTranslate = true;
  1419. break;
  1420. case WM_NCLBUTTONDBLCLK:
  1421. _msg.message = WM_LBUTTONDBLCLK;
  1422. bNcTranslate = true;
  1423. break;
  1424. case WM_NCRBUTTONDOWN:
  1425. _msg.message = WM_RBUTTONDOWN;
  1426. bNcTranslate = true;
  1427. break;
  1428. case WM_NCRBUTTONUP:
  1429. _msg.message = WM_RBUTTONUP;
  1430. bNcTranslate = true;
  1431. break;
  1432. case WM_NCRBUTTONDBLCLK:
  1433. _msg.message = WM_RBUTTONDBLCLK;
  1434. bNcTranslate = true;
  1435. break;
  1436. case WM_NCMBUTTONDOWN:
  1437. _msg.message = WM_MBUTTONDOWN;
  1438. bNcTranslate = true;
  1439. break;
  1440. case WM_NCMBUTTONUP:
  1441. _msg.message = WM_MBUTTONUP;
  1442. bNcTranslate = true;
  1443. break;
  1444. case WM_NCMBUTTONDBLCLK:
  1445. _msg.message = WM_MBUTTONDBLCLK;
  1446. bNcTranslate = true;
  1447. break;
  1448. default:
  1449. return false;
  1450. } //switch( _msg.message )
  1451. if( bNcTranslate )
  1452. {
  1453. _msg.wParam = 0;
  1454. CPoint point( short(LOWORD(DWORD(_msg.lParam))), short(HIWORD(DWORD(_msg.lParam))) );
  1455. ptScreen = point;
  1456. ScreenToClient( &point );
  1457. _msg.lParam = MAKELPARAM( point.x ,point.y );
  1458. } //if( bNcTranslate )
  1459. // return ScrollBar_OnMouseClickMsg( pMSG );
  1460. HWND hWndFromPoint = ::WindowFromPoint( ptScreen );
  1461. if( hWndFromPoint == m_hWnd )
  1462. {
  1463. //ScrollBar_CaptureSet();
  1464. m_bHookCapturedState = true;
  1465. }
  1466. else
  1467. // if( pMSG->hwnd != m_hWnd
  1468. // && ( ! m_bHookCapturedState )
  1469. // )
  1470. return false;
  1471. WNDPROC pWNDPROC = (WNDPROC) ::__EXT_MFC_GetWindowLong( m_hWnd, __EXT_MFC_GWL_WNDPROC );
  1472. ::CallWindowProc( pWNDPROC, m_hWnd, _msg.message, _msg.wParam, _msg.lParam );
  1473. return true;
  1474. }
  1475. HWND CExtScrollBar::ScrollBar_CaptureGet() const
  1476. {
  1477. ASSERT_VALID( this );
  1478. if( m_bEnableHookSpy && m_bHookCapturedState )
  1479. return m_hWnd;
  1480. HWND hWndCapture = ::GetCapture();
  1481. return hWndCapture;
  1482. }
  1483. void CExtScrollBar::ScrollBar_CaptureSet()
  1484. {
  1485. ASSERT_VALID( this );
  1486. if( GetSafeHwnd() != NULL && ::GetCapture() != m_hWnd )
  1487. {
  1488. m_bHookCapturedState = true;
  1489. if( ! m_bEnableHookSpy )
  1490. ::SetCapture( m_hWnd );
  1491. }
  1492. else
  1493. m_bHookCapturedState = false;
  1494. }
  1495. void CExtScrollBar::ScrollBar_CaptureRelease()
  1496. {
  1497. ASSERT_VALID( this );
  1498. m_bHookCapturedState = false;
  1499. if( ! m_bEnableHookSpy )
  1500. if( GetSafeHwnd() != NULL && ::GetCapture() == m_hWnd )
  1501. ::ReleaseCapture();
  1502. }
  1503. bool CExtScrollBar::ScrollBar_OnMouseMoveMsg(
  1504. MSG * pMSG
  1505. )
  1506. {
  1507. ASSERT_VALID( this );
  1508. ASSERT( pMSG != NULL );
  1509. if( m_bProcessingClick )
  1510. return true;
  1511. CPoint point( short(LOWORD(DWORD(pMSG->lParam))), short(HIWORD(DWORD(pMSG->lParam))) );
  1512. bool bAnimationLocked = AnimationClient_CacheGeneratorIsLocked();
  1513. HWND hWndCapture = ScrollBar_CaptureGet(); // ::GetCapture();
  1514. CExtPopupMenuTipWnd * pATTW = OnAdvancedPopupMenuTipWndGet();
  1515. if( m_bProcessingHover )
  1516. {
  1517. CPoint ptScreen = point;
  1518. ClientToScreen( &ptScreen );
  1519. HWND hWndFromPoint = ::WindowFromPoint( ptScreen );
  1520. if( hWndFromPoint != m_hWnd )
  1521. {
  1522. if( ! bAnimationLocked )
  1523. {
  1524. AnimationClient_CacheGeneratorLock();
  1525. // if( AnimationClient_StateGet(true).IsEmpty() )
  1526.   AnimationClient_CacheNextStateMinInfo(
  1527. false,
  1528. __EAPT_BY_HOVERED_STATE_TURNED_OFF
  1529. );
  1530. }
  1531. m_bProcessingHover = false;
  1532. m_nSBMHT = INT(CExtPaintManager::__ESBMHT_NOWHERE);
  1533. if( hWndCapture == m_hWnd )
  1534. SendMessage( WM_CANCELMODE );
  1535. if( ! bAnimationLocked )
  1536. {
  1537.   AnimationClient_CacheNextStateMinInfo(
  1538. true,
  1539. __EAPT_BY_HOVERED_STATE_TURNED_OFF
  1540. );
  1541. AnimationClient_CacheGeneratorUnlock();
  1542. }
  1543. if( pATTW != NULL )
  1544. pATTW->Hide();
  1545. Invalidate();
  1546. UpdateWindow();
  1547. return true;
  1548. } // if( hWndFromPoint != m_hWnd )
  1549. CExtPaintManager::PAINTSCROLLBARDATA _psbd( this );
  1550. _psbd.AdjustHT( point );
  1551. if( m_nSBMHT != INT(_psbd.m_eSBMHT) )
  1552. {
  1553. if( ! bAnimationLocked )
  1554. {
  1555. AnimationClient_CacheGeneratorLock();
  1556. // if( AnimationClient_StateGet(true).IsEmpty() )
  1557.   AnimationClient_CacheNextStateMinInfo(
  1558. false,
  1559. __EAPT_BY_HOVERED_STATE_TURNED_ON
  1560. );
  1561. }
  1562. m_nSBMHT = INT(_psbd.m_eSBMHT);
  1563. if( ! bAnimationLocked )
  1564. {
  1565.   AnimationClient_CacheNextStateMinInfo(
  1566. true,
  1567. __EAPT_BY_HOVERED_STATE_TURNED_ON
  1568. );
  1569. AnimationClient_CacheGeneratorUnlock();
  1570. }
  1571. Invalidate();
  1572. UpdateWindow();
  1573. } // if( m_nSBMHT != INT(_psbd.m_eSBMHT) )
  1574. if( hWndCapture != m_hWnd )
  1575. ScrollBar_CaptureSet();
  1576. if( pATTW != NULL )
  1577. OnAdvancedPopupMenuTipWndDisplay( *pATTW, m_nSBMHT, false );
  1578. return true;
  1579. } // if( m_bProcessingHover )
  1580. if( ! bAnimationLocked )
  1581. {
  1582. AnimationClient_CacheGeneratorLock();
  1583. // if( AnimationClient_StateGet(true).IsEmpty() )
  1584.   AnimationClient_CacheNextStateMinInfo(
  1585. false,
  1586. __EAPT_BY_HOVERED_STATE_TURNED_ON
  1587. );
  1588. }
  1589. m_bProcessingHover = true;
  1590. CExtPaintManager::PAINTSCROLLBARDATA _psbd( this );
  1591. _psbd.AdjustHT( point );
  1592. bool bForceRepaint = false;
  1593. if( m_nSBMHT != INT(_psbd.m_eSBMHT) )
  1594. {
  1595. m_nSBMHT = INT(_psbd.m_eSBMHT);
  1596. bForceRepaint = true;
  1597. } // if( m_nSBMHT != INT(_psbd.m_eSBMHT) )
  1598. if( ! bAnimationLocked )
  1599. {
  1600.   AnimationClient_CacheNextStateMinInfo(
  1601. true,
  1602. __EAPT_BY_HOVERED_STATE_TURNED_ON
  1603. );
  1604. AnimationClient_CacheGeneratorUnlock();
  1605. }
  1606. if( bForceRepaint )
  1607. {
  1608. Invalidate();
  1609. UpdateWindow();
  1610. } // if( bForceRepaint )
  1611. if( hWndCapture != m_hWnd )
  1612. ScrollBar_CaptureSet();
  1613. if( pATTW != NULL )
  1614. OnAdvancedPopupMenuTipWndDisplay( *pATTW, m_nSBMHT, false );
  1615. return true;
  1616. }
  1617. bool CExtScrollBar::ScrollBar_OnMouseClickMsg(
  1618. MSG * pMSG
  1619. )
  1620. {
  1621. ASSERT_VALID( this );
  1622. ASSERT( pMSG != NULL );
  1623. switch( pMSG->message )
  1624. {
  1625. case WM_LBUTTONDOWN:
  1626. ScrollBar_TrackMouseLButtonDown( pMSG );
  1627. break;
  1628. case WM_LBUTTONUP:
  1629. case WM_LBUTTONDBLCLK:
  1630. case WM_MBUTTONDOWN:
  1631. case WM_MBUTTONUP:
  1632. case WM_MBUTTONDBLCLK:
  1633. case WM_RBUTTONDOWN:
  1634. case WM_RBUTTONUP:
  1635. case WM_RBUTTONDBLCLK:
  1636. {
  1637. CExtPopupMenuTipWnd * pATTW = OnAdvancedPopupMenuTipWndGet();
  1638. if( pATTW != NULL )
  1639. pATTW->Hide();
  1640. }
  1641. break;
  1642. default:
  1643. return false;
  1644. } // switch( pMSG->message )
  1645. if( pMSG->message == WM_RBUTTONDOWN && m_bEnableCtxMenu )
  1646. return false;
  1647. return true;
  1648. }
  1649. void CExtScrollBar::OnMouseMove(UINT nFlags, CPoint point)
  1650. {
  1651. ASSERT_VALID( this );
  1652. if( ! m_bCompleteRepaint )
  1653. {
  1654. CScrollBar::OnMouseMove( nFlags, point );
  1655. return;
  1656. }
  1657. MSG _msg;
  1658. ::memset( &_msg, 0, sizeof(MSG) );
  1659. _msg.hwnd = m_hWnd;
  1660.     _msg.message = WM_MOUSEMOVE;
  1661.     _msg.wParam = WPARAM(nFlags);
  1662.     _msg.lParam = MAKELPARAM( point.x ,point.y );
  1663. ScrollBar_OnMouseMoveMsg( &_msg );
  1664. }
  1665. void CExtScrollBar::OnLButtonDown(UINT nFlags, CPoint point)
  1666. {
  1667. ASSERT_VALID( this );
  1668. if( ! m_bCompleteRepaint )
  1669. {
  1670. CScrollBar::OnLButtonDown( nFlags, point );
  1671. return;
  1672. }
  1673. MSG _msg;
  1674. ::memset( &_msg, 0, sizeof(MSG) );
  1675. _msg.hwnd = m_hWnd;
  1676.     _msg.message = WM_LBUTTONDOWN;
  1677.     _msg.wParam = WPARAM(nFlags);
  1678.     _msg.lParam = MAKELPARAM( point.x ,point.y );
  1679. ScrollBar_OnMouseClickMsg( &_msg );
  1680. }
  1681. void CExtScrollBar::ScrollBar_TrackMouseLButtonDown(
  1682. MSG * pMSG
  1683. )
  1684. {
  1685. ASSERT_VALID( this );
  1686. if( ! m_bCompleteRepaint )
  1687. return;
  1688. CPoint point( short(LOWORD(DWORD(pMSG->lParam))), short(HIWORD(DWORD(pMSG->lParam))) );
  1689. CExtPopupMenuTipWnd * pATTW =
  1690. OnAdvancedPopupMenuTipWndGet();
  1691. CExtPaintManager::PAINTSCROLLBARDATA _psbd( this );
  1692. _psbd.AdjustHT( point );
  1693. if( (! m_bProcessingHover)
  1694. || m_bProcessingClick
  1695. || (! _psbd.m_bEnabled )
  1696. || _psbd.m_eSBMHT == CExtPaintManager::__ESBMHT_NOWHERE
  1697. )
  1698. {
  1699. if( _psbd.m_eSBMHT == CExtPaintManager::__ESBMHT_NOWHERE
  1700. || (! _psbd.m_bEnabled )
  1701. )
  1702. {
  1703. if( pATTW != NULL )
  1704. pATTW->Hide();
  1705. SendMessage( WM_CANCELMODE );
  1706. Invalidate();
  1707. UpdateWindow();
  1708. return;
  1709. }
  1710. }
  1711. if( ! m_bPopupInactiveLightMode )
  1712. ActivateTopParent();
  1713. bool bAnimationLocked = AnimationClient_CacheGeneratorIsLocked();
  1714. if( ! bAnimationLocked )
  1715. {
  1716. AnimationClient_CacheGeneratorLock();
  1717. // if( AnimationClient_StateGet(true).IsEmpty() )
  1718.   AnimationClient_CacheNextStateMinInfo(
  1719. false,
  1720. __EAPT_BY_PRESSED_STATE_TURNED_ON
  1721. );
  1722. }
  1723. if( m_bEnableHookSpy )
  1724. HookSpyUnregister();
  1725. m_nSBMHT = INT(_psbd.m_eSBMHT);
  1726. m_bProcessingClick = m_bProcessingHover = true;
  1727. m_bProcessingOutClick = false;
  1728. if( ! bAnimationLocked )
  1729. {
  1730.   AnimationClient_CacheNextStateMinInfo(
  1731. true,
  1732. __EAPT_BY_PRESSED_STATE_TURNED_ON
  1733. );
  1734. AnimationClient_CacheGeneratorUnlock();
  1735. }
  1736. Invalidate();
  1737. UpdateWindow();
  1738. if( pATTW != NULL )
  1739. OnAdvancedPopupMenuTipWndDisplay( *pATTW, m_nSBMHT, true );
  1740. INT nScrollPosStart = _psbd.m_DSI.nPos, nScrollPos = _psbd.m_DSI.nPos;
  1741. m_nHelperTrackPos = _psbd.m_DSI.nPos;
  1742. m_bHelperHaveTrackPos = true;
  1743. CRect rcArea = _psbd.GetAreaRectHT();
  1744. const UINT nTimerID_zero_start = 401;
  1745. const UINT nTimerID_1st_slow = 402;
  1746. const UINT nTimerEllapse_1st_slow = 400;
  1747. const UINT nTimerID_2nd_fast = 403;
  1748. const UINT nTimerEllapse_2nd_fast = 100;
  1749. HWND hWndOwn = GetSafeHwnd();
  1750. ASSERT( hWndOwn != NULL && ::IsWindow( hWndOwn ) );
  1751. HWND hWndParent = ::GetParent( hWndOwn );
  1752. bool bVirtualMode = false, bFinalNotify = true;
  1753. #if (!defined __EXT_MFC_NO_SCROLLWND)
  1754. CExtScrollWnd * pExtScrollWnd = NULL;
  1755. if( hWndParent != NULL )
  1756. {
  1757. CWnd * pWndParentPermanent = CWnd::FromHandlePermanent( hWndParent );
  1758. if( pWndParentPermanent != NULL )
  1759. {
  1760. pExtScrollWnd =
  1761. DYNAMIC_DOWNCAST(
  1762. CExtScrollWnd,
  1763. pWndParentPermanent
  1764. );
  1765. #if (!defined __EXT_MFC_NO_SCROLLITEMWND)
  1766. if( pExtScrollWnd != NULL )
  1767. {
  1768. CExtScrollItemWnd * pExtScrollItemWnd =
  1769. DYNAMIC_DOWNCAST(
  1770. CExtScrollItemWnd,
  1771. pWndParentPermanent
  1772. );
  1773. if( pExtScrollItemWnd != NULL )
  1774. {
  1775. DWORD dwScrollType = __ESIW_ST_NONE;
  1776. if( _psbd.m_bHorzBar )
  1777. dwScrollType = pExtScrollItemWnd->SiwScrollTypeHGet();
  1778. else
  1779. dwScrollType = pExtScrollItemWnd->SiwScrollTypeVGet();
  1780. if( dwScrollType == __ESIW_ST_VIRTUAL )
  1781. bVirtualMode = true;
  1782. } // if( pExtScrollItemWnd != NULL )
  1783. } // if( pExtScrollWnd != NULL )
  1784. #endif // (!defined __EXT_MFC_NO_SCROLLITEMWND)
  1785. } // if( pWndParentPermanent != NULL )
  1786. } // if( hWndParent != NULL )
  1787. #endif // (!defined __EXT_MFC_NO_SCROLLWND)
  1788. bool bStopFlag = false;
  1789. CPoint ptCursor( point );
  1790. INT nStepSize = 0L;
  1791. bool bUpStep = false;
  1792. bool bMouseButtonsNotSwapped = ( ::GetSystemMetrics( SM_SWAPBUTTON ) != 0 ) ? false : true;
  1793. switch( _psbd.m_eSBMHT )
  1794. {
  1795. case CExtPaintManager::__ESBMHT_BUTTON_UP:
  1796. bUpStep = true;
  1797. // continue falling here ...
  1798. case CExtPaintManager::__ESBMHT_BUTTON_DOWN:
  1799. nStepSize = GetStepSize(); // nStepSize = 1L;
  1800. #if (!defined __EXT_MFC_NO_SCROLLWND)
  1801. if( pExtScrollWnd != NULL )
  1802. {
  1803. int nDir = ( _psbd.m_eSBMHT == CExtPaintManager::__ESBMHT_BUTTON_DOWN ) ? (+1) : (-1);
  1804. CSize _size = pExtScrollWnd->OnSwGetLineSize( nDir );
  1805. nStepSize = _psbd.m_bHorzBar ? _size.cx : _size.cy;
  1806. if( nStepSize <= 0L )
  1807. nStepSize = GetStepSize(); // nStepSize = 1L;
  1808. }
  1809. #endif // (!defined __EXT_MFC_NO_SCROLLWND)
  1810. break;
  1811. case CExtPaintManager::__ESBMHT_PAGE_UP:
  1812. bUpStep = true;
  1813. // continue falling here ...
  1814. case CExtPaintManager::__ESBMHT_PAGE_DOWN:
  1815. nStepSize = (INT)_psbd.m_DSI.nPage;
  1816. #if (!defined __EXT_MFC_NO_SCROLLWND)
  1817. if( pExtScrollWnd != NULL )
  1818. {
  1819. int nDir = ( _psbd.m_eSBMHT == CExtPaintManager::__ESBMHT_PAGE_DOWN ) ? (+1) : (-1);
  1820. CSize _size = pExtScrollWnd->OnSwGetPageSize( nDir );
  1821. nStepSize = _psbd.m_bHorzBar ? _size.cx : _size.cy;
  1822. }
  1823. #endif // (!defined __EXT_MFC_NO_SCROLLWND)
  1824. if( nStepSize <= 0L )
  1825. nStepSize = GetStepSize(); // nStepSize = 1L;
  1826. break;
  1827. case CExtPaintManager::__ESBMHT_THUMB:
  1828. break;
  1829. } // switch( _psbd.m_eSBMHT )
  1830. bool bMenuMode = false;
  1831. if( CExtPopupMenuWnd::IsMenuTracking() )
  1832. {
  1833. // CExtPopupMenuWnd * pPopup = CExtPopupMenuSite::g_DefPopupMenuSite.GetInstance();
  1834. // if( pPopup != NULL )
  1835. // {
  1836. // CWnd * pWnd = GetParent();
  1837. // for( ; pWnd != NULL; pWnd = pWnd->GetParent() )
  1838. // {
  1839. // if( pWnd == pPopup )
  1840. // {
  1841. // bMenuMode = true;
  1842. // break;
  1843. // } // if( pWnd == pPopup )
  1844. // } // for( ; pWnd != NULL; pWnd = pWnd->GetParent() )
  1845. // } // if( pPopup != NULL )
  1846. CWnd * pWnd = GetParent();
  1847. for( ; pWnd != NULL; pWnd = pWnd->GetParent() )
  1848. {
  1849. if( pWnd->IsKindOf( RUNTIME_CLASS(CExtPopupMenuWnd) ) )
  1850. {
  1851. bMenuMode = true;
  1852. break;
  1853. } // if( pWnd == pPopup )
  1854. if( (pWnd->GetStyle()&WS_CHILD) == 0 )
  1855. break;
  1856. } // for( ; pWnd != NULL; pWnd = pWnd->GetParent() )
  1857. } // if( CExtPopupMenuWnd::IsMenuTracking() )
  1858. INT nMx = INT( _psbd.m_DSI.nMax - _psbd.m_DSI.nPage + 1 );
  1859. INT nScrollLimit =
  1860.   _psbd.m_DSI.nMax
  1861. - _psbd.m_DSI.nMin
  1862. - _psbd.m_DSI.nPage
  1863. + 1
  1864. ;
  1865. ASSERT( nScrollLimit >= 0 );
  1866. if( nStepSize > nScrollLimit )
  1867. nStepSize = nScrollLimit;
  1868. CRect rcScrollable = _psbd.m_rcBar;
  1869. if( _psbd.m_bHorzBar )
  1870. {
  1871. rcScrollable.left = _psbd.m_rcButtonUp.right;
  1872. rcScrollable.right = _psbd.m_rcButtonDown.left;
  1873. }
  1874. else
  1875. {
  1876. rcScrollable.top = _psbd.m_rcButtonUp.bottom;
  1877. rcScrollable.bottom = _psbd.m_rcButtonDown.top;
  1878. }
  1879. ScrollBar_CaptureSet(); //::SetCapture( hWndOwn );
  1880. if( nStepSize != 0L )
  1881. {
  1882. ::PostMessage( hWndOwn, WM_TIMER, WPARAM(nTimerID_zero_start), LPARAM(0L) );
  1883. //::SetTimer( hWndOwn, nTimerID_1st_slow, nTimerEllapse_1st_slow, NULL );
  1884. }
  1885. for( MSG msg; ::IsWindow( hWndOwn ) && (!bStopFlag); )
  1886. {
  1887. if( ! PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
  1888. {
  1889. if( ! ::IsWindow( hWndOwn ) )
  1890. break;
  1891. ::WaitMessage();
  1892. continue;
  1893. } // if( !PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
  1894. bool bAnalyzeThumb = false;
  1895. switch( msg.message )
  1896. {
  1897. case WM_LBUTTONDBLCLK:
  1898. case WM_LBUTTONUP:
  1899. case WM_RBUTTONDBLCLK:
  1900. case WM_RBUTTONDOWN:
  1901. case WM_RBUTTONUP:
  1902. case WM_MBUTTONDBLCLK:
  1903. case WM_MBUTTONDOWN:
  1904. case WM_MBUTTONUP:
  1905. case WM_CANCELMODE:
  1906. case WM_ACTIVATEAPP:
  1907. case WM_KEYDOWN:
  1908. case WM_KEYUP:
  1909. bStopFlag = true;
  1910. break;
  1911. case WM_CAPTURECHANGED:
  1912. if( (HWND)msg.wParam != hWndOwn )
  1913. bStopFlag = true;
  1914. break;
  1915. case WM_MOUSEMOVE:
  1916. if( m_nSBMHT == INT(CExtPaintManager::__ESBMHT_THUMB) )
  1917. {
  1918. if( ( ! CExtPopupMenuWnd::IsKeyPressed( bMouseButtonsNotSwapped ? VK_LBUTTON : VK_RBUTTON,true) )
  1919. || CExtPopupMenuWnd::IsKeyPressed( VK_MBUTTON )
  1920. || CExtPopupMenuWnd::IsKeyPressed( bMouseButtonsNotSwapped ?  VK_RBUTTON : VK_LBUTTON,true )
  1921. || ( (!bMenuMode) && CExtPopupMenuWnd::IsMenuTracking() )
  1922. )
  1923. {
  1924. bStopFlag = true;
  1925. break;
  1926. }
  1927. PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE);
  1928. bAnalyzeThumb = true;
  1929. ::GetCursorPos( &ptCursor );
  1930. ::ScreenToClient( hWndOwn, &ptCursor );
  1931. break;
  1932. } // if( m_nSBMHT == INT(CExtPaintManager::__ESBMHT_THUMB) )
  1933. if( nStepSize == 0 )
  1934. break;
  1935. case WM_TIMER:
  1936. {
  1937. if( ( ! CExtPopupMenuWnd::IsKeyPressed( bMouseButtonsNotSwapped ? VK_LBUTTON : VK_RBUTTON,true) )
  1938. || CExtPopupMenuWnd::IsKeyPressed( VK_MBUTTON )
  1939. || CExtPopupMenuWnd::IsKeyPressed( bMouseButtonsNotSwapped ? VK_RBUTTON : VK_LBUTTON,true )
  1940. || ( (!bMenuMode) && CExtPopupMenuWnd::IsMenuTracking() )
  1941. )
  1942. {
  1943. bStopFlag = true;
  1944. break;
  1945. }
  1946. if( msg.hwnd != hWndOwn )
  1947. break;
  1948. if( msg.wParam != nTimerID_zero_start
  1949. && msg.wParam != nTimerID_1st_slow
  1950. && msg.wParam != nTimerID_2nd_fast
  1951. )
  1952. break;
  1953. if( msg.wParam == nTimerID_zero_start )
  1954. ::SetTimer( hWndOwn, nTimerID_1st_slow, nTimerEllapse_1st_slow, NULL );
  1955. else if( msg.wParam == nTimerID_1st_slow )
  1956. {
  1957. ::KillTimer( hWndOwn, nTimerID_1st_slow );
  1958. CExtPaintManager::stat_PassPaintMessages();
  1959. ::SetTimer( hWndOwn, nTimerID_2nd_fast, nTimerEllapse_2nd_fast, NULL );
  1960. }
  1961. ASSERT( nStepSize != 0L );
  1962. PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE);
  1963. ::GetCursorPos( &ptCursor );
  1964. ::ScreenToClient( hWndOwn, &ptCursor );
  1965. bool bPause = false;
  1966. if( ! rcArea.PtInRect( ptCursor ) )
  1967. bPause = true;
  1968. else
  1969. {
  1970. if( m_nSBMHT == INT(CExtPaintManager::__ESBMHT_PAGE_UP)
  1971. || m_nSBMHT == INT(CExtPaintManager::__ESBMHT_PAGE_DOWN)
  1972. )
  1973. { // update changed area rect (page up/down cases)
  1974. CExtPaintManager::PAINTSCROLLBARDATA _psbd2( this );
  1975. _psbd2.AdjustHT( ptCursor );
  1976. INT nSBMHT2 = INT( _psbd.m_eSBMHT );
  1977. if( nSBMHT2 != m_nSBMHT )
  1978. bPause = true;
  1979. else
  1980. {
  1981. CRect rcArea2 = _psbd2.GetAreaRectHT();
  1982. if( ! rcArea2.PtInRect( ptCursor ) )
  1983. bPause = true;
  1984. else
  1985. {
  1986. if( _psbd2.m_bHorzBar )
  1987. {
  1988. if( m_nSBMHT == INT(CExtPaintManager::__ESBMHT_PAGE_UP) )
  1989. {
  1990. if( ptCursor.x >= _psbd2.m_rcThumb.left )
  1991. bPause = true;
  1992. }
  1993. else if( m_nSBMHT == INT(CExtPaintManager::__ESBMHT_PAGE_DOWN) )
  1994. {
  1995. if( ptCursor.x <= _psbd2.m_rcThumb.right )
  1996. bPause = true;
  1997. }
  1998. }
  1999. else
  2000. {
  2001. if( m_nSBMHT == INT(CExtPaintManager::__ESBMHT_PAGE_UP) )
  2002. {
  2003. if( ptCursor.y >= _psbd2.m_rcThumb.top )
  2004. bPause = true;
  2005. }
  2006. else if( m_nSBMHT == INT(CExtPaintManager::__ESBMHT_PAGE_DOWN) )
  2007. {
  2008. if( ptCursor.y <= _psbd2.m_rcThumb.bottom )
  2009. bPause = true;
  2010. }
  2011. }
  2012. }
  2013. }
  2014. } // update changed area rect (page up/down cases)
  2015. }
  2016. if( bPause )
  2017. {
  2018. if( ! m_bProcessingOutClick )
  2019. {
  2020. m_bProcessingOutClick = true;
  2021. Invalidate();
  2022. }
  2023. if( pATTW != NULL )
  2024. pATTW->Hide();
  2025. continue;
  2026. }
  2027. if( bUpStep )
  2028. {
  2029. nScrollPos -= nStepSize;
  2030. if( nScrollPos < _psbd.m_DSI.nMin )
  2031. nScrollPos = _psbd.m_DSI.nMin;
  2032. } // if( bUpStep )
  2033. else
  2034. {
  2035. nScrollPos += nStepSize;
  2036. if( nScrollPos > nMx )
  2037. nScrollPos = nMx;
  2038. } // else from if( bUpStep )
  2039. if( m_bSendEqualNotifications || _GetScrollPos( true ) != nScrollPos )
  2040. {
  2041. bool bSendScrollingNotification = true, bTrackPos = true;
  2042. if( hWndParent != NULL )
  2043. {
  2044. switch( m_nSBMHT )
  2045. {
  2046. case (CExtPaintManager::__ESBMHT_BUTTON_UP):
  2047. // bSendScrollingNotification = false;
  2048. if( m_bSendActionNotifications )
  2049. ::SendMessage(
  2050. hWndParent,
  2051. _psbd.m_bHorzBar ? WM_HSCROLL : WM_VSCROLL,
  2052. MAKEWPARAM(
  2053. ( _psbd.m_bHorzBar ? SB_LINELEFT : SB_LINEUP ),
  2054. 0
  2055. ),
  2056. LPARAM(m_hWnd)
  2057. );
  2058. if( ! bVirtualMode )
  2059. _SetScrollPos( nScrollPos, bTrackPos, true, bSendScrollingNotification );
  2060. else
  2061. bFinalNotify = (!m_bSendActionNotifications); // false;
  2062. break;
  2063. case (CExtPaintManager::__ESBMHT_BUTTON_DOWN):
  2064. // bSendScrollingNotification = false;
  2065. if( m_bSendActionNotifications )
  2066. ::SendMessage(
  2067. hWndParent,
  2068. _psbd.m_bHorzBar ? WM_HSCROLL : WM_VSCROLL,
  2069. MAKEWPARAM(
  2070. ( _psbd.m_bHorzBar ? SB_LINERIGHT : SB_LINEDOWN ),
  2071. 0
  2072. ),
  2073. LPARAM(m_hWnd)
  2074. );
  2075. if( ! bVirtualMode )
  2076. _SetScrollPos( nScrollPos, bTrackPos, true, bSendScrollingNotification );
  2077. else
  2078. bFinalNotify = (!m_bSendActionNotifications); // false;
  2079. break;
  2080. case (CExtPaintManager::__ESBMHT_PAGE_UP):
  2081. // bSendScrollingNotification = false;
  2082. if( m_bSendActionNotifications )
  2083. ::SendMessage(
  2084. hWndParent,
  2085. _psbd.m_bHorzBar ? WM_HSCROLL : WM_VSCROLL,
  2086. MAKEWPARAM(
  2087. ( _psbd.m_bHorzBar ? SB_PAGELEFT : SB_PAGEUP ),
  2088. 0
  2089. ),
  2090. LPARAM(m_hWnd)
  2091. );
  2092. if( ! bVirtualMode )
  2093. _SetScrollPos( nScrollPos, bTrackPos, true, bSendScrollingNotification );
  2094. else
  2095. bFinalNotify = (!m_bSendActionNotifications); // false;
  2096. break;
  2097. case (CExtPaintManager::__ESBMHT_PAGE_DOWN):
  2098. // bSendScrollingNotification = false;
  2099. if( m_bSendActionNotifications )
  2100. ::SendMessage(
  2101. hWndParent,
  2102. _psbd.m_bHorzBar ? WM_HSCROLL : WM_VSCROLL,
  2103. MAKEWPARAM(
  2104. ( _psbd.m_bHorzBar ? SB_PAGERIGHT : SB_PAGEDOWN ),
  2105. 0
  2106. ),
  2107. LPARAM(m_hWnd)
  2108. );
  2109. if( ! bVirtualMode )
  2110. _SetScrollPos( nScrollPos, bTrackPos, true, bSendScrollingNotification );
  2111. else
  2112. bFinalNotify = (!m_bSendActionNotifications); // false;
  2113. break;
  2114. case (CExtPaintManager::__ESBMHT_THUMB):
  2115. bTrackPos = true;
  2116. if( ! bVirtualMode )
  2117. _SetScrollPos( nScrollPos, bTrackPos, true, bSendScrollingNotification );
  2118. else
  2119. bFinalNotify = false; // (!m_bSendActionNotifications); // false;
  2120. break;
  2121. } // switch( m_nSBMHT )
  2122. } // if( hWndParent != NULL )
  2123. //  if( ! bVirtualMode )
  2124. //  _SetScrollPos( nScrollPos, bTrackPos, true, bSendScrollingNotification );
  2125. //  else
  2126. //  bFinalNotify = false;
  2127. if( pATTW != NULL && ( ! bAnalyzeThumb ) )
  2128. OnAdvancedPopupMenuTipWndDisplay( *pATTW, m_nSBMHT, true );
  2129. } // if( m_bSendEqualNotifications || _GetScrollPos( true ) != nScrollPos )
  2130. CExtPaintManager::PAINTSCROLLBARDATA _psbd2( this );
  2131. ::memcpy( &_psbd.m_DSI, &_psbd2.m_DSI, sizeof(SCROLLINFO) );
  2132. nMx = INT( _psbd.m_DSI.nMax - _psbd.m_DSI.nPage + 1 );
  2133. nScrollLimit =
  2134.   _psbd.m_DSI.nMax
  2135. - _psbd.m_DSI.nMin
  2136. - _psbd.m_DSI.nPage
  2137. + 1
  2138. ;
  2139. ASSERT( nScrollLimit >= 0 );
  2140. if( nStepSize > nScrollLimit )
  2141. nStepSize = nScrollLimit;
  2142. _psbd.AdjustHT( ptCursor );
  2143. bool bProcessingOutClick =
  2144. ( m_nSBMHT == INT(_psbd.m_eSBMHT) )
  2145. ? false : true;
  2146. rcArea = _psbd.GetAreaRect( CExtPaintManager::e_scroll_bar_mouse_hover_type_t(m_nSBMHT) );
  2147. if( m_bProcessingOutClick != bProcessingOutClick )
  2148. {
  2149. bool bAnimationLocked = AnimationClient_CacheGeneratorIsLocked();
  2150. if( ! bAnimationLocked )
  2151. {
  2152. AnimationClient_CacheGeneratorLock();
  2153. // if( AnimationClient_StateGet(true).IsEmpty() )
  2154.   AnimationClient_CacheNextStateMinInfo(
  2155. false,
  2156. __EAPT_BY_PRESSED_STATE_TURNED_OFF
  2157. );
  2158. }
  2159. m_bProcessingOutClick = bProcessingOutClick;
  2160. if( ! bAnimationLocked )
  2161. {
  2162.   AnimationClient_CacheNextStateMinInfo(
  2163. true,
  2164. __EAPT_BY_PRESSED_STATE_TURNED_OFF
  2165. );
  2166. AnimationClient_CacheGeneratorUnlock();
  2167. }
  2168. Invalidate();
  2169. UpdateWindow();
  2170. }
  2171. }
  2172. break;
  2173. default:
  2174. {
  2175. if( ( ! CExtPopupMenuWnd::IsKeyPressed( bMouseButtonsNotSwapped ? VK_LBUTTON : VK_RBUTTON,true) )
  2176. || CExtPopupMenuWnd::IsKeyPressed( VK_MBUTTON )
  2177. || CExtPopupMenuWnd::IsKeyPressed( bMouseButtonsNotSwapped ? VK_RBUTTON : VK_LBUTTON,true )
  2178. || ( (!bMenuMode) && CExtPopupMenuWnd::IsMenuTracking() )
  2179. )
  2180. bStopFlag = true;
  2181. }
  2182. break;
  2183. } // switch( msg.message )
  2184. if( ! ::IsWindow( hWndOwn ) )
  2185. bStopFlag = true;
  2186. if( bStopFlag || nScrollLimit == 0L )
  2187. break;
  2188. if( bAnalyzeThumb )
  2189. {
  2190. LONG nPixelOffset = _psbd.m_bHorzBar
  2191. ? (ptCursor.x - point.x)
  2192. : (ptCursor.y - point.y);
  2193. LONG nPixelExtent = _psbd.m_bHorzBar
  2194. ? (rcScrollable.Width() - _psbd.m_rcThumb.Width())
  2195. : (rcScrollable.Height() - _psbd.m_rcThumb.Height());
  2196. if( nPixelExtent <= 0 )
  2197. {
  2198. bStopFlag = true;
  2199. break;
  2200. } // if( nPixelExtent <= 0 )
  2201. if( abs(nPixelOffset) > nPixelExtent )
  2202. nPixelOffset =
  2203. (nPixelOffset < 0)
  2204. ? (-nPixelExtent)
  2205. : nPixelExtent;
  2206. INT nShift =
  2207. ( nPixelExtent == 0 || nPixelOffset == 0 )
  2208. ? 0
  2209. : ::MulDiv( nScrollLimit, abs(nPixelOffset), nPixelExtent );
  2210. nScrollPos = nScrollPosStart;
  2211. if( nPixelOffset < 0 )
  2212. {
  2213. nScrollPos -= nShift;
  2214. if( nScrollPos < _psbd.m_DSI.nMin )
  2215. nScrollPos = _psbd.m_DSI.nMin;
  2216. } // if( nPixelOffset < 0 )
  2217. else
  2218. {
  2219. nScrollPos += nShift;
  2220. if( nScrollPos > nMx )
  2221. nScrollPos = nMx;
  2222. } // else from if( nPixelOffset < 0 )
  2223. if( (! bVirtualMode )
  2224. // || nScrollPos == _psbd.m_DSI.nMin
  2225. // || nScrollPos >= _psbd.m_DSI.nMax-200000
  2226. )
  2227. {
  2228. if( m_bSendEqualNotifications || _GetScrollPos( true ) != nScrollPos )
  2229. {
  2230. _SetScrollPos( nScrollPos, true );
  2231. if( pATTW != NULL )
  2232. OnAdvancedPopupMenuTipWndDisplay( *pATTW, m_nSBMHT, true );
  2233. } // if( m_bSendEqualNotifications || _GetScrollPos( true ) != nScrollPos )
  2234. bFinalNotify = true;
  2235. }
  2236. CExtPaintManager::PAINTSCROLLBARDATA _psbd2( this );
  2237. ::memcpy( &_psbd.m_DSI, &_psbd2.m_DSI, sizeof(SCROLLINFO) );
  2238. nMx = INT( _psbd.m_DSI.nMax - _psbd.m_DSI.nPage + 1 );
  2239. nScrollLimit =
  2240.   _psbd.m_DSI.nMax
  2241. - _psbd.m_DSI.nMin
  2242. - _psbd.m_DSI.nPage
  2243. + 1
  2244. ;
  2245. ASSERT( nScrollLimit >= 0 );
  2246. if( nStepSize > nScrollLimit )
  2247. nStepSize = nScrollLimit;
  2248. _psbd.AdjustHT( ptCursor );
  2249. // bool bProcessingOutClick =
  2250. // ( m_nSBMHT == INT(_psbd.m_eSBMHT) )
  2251. // ? false : true;
  2252. rcArea = _psbd.GetAreaRect( CExtPaintManager::__ESBMHT_THUMB );
  2253. // if( m_bProcessingOutClick != bProcessingOutClick )
  2254. // {
  2255. // m_bProcessingOutClick = bProcessingOutClick;
  2256. // Invalidate();
  2257. // UpdateWindow();
  2258. // }
  2259. continue;
  2260. } // if( bAnalyzeThumb )
  2261. if( m_bPopupInactiveLightMode
  2262. && ( msg.message == WM_TIMER
  2263. || (__EXT_MFC_WM_MOUSEFIRST <= msg.message && msg.message <= __EXT_MFC_WM_MOUSELAST )
  2264. )
  2265. )
  2266. ::PeekMessage(&msg,NULL,msg.message,msg.message,PM_REMOVE);
  2267. else
  2268. if( ! AfxGetThread()->PumpMessage() )
  2269. break;
  2270. } // for( MSG msg; ::IsWindow( hWndOwn ) && (!bStopFlag); )
  2271. if( ! ::IsWindow( hWndOwn ) )
  2272. return;
  2273. if( nStepSize != 0L )
  2274. {
  2275. ::KillTimer( hWndOwn, nTimerID_1st_slow );
  2276. ::KillTimer( hWndOwn, nTimerID_2nd_fast );
  2277. }
  2278. bAnimationLocked = AnimationClient_CacheGeneratorIsLocked();
  2279. if( ! bAnimationLocked )
  2280. {
  2281. AnimationClient_CacheGeneratorLock();
  2282. if( AnimationClient_StateGet(true).IsEmpty() )
  2283.   AnimationClient_CacheNextStateMinInfo(
  2284. false,
  2285. __EAPT_BY_PRESSED_STATE_TURNED_OFF
  2286. );
  2287. }
  2288. //  if( nScrollPos > INT(_psbd.m_DSI.nMax-_psbd.m_DSI.nMin-_psbd.m_DSI.nPage) )
  2289. //  nScrollPos = INT(_psbd.m_DSI.nMax-_psbd.m_DSI.nMin-_psbd.m_DSI.nPage);
  2290. if( bFinalNotify
  2291. // && _GetScrollPos( false ) != nScrollPos
  2292. )
  2293. {
  2294. bool bSendScrollingNotification = true;
  2295. // switch( m_nSBMHT )
  2296. // {
  2297. // case (CExtPaintManager::__ESBMHT_BUTTON_UP):
  2298. // case (CExtPaintManager::__ESBMHT_BUTTON_DOWN):
  2299. // case (CExtPaintManager::__ESBMHT_PAGE_UP):
  2300. // case (CExtPaintManager::__ESBMHT_PAGE_DOWN):
  2301. // bSendScrollingNotification = false;
  2302. // break;
  2303. // }
  2304. // _SetScrollPos( nScrollPos, true, false, bSendScrollingNotification );
  2305. _SetScrollPos( nScrollPos, false, true, bSendScrollingNotification );
  2306. }
  2307. m_nSBMHT = INT(CExtPaintManager::__ESBMHT_NOWHERE);
  2308. m_bProcessingClick
  2309. = m_bProcessingOutClick
  2310. = m_bProcessingHover
  2311. = false;
  2312. if( ! bAnimationLocked )
  2313. {
  2314. ::GetCursorPos( &ptCursor );
  2315. ScreenToClient( &ptCursor );
  2316. _psbd.AdjustHT( ptCursor );
  2317. m_nSBMHT = INT(_psbd.m_eSBMHT);
  2318.   AnimationClient_CacheNextStateMinInfo(
  2319. true,
  2320. __EAPT_BY_PRESSED_STATE_TURNED_OFF
  2321. );
  2322. AnimationClient_CacheGeneratorUnlock();
  2323. }
  2324. Invalidate();
  2325. UpdateWindow();
  2326. m_nHelperTrackPos = -1;
  2327. m_bHelperHaveTrackPos = false;
  2328. // if( ::GetCapture() == hWndOwn )
  2329. // ::ReleaseCapture();
  2330. ScrollBar_CaptureRelease();
  2331. if( pATTW != NULL )
  2332. OnAdvancedPopupMenuTipWndDisplay( *pATTW, INT(_psbd.m_eSBMHT), false );
  2333. ::SendMessage(
  2334. hWndParent,
  2335. _psbd.m_bHorzBar ? WM_HSCROLL : WM_VSCROLL,
  2336. MAKEWPARAM( SB_ENDSCROLL, 0 ), // MAKEWPARAM( SB_ENDSCROLL, nPos ),
  2337. LPARAM(m_hWnd)
  2338. );
  2339. if( m_bEnableHookSpy )
  2340. HookSpyRegister( __EHSEF_MOUSE_ALL_WITHOUT_WHEEL|__EHSEF_WND_PROC_IN|__EHSEF_PRE_TRANSLATION );
  2341. }
  2342. void CExtScrollBar::OnLButtonUp(UINT nFlags, CPoint point)
  2343. {
  2344. ASSERT_VALID( this );
  2345. if( ! m_bCompleteRepaint )
  2346. {
  2347. CScrollBar::OnLButtonUp( nFlags, point );
  2348. return;
  2349. }
  2350. MSG _msg;
  2351. ::memset( &_msg, 0, sizeof(MSG) );
  2352. _msg.hwnd = m_hWnd;
  2353.     _msg.message = WM_LBUTTONUP;
  2354.     _msg.wParam = WPARAM(nFlags);
  2355.     _msg.lParam = MAKELPARAM( point.x ,point.y );
  2356. ScrollBar_OnMouseClickMsg( &_msg );
  2357. }
  2358. void CExtScrollBar::OnLButtonDblClk(UINT nFlags, CPoint point)
  2359. {
  2360. ASSERT_VALID( this );
  2361. if( ! m_bCompleteRepaint )
  2362. {
  2363. CScrollBar::OnLButtonDblClk( nFlags, point );
  2364. return;
  2365. }
  2366. MSG _msg;
  2367. ::memset( &_msg, 0, sizeof(MSG) );
  2368. _msg.hwnd = m_hWnd;
  2369.     _msg.message = WM_LBUTTONDOWN; // WM_LBUTTONDBLCLK;
  2370.     _msg.wParam = WPARAM(nFlags);
  2371.     _msg.lParam = MAKELPARAM( point.x ,point.y );
  2372. ScrollBar_OnMouseClickMsg( &_msg );
  2373. }
  2374. void CExtScrollBar::OnMButtonDown(UINT nFlags, CPoint point)
  2375. {
  2376. ASSERT_VALID( this );
  2377. if( ! m_bCompleteRepaint )
  2378. {
  2379. CScrollBar::OnMButtonDown( nFlags, point );
  2380. return;
  2381. }
  2382. MSG _msg;
  2383. ::memset( &_msg, 0, sizeof(MSG) );
  2384. _msg.hwnd = m_hWnd;
  2385.     _msg.message = WM_MBUTTONDOWN;
  2386.     _msg.wParam = WPARAM(nFlags);
  2387.     _msg.lParam = MAKELPARAM( point.x ,point.y );
  2388. ScrollBar_OnMouseClickMsg( &_msg );
  2389. }
  2390. void CExtScrollBar::OnMButtonUp(UINT nFlags, CPoint point)
  2391. {
  2392. ASSERT_VALID( this );
  2393. if( ! m_bCompleteRepaint )
  2394. {
  2395. CScrollBar::OnMButtonUp( nFlags, point );
  2396. return;
  2397. }
  2398. MSG _msg;
  2399. ::memset( &_msg, 0, sizeof(MSG) );
  2400. _msg.hwnd = m_hWnd;
  2401.     _msg.message = WM_MBUTTONUP;
  2402.     _msg.wParam = WPARAM(nFlags);
  2403.     _msg.lParam = MAKELPARAM( point.x ,point.y );
  2404. ScrollBar_OnMouseClickMsg( &_msg );
  2405. }
  2406. void CExtScrollBar::OnMButtonDblClk(UINT nFlags, CPoint point)
  2407. {
  2408. ASSERT_VALID( this );
  2409. if( ! m_bCompleteRepaint )
  2410. {
  2411. CScrollBar::OnMButtonDblClk( nFlags, point );
  2412. return;
  2413. }
  2414. MSG _msg;
  2415. ::memset( &_msg, 0, sizeof(MSG) );
  2416. _msg.hwnd = m_hWnd;
  2417.     _msg.message = WM_MBUTTONDBLCLK;
  2418.     _msg.wParam = WPARAM(nFlags);
  2419.     _msg.lParam = MAKELPARAM( point.x ,point.y );
  2420. ScrollBar_OnMouseClickMsg( &_msg );
  2421. }
  2422. void CExtScrollBar::OnRButtonDown(UINT nFlags, CPoint point)
  2423. {
  2424. ASSERT_VALID( this );
  2425. if( ! m_bCompleteRepaint )
  2426. {
  2427. CScrollBar::OnRButtonDown( nFlags, point );
  2428. return;
  2429. }
  2430. MSG _msg;
  2431. ::memset( &_msg, 0, sizeof(MSG) );
  2432. _msg.hwnd = m_hWnd;
  2433.     _msg.message = WM_RBUTTONDOWN;
  2434.     _msg.wParam = WPARAM(nFlags);
  2435.     _msg.lParam = MAKELPARAM( point.x ,point.y );
  2436. if( ScrollBar_OnMouseClickMsg( &_msg ) )
  2437. return;
  2438. if( ! m_bEnableCtxMenu )
  2439. return;
  2440. CExtPopupMenuTipWnd * pATTW = OnAdvancedPopupMenuTipWndGet();
  2441. if( pATTW != NULL )
  2442. pATTW->Hide();
  2443. m_ptCtxMenuCache = point;
  2444. CPoint ptScreen = point;
  2445. ClientToScreen( &ptScreen );
  2446. SendMessage( WM_CONTEXTMENU, WPARAM(m_hWnd), MAKELPARAM(ptScreen.x,ptScreen.y) );
  2447. }
  2448. void CExtScrollBar::OnRButtonUp(UINT nFlags, CPoint point)
  2449. {
  2450. ASSERT_VALID( this );
  2451. if( ! m_bCompleteRepaint )
  2452. {
  2453. CScrollBar::OnRButtonUp( nFlags, point );
  2454. return;
  2455. }
  2456. MSG _msg;
  2457. ::memset( &_msg, 0, sizeof(MSG) );
  2458. _msg.hwnd = m_hWnd;
  2459.     _msg.message = WM_RBUTTONUP;
  2460.     _msg.wParam = WPARAM(nFlags);
  2461.     _msg.lParam = MAKELPARAM( point.x ,point.y );
  2462. ScrollBar_OnMouseClickMsg( &_msg );
  2463. }
  2464. void CExtScrollBar::OnRButtonDblClk(UINT nFlags, CPoint point)
  2465. {
  2466. ASSERT_VALID( this );
  2467. if( ! m_bCompleteRepaint )
  2468. {
  2469. CScrollBar::OnRButtonDblClk( nFlags, point );
  2470. return;
  2471. }
  2472. MSG _msg;
  2473. ::memset( &_msg, 0, sizeof(MSG) );
  2474. _msg.hwnd = m_hWnd;
  2475.     _msg.message = WM_RBUTTONDBLCLK;
  2476.     _msg.wParam = WPARAM(nFlags);
  2477.     _msg.lParam = MAKELPARAM( point.x ,point.y );
  2478. ScrollBar_OnMouseClickMsg( &_msg );
  2479. }
  2480. void CExtScrollBar::OnTimer(__EXT_MFC_UINT_PTR nIDEvent)
  2481. {
  2482. ASSERT_VALID( this );
  2483. if( AnimationSite_OnHookTimer( UINT(nIDEvent) ) )
  2484. return;
  2485. CScrollBar::OnTimer( nIDEvent );
  2486. }
  2487. void CExtScrollBar::OnContextMenu( CWnd * pWnd, CPoint point )
  2488. {
  2489.     ASSERT_VALID( this );
  2490. if( ! m_bCompleteRepaint )
  2491. {
  2492. CScrollBar::OnContextMenu( pWnd, point );
  2493. return;
  2494. }
  2495. if( ! m_bEnableCtxMenu )
  2496. return;
  2497. DWORD dwStyle = GetStyle();
  2498. if( ( dwStyle & SBS_SIZEBOX ) != 0 )
  2499. return;
  2500. SCROLLINFO scrollInfo;
  2501. ::memset( &scrollInfo, 0, sizeof(SCROLLINFO) );
  2502. scrollInfo.cbSize = sizeof( SCROLLINFO );
  2503. scrollInfo.fMask = SIF_ALL;
  2504. if( ! GetScrollInfo( &scrollInfo ) )
  2505. return;
  2506. if( CExtPopupMenuWnd::IsMenuTracking() )
  2507. return;
  2508. CExtNCSB_ScrollContainer * pScrollContainer = _GetParentScrollContainer();
  2509. if( pScrollContainer != NULL )
  2510. {
  2511. HWND hWndScrollingTarget = pScrollContainer->GetSafeScrollingTargetHWND();
  2512. if( hWndScrollingTarget != NULL && ::IsWindow( hWndScrollingTarget ) )
  2513. {
  2514. TCHAR strClassName[ 512 ];
  2515. ::memset( strClassName, 0, sizeof(strClassName) );
  2516. ::GetClassName( hWndScrollingTarget, strClassName, 512 );
  2517. if( _tcslen( strClassName ) > 0  )
  2518. {
  2519. __EXT_MFC_STRLWR( strClassName, 512 );
  2520. if( _tcscmp( strClassName, _T("combolbox") ) == 0 )
  2521. {
  2522. //__EXT_MFC_LONG_PTR dwWndStyle = ::__EXT_MFC_GetWindowLong( hWndScrollingTarget, GWL_STYLE );
  2523. //if( ( dwWndStyle & WS_CHILD ) == 0 )
  2524. return;
  2525. }
  2526. }
  2527. }
  2528. }
  2529. bool bVert = ( ( dwStyle & SBS_VERT ) != 0 ) ? true : false;
  2530. HWND hWndOwn = m_hWnd;
  2531. HWND hWndFocus = ::GetFocus();
  2532. if( hWndFocus == NULL )
  2533. {
  2534. hWndFocus = ::GetParent( m_hWnd );
  2535. if( hWndFocus == NULL )
  2536. hWndFocus = hWndOwn;
  2537. ::SetFocus( hWndFocus );
  2538. if( ! ::IsWindow( hWndOwn ) )
  2539. return;
  2540. }
  2541. CExtPopupMenuWnd * pPopup =
  2542. CExtPopupMenuWnd::InstantiatePopupMenu(
  2543. GetSafeHwnd(),
  2544. RUNTIME_CLASS(CExtPopupMenuWnd),
  2545. this
  2546. );
  2547. if( pPopup == NULL )
  2548. return;
  2549. if( ! pPopup->CreatePopupMenu( hWndOwn ) )
  2550. {
  2551. ASSERT( FALSE );
  2552. return;
  2553. }
  2554. CExtSafeString strMenuItemText;
  2555. strMenuItemText = _T("Scroll Here");
  2556. VERIFY( pPopup->ItemInsertCommand( __EXT_ID_SCROLL_HERE, -1, LPCTSTR(strMenuItemText), NULL, NULL, false, 0, hWndOwn ) );
  2557. VERIFY( pPopup->ItemInsert() );
  2558. if( bVert )
  2559. {
  2560. strMenuItemText = _T("Top");
  2561. VERIFY( pPopup->ItemInsertCommand( __EXT_ID_SCROLL_EDGE_LOWER, -1, LPCTSTR(strMenuItemText), NULL, NULL, false, 0, hWndOwn ) );
  2562. strMenuItemText = _T("Bottom");
  2563. VERIFY( pPopup->ItemInsertCommand( __EXT_ID_SCROLL_EDGE_UPPER, -1, LPCTSTR(strMenuItemText), NULL, NULL, false, 0, hWndOwn ) );
  2564. VERIFY( pPopup->ItemInsert() );
  2565. strMenuItemText = _T("Page Up");
  2566. VERIFY( pPopup->ItemInsertCommand( __EXT_ID_SCROLL_PAGE_LOWER, -1, LPCTSTR(strMenuItemText), NULL, NULL, false, 0, hWndOwn ) );
  2567. strMenuItemText = _T("Page Down");
  2568. VERIFY( pPopup->ItemInsertCommand( __EXT_ID_SCROLL_PAGE_UPPER, -1, LPCTSTR(strMenuItemText), NULL, NULL, false, 0, hWndOwn ) );
  2569. VERIFY( pPopup->ItemInsert() );
  2570. strMenuItemText = _T("Scroll Up");
  2571. VERIFY( pPopup->ItemInsertCommand( __EXT_ID_SCROLL_LINE_LOWER, -1, LPCTSTR(strMenuItemText), NULL, NULL, false, 0, hWndOwn ) );
  2572. strMenuItemText = _T("Scroll Down");
  2573. VERIFY( pPopup->ItemInsertCommand( __EXT_ID_SCROLL_LINE_UPPER, -1, LPCTSTR(strMenuItemText), NULL, NULL, false, 0, hWndOwn ) );
  2574. } // if( bVert )
  2575. else
  2576. {
  2577. strMenuItemText = _T("Left Edge");
  2578. VERIFY( pPopup->ItemInsertCommand( __EXT_ID_SCROLL_EDGE_LOWER, -1, LPCTSTR(strMenuItemText), NULL, NULL, false, 0, hWndOwn ) );
  2579. strMenuItemText = _T("Right Edge");
  2580. VERIFY( pPopup->ItemInsertCommand( __EXT_ID_SCROLL_EDGE_UPPER, -1, LPCTSTR(strMenuItemText), NULL, NULL, false, 0, hWndOwn ) );
  2581. VERIFY( pPopup->ItemInsert() );
  2582. strMenuItemText = _T("Page Left");
  2583. VERIFY( pPopup->ItemInsertCommand( __EXT_ID_SCROLL_PAGE_LOWER, -1, LPCTSTR(strMenuItemText), NULL, NULL, false, 0, hWndOwn ) );
  2584. strMenuItemText = _T("Page Right");
  2585. VERIFY( pPopup->ItemInsertCommand( __EXT_ID_SCROLL_PAGE_UPPER, -1, LPCTSTR(strMenuItemText), NULL, NULL, false, 0, hWndOwn ) );
  2586. VERIFY( pPopup->ItemInsert() );
  2587. strMenuItemText = _T("Scroll Left");
  2588. VERIFY( pPopup->ItemInsertCommand( __EXT_ID_SCROLL_LINE_LOWER, -1, LPCTSTR(strMenuItemText), NULL, NULL, false, 0, hWndOwn ) );
  2589. strMenuItemText = _T("Scroll Right");
  2590. VERIFY( pPopup->ItemInsertCommand( __EXT_ID_SCROLL_LINE_UPPER, -1, LPCTSTR(strMenuItemText), NULL, NULL, false, 0, hWndOwn ) );
  2591. } // else from if( bVert )
  2592. if( ! pPopup->TrackPopupMenu( TPMX_NO_CMD_UI|TPMX_NO_HIDE_RARELY|TPMX_HIDE_KEYBOARD_ACCELERATORS, point.x, point.y ) )
  2593. {
  2594. delete pPopup;
  2595. ASSERT( FALSE );
  2596. return;
  2597. }
  2598. }
  2599. void CExtScrollBar::OnScrollHere()
  2600. {
  2601. ASSERT_VALID( this );
  2602. if( ! m_bEnableCtxMenu )
  2603. return;
  2604. DWORD dwStyle = GetStyle();
  2605. if( ( dwStyle & SBS_SIZEBOX ) != 0 )
  2606. return;
  2607. SCROLLINFO scrollInfo;
  2608. ::memset( &scrollInfo, 0, sizeof(SCROLLINFO) );
  2609. scrollInfo.cbSize = sizeof( SCROLLINFO );
  2610. scrollInfo.fMask = SIF_ALL;
  2611. if( ! GetScrollInfo( &scrollInfo ) )
  2612. return;
  2613. INT nRange = scrollInfo.nMax - scrollInfo.nMin;
  2614. if( nRange <= 0 || nRange <= INT(scrollInfo.nPage) )
  2615. return;
  2616. bool bVert = ( ( dwStyle & SBS_VERT ) != 0 ) ? true : false;
  2617. CRect rcClient;
  2618. GetClientRect( &rcClient );
  2619. INT nPosOld = INT( GetScrollPos() );
  2620. INT nPosNew = nPosOld;
  2621. if( bVert )
  2622. {
  2623. INT nHeight = INT( rcClient.Height() - m_nHorzBarHeight * 2 );
  2624. if( nHeight <= 1 )
  2625. return;
  2626. nPosNew = (INT) ::MulDiv( nRange, m_ptCtxMenuCache.y - m_nHorzBarHeight, nHeight ) + scrollInfo.nMin;
  2627. } // if( bVert )
  2628. else
  2629. {
  2630. INT nWidth = INT( rcClient.Width() - m_nVertBarWidth * 2 );
  2631. if( nWidth <= 1 )
  2632. return;
  2633. nPosNew = (INT) ::MulDiv( nRange, m_ptCtxMenuCache.x - m_nVertBarWidth, nWidth ) + scrollInfo.nMin;
  2634. } // else from if( bVert )
  2635. nPosNew = max( nPosNew, scrollInfo.nMin );
  2636. nPosNew = min( nPosNew, scrollInfo.nMax );
  2637. if( nPosOld != nPosNew )
  2638. {
  2639. HWND hWndInvalidate = ::GetParent( m_hWnd ), hWndOwn = m_hWnd;
  2640. _SetScrollPos( nPosNew );
  2641. if( ! ::IsWindow( hWndOwn ) )
  2642. return;
  2643. CExtNCSB_ScrollContainer * pScrollContainer = _GetParentScrollContainer();
  2644. if( pScrollContainer != NULL )
  2645. {
  2646. HWND hWndScrollingTarget = pScrollContainer->GetSafeScrollingTargetHWND();
  2647. if( hWndScrollingTarget != NULL && ::IsWindow( hWndScrollingTarget ) )
  2648. hWndInvalidate = hWndScrollingTarget;
  2649. }
  2650. if( hWndInvalidate != NULL )
  2651. {
  2652. ::InvalidateRect( hWndInvalidate, NULL, TRUE );
  2653. ::UpdateWindow( hWndInvalidate );
  2654. }
  2655. }
  2656. }
  2657. void CExtScrollBar::OnScrollEdgeLower()
  2658. {
  2659. ASSERT_VALID( this );
  2660. if( ! m_bEnableCtxMenu )
  2661. return;
  2662. DWORD dwStyle = GetStyle();
  2663. if( ( dwStyle & SBS_SIZEBOX ) != 0 )
  2664. return;
  2665. SCROLLINFO scrollInfo;
  2666. ::memset( &scrollInfo, 0, sizeof(SCROLLINFO) );
  2667. scrollInfo.cbSize = sizeof( SCROLLINFO );
  2668. scrollInfo.fMask = SIF_ALL;
  2669. if( ! GetScrollInfo( &scrollInfo ) )
  2670. return;
  2671. INT nRange = scrollInfo.nMax - scrollInfo.nMin;
  2672. if( nRange <= 0 || nRange <= INT(scrollInfo.nPage) )
  2673. return;
  2674. INT nPosOld = INT( GetScrollPos() ), nPosNew = scrollInfo.nMin;
  2675. nPosNew = max( nPosNew, scrollInfo.nMin );
  2676. nPosNew = min( nPosNew, scrollInfo.nMax );
  2677. if( nPosOld != nPosNew )
  2678. {
  2679. HWND hWndInvalidate = ::GetParent( m_hWnd ), hWndOwn = m_hWnd;
  2680. _SetScrollPos( nPosNew );
  2681. if( ! ::IsWindow( hWndOwn ) )
  2682. return;
  2683. CExtNCSB_ScrollContainer * pScrollContainer = _GetParentScrollContainer();
  2684. if( pScrollContainer != NULL )
  2685. {
  2686. HWND hWndScrollingTarget = pScrollContainer->GetSafeScrollingTargetHWND();
  2687. if( hWndScrollingTarget != NULL && ::IsWindow( hWndScrollingTarget ) )
  2688. hWndInvalidate = hWndScrollingTarget;
  2689. }
  2690. if( hWndInvalidate != NULL )
  2691. {
  2692. ::InvalidateRect( hWndInvalidate, NULL, TRUE );
  2693. ::UpdateWindow( hWndInvalidate );
  2694. }
  2695. }
  2696. }
  2697. void CExtScrollBar::OnScrollEdgeUpper()
  2698. {
  2699. ASSERT_VALID( this );
  2700. if( ! m_bEnableCtxMenu )
  2701. return;
  2702. DWORD dwStyle = GetStyle();
  2703. if( ( dwStyle & SBS_SIZEBOX ) != 0 )
  2704. return;
  2705. SCROLLINFO scrollInfo;
  2706. ::memset( &scrollInfo, 0, sizeof(SCROLLINFO) );
  2707. scrollInfo.cbSize = sizeof( SCROLLINFO );
  2708. scrollInfo.fMask = SIF_ALL;
  2709. if( ! GetScrollInfo( &scrollInfo ) )
  2710. return;
  2711. INT nRange = scrollInfo.nMax - scrollInfo.nMin;
  2712. if( nRange <= 0 || nRange <= INT(scrollInfo.nPage) )
  2713. return;
  2714. INT nPosOld = INT( GetScrollPos() ), nPosNew = scrollInfo.nMax;
  2715. nPosNew = max( nPosNew, scrollInfo.nMin );
  2716. nPosNew = min( nPosNew, scrollInfo.nMax );
  2717. if( nPosOld != nPosNew )
  2718. {
  2719. HWND hWndInvalidate = ::GetParent( m_hWnd ), hWndOwn = m_hWnd;
  2720. _SetScrollPos( nPosNew );
  2721. if( ! ::IsWindow( hWndOwn ) )
  2722. return;
  2723. CExtNCSB_ScrollContainer * pScrollContainer = _GetParentScrollContainer();
  2724. if( pScrollContainer != NULL )
  2725. {
  2726. HWND hWndScrollingTarget = pScrollContainer->GetSafeScrollingTargetHWND();
  2727. if( hWndScrollingTarget != NULL && ::IsWindow( hWndScrollingTarget ) )
  2728. hWndInvalidate = hWndScrollingTarget;
  2729. }
  2730. if( hWndInvalidate != NULL )
  2731. {
  2732. ::InvalidateRect( hWndInvalidate, NULL, TRUE );
  2733. ::UpdateWindow( hWndInvalidate );
  2734. }
  2735. }
  2736. }
  2737. void CExtScrollBar::OnScrollLineLower()
  2738. {
  2739. ASSERT_VALID( this );
  2740. if( ! m_bEnableCtxMenu )
  2741. return;
  2742. DWORD dwStyle = GetStyle();
  2743. if( ( dwStyle & SBS_SIZEBOX ) != 0 )
  2744. return;
  2745. SCROLLINFO scrollInfo;
  2746. ::memset( &scrollInfo, 0, sizeof(SCROLLINFO) );
  2747. scrollInfo.cbSize = sizeof( SCROLLINFO );
  2748. scrollInfo.fMask = SIF_ALL;
  2749. if( ! GetScrollInfo( &scrollInfo ) )
  2750. return;
  2751. INT nRange = scrollInfo.nMax - scrollInfo.nMin;
  2752. if( nRange <= 0 || nRange <= INT(scrollInfo.nPage) )
  2753. return;
  2754. INT nStepSize = max( m_nStepSize, 1 );
  2755. INT nPosOld = INT( GetScrollPos() );
  2756. INT nPosNew = nPosOld - nStepSize;
  2757. nPosNew = max( nPosNew, scrollInfo.nMin );
  2758. nPosNew = min( nPosNew, scrollInfo.nMax );
  2759. if( nPosOld != nPosNew )
  2760. {
  2761. HWND hWndInvalidate = ::GetParent( m_hWnd ), hWndOwn = m_hWnd;
  2762. _SetScrollPos( nPosNew );
  2763. if( ! ::IsWindow( hWndOwn ) )
  2764. return;
  2765. CExtNCSB_ScrollContainer * pScrollContainer = _GetParentScrollContainer();
  2766. if( pScrollContainer != NULL )
  2767. {
  2768. HWND hWndScrollingTarget = pScrollContainer->GetSafeScrollingTargetHWND();
  2769. if( hWndScrollingTarget != NULL && ::IsWindow( hWndScrollingTarget ) )
  2770. hWndInvalidate = hWndScrollingTarget;
  2771. }
  2772. if( hWndInvalidate != NULL )
  2773. {
  2774. ::InvalidateRect( hWndInvalidate, NULL, TRUE );
  2775. ::UpdateWindow( hWndInvalidate );
  2776. }
  2777. }
  2778. }
  2779. void CExtScrollBar::OnScrollLineUpper()
  2780. {
  2781. ASSERT_VALID( this );
  2782. if( ! m_bEnableCtxMenu )
  2783. return;
  2784. DWORD dwStyle = GetStyle();
  2785. if( ( dwStyle & SBS_SIZEBOX ) != 0 )
  2786. return;
  2787. SCROLLINFO scrollInfo;
  2788. ::memset( &scrollInfo, 0, sizeof(SCROLLINFO) );
  2789. scrollInfo.cbSize = sizeof( SCROLLINFO );
  2790. scrollInfo.fMask = SIF_ALL;
  2791. if( ! GetScrollInfo( &scrollInfo ) )
  2792. return;
  2793. INT nRange = scrollInfo.nMax - scrollInfo.nMin;
  2794. if( nRange <= 0 || nRange <= INT(scrollInfo.nPage) )
  2795. return;
  2796. INT nStepSize = max( m_nStepSize, 1 );
  2797. INT nPosOld = INT( GetScrollPos() );
  2798. INT nPosNew = nPosOld + nStepSize;
  2799. nPosNew = max( nPosNew, scrollInfo.nMin );
  2800. nPosNew = min( nPosNew, scrollInfo.nMax );
  2801. if( nPosOld != nPosNew )
  2802. {
  2803. HWND hWndInvalidate = ::GetParent( m_hWnd ), hWndOwn = m_hWnd;
  2804. _SetScrollPos( nPosNew );
  2805. if( ! ::IsWindow( hWndOwn ) )
  2806. return;
  2807. CExtNCSB_ScrollContainer * pScrollContainer = _GetParentScrollContainer();
  2808. if( pScrollContainer != NULL )
  2809. {
  2810. HWND hWndScrollingTarget = pScrollContainer->GetSafeScrollingTargetHWND();
  2811. if( hWndScrollingTarget != NULL && ::IsWindow( hWndScrollingTarget ) )
  2812. hWndInvalidate = hWndScrollingTarget;
  2813. }
  2814. if( hWndInvalidate != NULL )
  2815. {
  2816. ::InvalidateRect( hWndInvalidate, NULL, TRUE );
  2817. ::UpdateWindow( hWndInvalidate );
  2818. }
  2819. }
  2820. }
  2821. void CExtScrollBar::OnScrollPageLower()
  2822. {
  2823. ASSERT_VALID( this );
  2824. if( ! m_bEnableCtxMenu )
  2825. return;
  2826. DWORD dwStyle = GetStyle();
  2827. if( ( dwStyle & SBS_SIZEBOX ) != 0 )
  2828. return;
  2829. SCROLLINFO scrollInfo;
  2830. ::memset( &scrollInfo, 0, sizeof(SCROLLINFO) );
  2831. scrollInfo.cbSize = sizeof( SCROLLINFO );
  2832. scrollInfo.fMask = SIF_ALL;
  2833. if( ! GetScrollInfo( &scrollInfo ) )
  2834. return;
  2835. INT nRange = scrollInfo.nMax - scrollInfo.nMin;
  2836. if( nRange <= 0 || nRange <= INT(scrollInfo.nPage) )
  2837. return;
  2838. INT nPosOld = INT( GetScrollPos() );
  2839. INT nPosNew = nPosOld - scrollInfo.nPage;
  2840. nPosNew = max( nPosNew, scrollInfo.nMin );
  2841. nPosNew = min( nPosNew, scrollInfo.nMax );
  2842. if( nPosOld != nPosNew )
  2843. {
  2844. HWND hWndInvalidate = ::GetParent( m_hWnd ), hWndOwn = m_hWnd;
  2845. _SetScrollPos( nPosNew );
  2846. if( ! ::IsWindow( hWndOwn ) )
  2847. return;
  2848. CExtNCSB_ScrollContainer * pScrollContainer = _GetParentScrollContainer();
  2849. if( pScrollContainer != NULL )
  2850. {
  2851. HWND hWndScrollingTarget = pScrollContainer->GetSafeScrollingTargetHWND();
  2852. if( hWndScrollingTarget != NULL && ::IsWindow( hWndScrollingTarget ) )
  2853. hWndInvalidate = hWndScrollingTarget;
  2854. }
  2855. if( hWndInvalidate != NULL )
  2856. {
  2857. ::InvalidateRect( hWndInvalidate, NULL, TRUE );
  2858. ::UpdateWindow( hWndInvalidate );
  2859. }
  2860. }
  2861. }
  2862. void CExtScrollBar::OnScrollPageUpper()
  2863. {
  2864. ASSERT_VALID( this );
  2865. if( ! m_bEnableCtxMenu )
  2866. return;
  2867. DWORD dwStyle = GetStyle();
  2868. if( ( dwStyle & SBS_SIZEBOX ) != 0 )
  2869. return;
  2870. SCROLLINFO scrollInfo;
  2871. ::memset( &scrollInfo, 0, sizeof(SCROLLINFO) );
  2872. scrollInfo.cbSize = sizeof( SCROLLINFO );
  2873. scrollInfo.fMask = SIF_ALL;
  2874. if( ! GetScrollInfo( &scrollInfo ) )
  2875. return;
  2876. INT nRange = scrollInfo.nMax - scrollInfo.nMin;
  2877. if( nRange <= 0 || nRange <= INT(scrollInfo.nPage) )
  2878. return;
  2879. INT nPosOld = INT( GetScrollPos() );
  2880. INT nPosNew = nPosOld + scrollInfo.nPage;
  2881. nPosNew = max( nPosNew, scrollInfo.nMin );
  2882. nPosNew = min( nPosNew, scrollInfo.nMax );
  2883. if( nPosOld != nPosNew )
  2884. {
  2885. HWND hWndInvalidate = ::GetParent( m_hWnd ), hWndOwn = m_hWnd;
  2886. _SetScrollPos( nPosNew );
  2887. if( ! ::IsWindow( hWndOwn ) )
  2888. return;
  2889. CExtNCSB_ScrollContainer * pScrollContainer = _GetParentScrollContainer();
  2890. if( pScrollContainer != NULL )
  2891. {
  2892. HWND hWndScrollingTarget = pScrollContainer->GetSafeScrollingTargetHWND();
  2893. if( hWndScrollingTarget != NULL && ::IsWindow( hWndScrollingTarget ) )
  2894. hWndInvalidate = hWndScrollingTarget;
  2895. }
  2896. if( hWndInvalidate != NULL )
  2897. {
  2898. ::InvalidateRect( hWndInvalidate, NULL, TRUE );
  2899. ::UpdateWindow( hWndInvalidate );
  2900. }
  2901. }
  2902. }
  2903. /////////////////////////////////////////////////////////////////////////////
  2904. // CExtZoomScrollBar
  2905. IMPLEMENT_DYNCREATE( CExtZoomScrollBar, CExtScrollBar );
  2906. CExtZoomScrollBar::CExtZoomScrollBar()
  2907. {
  2908. }
  2909. CExtZoomScrollBar::~CExtZoomScrollBar()
  2910. {
  2911. }
  2912. BEGIN_MESSAGE_MAP(CExtZoomScrollBar, CExtScrollBar)
  2913. //{{AFX_MSG_MAP(CExtZoomScrollBar)
  2914. //}}AFX_MSG_MAP
  2915. END_MESSAGE_MAP()
  2916. /////////////////////////////////////////////////////////////////////////////
  2917. // class CExtNCSB_ScrollContainer
  2918. IMPLEMENT_DYNAMIC( CExtNCSB_ScrollContainer, CWnd );
  2919. CExtNCSB_ScrollContainer::CExtNCSB_ScrollContainer(
  2920. HWND hWndScrollingTaget,
  2921. CExtNCSB_ScrollContainer::e_mode_t eMode
  2922. )
  2923. : m_hWndScrollingTaget( hWndScrollingTaget )
  2924. , m_eMode( eMode )
  2925. , m_pWndScrollBar( NULL )
  2926. {
  2927. ASSERT( m_hWndScrollingTaget != NULL && ::IsWindow( m_hWndScrollingTaget ) );
  2928. ASSERT( INT(__EM_MIN_VALUE) <= INT(m_eMode) && INT(m_eMode) <= INT(__EM_MAX_VALUE) );
  2929. }
  2930. CExtNCSB_ScrollContainer::~CExtNCSB_ScrollContainer()
  2931. {
  2932. }
  2933. CExtScrollBar * CExtNCSB_ScrollContainer::GetScrollBarInContainer() const
  2934. {
  2935. ASSERT_VALID( this );
  2936. return m_pWndScrollBar;
  2937. }
  2938. CExtNCSB_ScrollContainer::e_mode_t CExtNCSB_ScrollContainer::GetMode() const
  2939. {
  2940. ASSERT_VALID( this );
  2941. ASSERT( INT(__EM_MIN_VALUE) <= INT(m_eMode) && INT(m_eMode) <= INT(__EM_MAX_VALUE) );
  2942. return m_eMode;
  2943. }
  2944. HWND CExtNCSB_ScrollContainer::GetSafeScrollingTargetHWND() const
  2945. {
  2946. ASSERT_VALID( this );
  2947. // if( GetSafeHwnd() == NULL )
  2948. // return NULL;
  2949. if( m_hWndScrollingTaget == NULL || (! ::IsWindow( m_hWndScrollingTaget ) ) )
  2950. return NULL;
  2951. return m_hWndScrollingTaget;
  2952. }
  2953. CExtScrollBar * CExtNCSB_ScrollContainer::OnInstantiateAndCreateScrollBar( bool bChildMode )
  2954. {
  2955. ASSERT_VALID( this );
  2956. if( GetSafeHwnd() == NULL )
  2957. return NULL;
  2958. e_mode_t eMode = GetMode();
  2959. if( ! ( eMode == __EM_HORIZONTAL_SCROLL_BAR || eMode == __EM_VERTICAL_SCROLL_BAR ) )
  2960. return NULL;
  2961. CExtScrollBar * pWndScrollBar = NULL;
  2962. try
  2963. {
  2964. pWndScrollBar = new CExtScrollBar;
  2965. pWndScrollBar->m_bAlwaysSendThumbButtonNotifications = true;
  2966. pWndScrollBar->m_bSendActionNotifications = false;
  2967. if( ! bChildMode )
  2968. {
  2969. pWndScrollBar->m_bPopupInactiveLightMode = true;
  2970. pWndScrollBar->m_bEnableHookSpy = true;
  2971. pWndScrollBar->m_nMouseActivateCode = MA_NOACTIVATE;
  2972. }
  2973. CRect rc;
  2974. GetClientRect( &rc );
  2975. if( ! pWndScrollBar->Create(
  2976. WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS
  2977. | ( ( eMode == __EM_HORIZONTAL_SCROLL_BAR ) ? SBS_HORZ : SBS_VERT )
  2978. ,
  2979. rc,
  2980. this,
  2981. UINT(__EXT_MFC_IDC_STATIC)
  2982. )
  2983. )
  2984. return NULL;
  2985. return pWndScrollBar;
  2986. }
  2987. catch( CException * pException )
  2988. {
  2989. pException->Delete();
  2990. }
  2991. catch( ... )
  2992. {
  2993. }
  2994. if( pWndScrollBar != NULL )
  2995. delete pWndScrollBar;
  2996. return NULL;
  2997. }
  2998. bool CExtNCSB_ScrollContainer::Create( CWnd * pWndParent )
  2999. {
  3000. ASSERT_VALID( this );
  3001. ASSERT_VALID( pWndParent );
  3002. ASSERT( pWndParent->GetSafeHwnd() != NULL );
  3003. HWND hWndScrollingTaget = GetSafeScrollingTargetHWND();
  3004. if( hWndScrollingTaget == NULL || (! ::IsWindow( hWndScrollingTaget ) ) )
  3005. return false;
  3006. WNDCLASS _wndClassInfo;
  3007. HINSTANCE hInst = ::AfxGetInstanceHandle();
  3008. if( ! ::GetClassInfo( hInst, __EXT_NCSB_SCROLL_CONTAINER_CLASS_NAME, &_wndClassInfo ) )
  3009. {
  3010. _wndClassInfo.style = CS_GLOBALCLASS|CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
  3011. _wndClassInfo.lpfnWndProc = ::DefWindowProc;
  3012. _wndClassInfo.cbClsExtra = _wndClassInfo.cbWndExtra = 0;
  3013. _wndClassInfo.hInstance = hInst;
  3014. _wndClassInfo.hIcon = NULL;
  3015. _wndClassInfo.hCursor = ::LoadCursor( NULL, IDC_ARROW );
  3016. ASSERT( _wndClassInfo.hCursor != NULL );
  3017. _wndClassInfo.hbrBackground = NULL; 
  3018. _wndClassInfo.lpszMenuName = NULL;
  3019. _wndClassInfo.lpszClassName = __EXT_NCSB_SCROLL_CONTAINER_CLASS_NAME;
  3020. if( ! ::AfxRegisterClass( &_wndClassInfo ) )
  3021. {
  3022. ASSERT( FALSE );
  3023. //AfxThrowResourceException();
  3024. return false;
  3025. }
  3026. }
  3027. e_mode_t eMode = GetMode();
  3028. static RECT rcInitWndPos = { 0, 0, 0, 0 };
  3029. UINT nID = UINT(__EXT_MFC_IDC_STATIC);
  3030. CRect rc = rcInitWndPos;
  3031. __EXT_MFC_LONG_PTR dwScrollingTargetStyle = ::__EXT_MFC_GetWindowLong( hWndScrollingTaget, GWL_STYLE );
  3032. bool bChildMode = ( (dwScrollingTargetStyle&WS_CHILD) != 0 ) ? true : false;
  3033. if( bChildMode && ::GetParent(m_hWndScrollingTaget) == ::GetDesktopWindow() )
  3034. bChildMode = false;
  3035. DWORD dwStyle = WS_CLIPCHILDREN|WS_CLIPSIBLINGS, dwExStyle = WS_EX_NOINHERITLAYOUT;
  3036. if( bChildMode )
  3037. {
  3038. if( eMode == __EM_MIDDLE_CONTAINER )
  3039. {
  3040. ::GetWindowRect( hWndScrollingTaget, &rc );
  3041. pWndParent->ScreenToClient( &rc );
  3042. nID = (UINT)::__EXT_MFC_GetWindowLong( hWndScrollingTaget, GWL_ID );
  3043. if( (dwScrollingTargetStyle&WS_VISIBLE) != 0 )
  3044. dwStyle |= WS_VISIBLE;
  3045. dwExStyle |= WS_EX_CONTROLPARENT;
  3046. }
  3047. dwStyle |= WS_CHILD;
  3048. }
  3049. else
  3050. {
  3051. ASSERT( eMode != __EM_MIDDLE_CONTAINER );
  3052. dwStyle |= WS_POPUP;
  3053. nID = (UINT)NULL;
  3054. }
  3055. if( ! CWnd::CreateEx(
  3056. dwExStyle,
  3057. __EXT_NCSB_SCROLL_CONTAINER_CLASS_NAME,
  3058. __EXT_NCSB_SCROLL_CONTAINER_CLASS_NAME,
  3059. dwStyle,
  3060. rc,
  3061. pWndParent,
  3062. nID
  3063. )
  3064. )
  3065. return false;
  3066. if( eMode == __EM_HORIZONTAL_SCROLL_BAR || eMode == __EM_VERTICAL_SCROLL_BAR )
  3067. {
  3068. m_pWndScrollBar = OnInstantiateAndCreateScrollBar( bChildMode );
  3069. if( m_pWndScrollBar == NULL )
  3070. {
  3071. DestroyWindow();
  3072. return false;
  3073. }
  3074. }
  3075. else if( eMode == __EM_MIDDLE_CONTAINER )
  3076. {
  3077. ::SetWindowPos(
  3078. m_hWnd, hWndScrollingTaget, 0, 0, 0, 0,
  3079. SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOREDRAW|SWP_NOSENDCHANGING
  3080. );
  3081. ::SetParent( hWndScrollingTaget, m_hWnd );
  3082. CRect rcClient;
  3083. GetClientRect( &rcClient );
  3084. ::MoveWindow( hWndScrollingTaget, rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), TRUE );
  3085. bool bEnable = ( (dwScrollingTargetStyle&WS_DISABLED) != 0 ) ? FALSE : TRUE;
  3086. EnableWindow( bEnable );
  3087. }
  3088. return true;
  3089. }
  3090. void CExtNCSB_ScrollContainer::PreSubclassWindow()
  3091. {
  3092. ASSERT_VALID( this );
  3093. CWnd::PreSubclassWindow();
  3094. }
  3095. void CExtNCSB_ScrollContainer::PostNcDestroy()
  3096. {
  3097. ASSERT_VALID( this );
  3098. CExtScrollBar * pWndScrollBar = GetScrollBarInContainer();
  3099. if( pWndScrollBar != NULL )
  3100. {
  3101. if( pWndScrollBar->GetSafeHwnd() != NULL )
  3102. pWndScrollBar->DestroyWindow();
  3103. delete pWndScrollBar;
  3104. }
  3105. CWnd::PostNcDestroy();
  3106. delete this;
  3107. }
  3108. LRESULT CExtNCSB_ScrollContainer::WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
  3109. {
  3110. switch( message )
  3111. {
  3112. case WM_NCCALCSIZE:
  3113. return 0L;
  3114. case WM_PAINT:
  3115. {
  3116. CPaintDC dcPaint( this );
  3117. CRect rcClient;
  3118. GetClientRect( &rcClient );
  3119. CExtMemoryDC dc( &dcPaint, &rcClient );
  3120. g_PaintManager->PaintDockerBkgnd( true, dc, this );
  3121. return 0L;
  3122. }
  3123. case WM_SIZE:
  3124. {
  3125. e_mode_t eMode = GetMode();
  3126. if( eMode == __EM_HORIZONTAL_SCROLL_BAR || eMode == __EM_VERTICAL_SCROLL_BAR )
  3127. {
  3128. CExtScrollBar * pWndScrollBar = GetScrollBarInContainer();
  3129. if( pWndScrollBar->GetSafeHwnd() != NULL )
  3130. pWndScrollBar->MoveWindow( 0, 0, LOWORD(DWORD(lParam)), HIWORD(DWORD(lParam)) );
  3131. }
  3132. else if( eMode == __EM_MIDDLE_CONTAINER )
  3133. {
  3134. HWND hWndScrollingTaget = GetSafeScrollingTargetHWND();
  3135. if( hWndScrollingTaget != NULL )
  3136. {
  3137. CRect rcClient;
  3138. GetClientRect( &rcClient );
  3139. ::MoveWindow( hWndScrollingTaget, rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), TRUE );
  3140. }
  3141. }
  3142. }
  3143. break;
  3144. case WM_HSCROLL:
  3145. case WM_VSCROLL:
  3146. {
  3147. e_mode_t eMode = GetMode();
  3148. if( eMode == __EM_HORIZONTAL_SCROLL_BAR || eMode == __EM_VERTICAL_SCROLL_BAR )
  3149. {
  3150. HWND hWndScrollingTaget = GetSafeScrollingTargetHWND();
  3151. if( hWndScrollingTaget != NULL )
  3152. return ::SendMessage( hWndScrollingTaget, message, wParam, NULL );
  3153. }
  3154. }
  3155. return 0L;
  3156. } // switch( message )
  3157. LRESULT lResult = CWnd::WindowProc( message, wParam, lParam );
  3158. switch( message )
  3159. {
  3160. case WM_SHOWWINDOW:
  3161. case WM_ENABLE:
  3162. {
  3163. e_mode_t eMode = GetMode();
  3164. if( eMode == __EM_MIDDLE_CONTAINER )
  3165. {
  3166. HWND hWndScrollingTaget = GetSafeScrollingTargetHWND();
  3167. if( hWndScrollingTaget != NULL )
  3168. {
  3169. DWORD dwStyle = GetStyle();
  3170. bool bEnable = ( (dwStyle&WS_DISABLED) != 0 ) ? FALSE : TRUE;
  3171. ::EnableWindow( hWndScrollingTaget, bEnable );
  3172. //int nCmdShow = ( (dwStyle&WS_VISIBLE) != 0 ) ? SW_SHOWNOACTIVATE : SW_HIDE;
  3173. //::ShowWindow( hWndScrollingTaget, nCmdShow );
  3174. }
  3175. }
  3176. }
  3177. break;
  3178. case WM_SETFOCUS:
  3179. {
  3180. e_mode_t eMode = GetMode();
  3181. if( eMode == __EM_MIDDLE_CONTAINER )
  3182. {
  3183. HWND hWndScrollingTaget = GetSafeScrollingTargetHWND();
  3184. if( hWndScrollingTaget != NULL )
  3185. ::SetFocus( hWndScrollingTaget );
  3186. }
  3187. }
  3188. break;
  3189. } // switch( message )
  3190. return lResult;
  3191. }
  3192. CExtNCSB < CListCtrl > :: CExtNCSB(
  3193. bool bNcsbDelayedInitialization, // = false
  3194. bool bNcsbForceMiddleContainerMode // = false
  3195. )
  3196. : CExtNCSB_Impl < CExtANCSB < CListCtrl > > (
  3197. bNcsbDelayedInitialization,
  3198. bNcsbForceMiddleContainerMode
  3199. )
  3200. {
  3201. }
  3202. CExtNCSB < CListCtrl > :: ~CExtNCSB()
  3203. {
  3204. }
  3205. void CExtNCSB < CListCtrl > :: AdjustScrollMetrics()
  3206. {
  3207. ASSERT_VALID( this );
  3208. if( GetSafeHwnd() == NULL )
  3209. return;
  3210. DWORD dwType = DWORD( GetStyle() & LVS_TYPEMASK );
  3211. CExtNCSB_ScrollContainer * pWndH = NCSB_GetContainer( CExtNCSB_ScrollContainer::__EM_HORIZONTAL_SCROLL_BAR );
  3212. CExtNCSB_ScrollContainer * pWndV = NCSB_GetContainer( CExtNCSB_ScrollContainer::__EM_VERTICAL_SCROLL_BAR );
  3213. CExtScrollBar * pSBH = ( pWndH != NULL ) ? pWndH->GetScrollBarInContainer() : NULL;
  3214. CExtScrollBar * pSBV = ( pWndV != NULL ) ? pWndV->GetScrollBarInContainer() : NULL;
  3215. INT m_nStepSizeH = -1, m_nStepSizeV = -1;
  3216. switch( dwType )
  3217. {
  3218. case LVS_ICON:
  3219. m_nStepSizeV = 64;
  3220. break;
  3221. case LVS_SMALLICON:
  3222. case LVS_LIST:
  3223. m_nStepSizeV = 16;
  3224. break;
  3225. case LVS_REPORT:
  3226. m_nStepSizeV = 1;
  3227. break;
  3228. } // switch( dwType )
  3229. if( m_nStepSizeH > 0 && pSBH != NULL )
  3230. pSBH->m_nStepSize = m_nStepSizeH;
  3231. if( m_nStepSizeV > 0 && pSBV != NULL )
  3232. pSBV->m_nStepSize = m_nStepSizeV;
  3233. }
  3234. LRESULT CExtNCSB < CListCtrl > :: WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
  3235. {
  3236. switch( message )
  3237. {
  3238. case WM_HSCROLL:
  3239. {
  3240. UINT nSBCode = UINT(LOWORD(DWORD(wParam))), nPos = UINT(HIWORD(DWORD(wParam)));
  3241. //TRACE2( "WM_HSCROLL, nSBCode = %d, nPos = %drn", nSBCode, nPos );
  3242. INT nItemExtent = 1;
  3243. DWORD dwStyle = GetStyle();
  3244. DWORD dwListCtrlType = dwStyle&LVS_TYPEMASK;
  3245. switch( dwListCtrlType )
  3246. {
  3247. case LVS_ICON:
  3248. case LVS_SMALLICON:
  3249. case LVS_REPORT:
  3250. break;
  3251. case LVS_LIST:
  3252. {
  3253. CRect rcItem( 0, 0, 0, 0 );
  3254. INT nTopIndex = GetTopIndex();
  3255. if( nTopIndex >= 0
  3256. && CListCtrl::GetItemRect( nTopIndex, &rcItem, LVIR_BOUNDS )
  3257. )
  3258. nItemExtent = rcItem.Width();
  3259. }
  3260. break;
  3261. } // switch( dwListCtrlType )
  3262. if( nSBCode == SB_THUMBTRACK || nSBCode == SB_THUMBPOSITION )
  3263. {
  3264. INT nPosOld = GetScrollPos( SB_HORZ );
  3265. INT nPosShift = nPos*nItemExtent - nPosOld*nItemExtent;
  3266. Scroll( CSize( nPosShift, 0 ) );
  3267. return 0L;
  3268. }
  3269. if( nSBCode == SB_LINELEFT
  3270. || nSBCode == SB_LINERIGHT
  3271. || nSBCode == SB_PAGELEFT
  3272. || nSBCode == SB_PAGERIGHT
  3273. || nSBCode == SB_LEFT
  3274. || nSBCode == SB_RIGHT
  3275. || nSBCode == SB_ENDSCROLL
  3276. )
  3277. return 0L;
  3278. } // case WM_HSCROLL:
  3279. break; // case WM_VSCROLL
  3280. case WM_VSCROLL:
  3281. {
  3282. UINT nSBCode = UINT(LOWORD(DWORD(wParam))), nPos = UINT(HIWORD(DWORD(wParam)));
  3283. //TRACE2( "WM_VSCROLL, nSBCode = %d, nPos = %drn", nSBCode, nPos );
  3284. INT nItemExtent = 1;
  3285. DWORD dwStyle = GetStyle();
  3286. DWORD dwListCtrlType = dwStyle&LVS_TYPEMASK;
  3287. switch( dwListCtrlType )
  3288. {
  3289. case LVS_ICON:
  3290. case LVS_SMALLICON:
  3291. case LVS_LIST:
  3292. break;
  3293. case LVS_REPORT:
  3294. {
  3295. CRect rcItem( 0, 0, 0, 0 );
  3296. INT nTopIndex = GetTopIndex();
  3297. if( nTopIndex >= 0
  3298. && CListCtrl::GetItemRect( nTopIndex, &rcItem, LVIR_BOUNDS )
  3299. )
  3300. nItemExtent = rcItem.Height();
  3301. else
  3302. {
  3303. TEXTMETRIC _tm;
  3304. ::memset( &_tm, 0, sizeof(TEXTMETRIC) );
  3305. CClientDC dc( this );
  3306. CFont * pFont = GetFont();
  3307. int nSave = dc.SaveDC();
  3308. dc.SelectObject( pFont );
  3309. dc.GetTextMetrics( &_tm );
  3310. nItemExtent = _tm.tmHeight + _tm.tmExternalLeading + 1;
  3311. dc.RestoreDC( nSave );
  3312. }
  3313. }
  3314. break;
  3315. } // switch( dwListCtrlType )
  3316. if( nSBCode == SB_THUMBTRACK || nSBCode == SB_THUMBPOSITION )
  3317. {
  3318. INT nPosOld = GetScrollPos( SB_VERT );
  3319. INT nPosShift = nPos*nItemExtent - nPosOld*nItemExtent;
  3320. Scroll( CSize( 0, nPosShift ) );
  3321. return 0L;
  3322. }
  3323. if( nSBCode == SB_LINEUP
  3324. || nSBCode == SB_LINEDOWN
  3325. || nSBCode == SB_PAGEUP
  3326. || nSBCode == SB_PAGEDOWN
  3327. || nSBCode == SB_TOP
  3328. || nSBCode == SB_BOTTOM
  3329. ||  nSBCode ==  SB_ENDSCROLL
  3330. )
  3331. return 0L;
  3332. }
  3333. break; // case WM_VSCROLL
  3334. } // switch( message )
  3335. LRESULT lResult = CExtNCSB_Impl < CExtANCSB < CListCtrl > > :: WindowProc( message, wParam, lParam );
  3336. switch( message )
  3337. {
  3338. case WM_STYLECHANGED:
  3339. if( wParam == GWL_STYLE )
  3340. {
  3341. STYLESTRUCT * ptr = (STYLESTRUCT *)lParam;
  3342. ASSERT( ptr != NULL );
  3343. DWORD dwOldType = DWORD( ptr->styleOld & LVS_TYPEMASK );
  3344. DWORD dwNewType = DWORD( ptr->styleNew & LVS_TYPEMASK );
  3345. if( dwOldType != dwNewType )
  3346. AdjustScrollMetrics();
  3347. } // if( wParam == GWL_STYLE )
  3348. break; // case WM_STYLECHANGED
  3349. } // switch( message )
  3350. return lResult;
  3351. }
  3352. #if (!defined __EXT_MFC_NO_SCROLLWND)
  3353. /////////////////////////////////////////////////////////////////////////////
  3354. // CExtScrollWnd
  3355. IMPLEMENT_DYNCREATE( CExtScrollWnd, CWnd );
  3356. IMPLEMENT_CExtPmBridge_MEMBERS( CExtScrollWnd );
  3357. CExtScrollWnd::CExtScrollWnd()
  3358. : m_nUpdateScrollBars( 0 )
  3359. , m_bScrollPhysical( false )
  3360. , m_bEatErasing( true )
  3361. , m_bClientCB( false )
  3362. , m_bBufferedPainting( true )
  3363. , m_bScrollUpdateWindow( false )
  3364. , m_bScrollInvalidate( true )
  3365. , m_bScrollErase( false )
  3366. , m_bRedrawUpdateWindow( false )
  3367. , m_bRedrawInvalidate( true )
  3368. , m_bRedrawErase( false )
  3369. , m_bUse32BitScrollInfo( true )
  3370. , m_hFont( NULL )
  3371. {
  3372. PmBridge_Install();
  3373. }
  3374. CExtScrollWnd::~CExtScrollWnd()
  3375. {
  3376. PmBridge_Uninstall();
  3377. }
  3378. BEGIN_MESSAGE_MAP(CExtScrollWnd, CWnd)
  3379. //{{AFX_MSG_MAP(CExtScrollWnd)
  3380. ON_WM_SIZE()
  3381. ON_WM_HSCROLL()
  3382. ON_WM_VSCROLL()
  3383. ON_WM_MOUSEWHEEL()
  3384. ON_WM_ERASEBKGND()
  3385. ON_WM_PAINT()
  3386. ON_WM_ENABLE()
  3387. ON_MESSAGE(WM_SETFONT, OnSetFont)
  3388. ON_MESSAGE(WM_GETFONT, OnGetFont)
  3389. //}}AFX_MSG_MAP
  3390. ON_WM_SYSCOLORCHANGE()
  3391. __EXT_MFC_SAFE_ON_WM_SETTINGCHANGE()
  3392. ON_MESSAGE(WM_DISPLAYCHANGE, OnDisplayChange)
  3393. ON_MESSAGE(__ExtMfc_WM_THEMECHANGED, OnThemeChanged)
  3394. END_MESSAGE_MAP()
  3395. void CExtScrollWnd::OnEnable( BOOL bEnable )
  3396. {
  3397. ASSERT_VALID( this );
  3398. if( bEnable )
  3399. OnSwUpdateScrollBars();
  3400. else
  3401. OnSwEnableScrollBarCtrl( SB_BOTH, false );
  3402. OnSwRecalcLayout( true );
  3403.   RedrawWindow( NULL, NULL, RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASE|RDW_ERASENOW|RDW_ALLCHILDREN|RDW_FRAME );
  3404. }
  3405. LRESULT CExtScrollWnd::OnSetFont( WPARAM wParam, LPARAM lParam )
  3406. {
  3407. ASSERT_VALID( this );
  3408. HFONT hFont = (HFONT) wParam;
  3409. BOOL bRedraw = (BOOL) lParam;
  3410. m_hFont = hFont; 
  3411. OnSwRecalcLayout( true );
  3412.     if( bRedraw )
  3413.         Invalidate();
  3414. return 0L;
  3415. }
  3416.   
  3417. LRESULT CExtScrollWnd::OnGetFont( WPARAM, LPARAM )
  3418. {
  3419. ASSERT_VALID( this );
  3420.     return (LRESULT) m_hFont;
  3421. }
  3422. void CExtScrollWnd::OnSysColorChange() 
  3423. {
  3424. ASSERT_VALID( this );
  3425. CWnd::OnSysColorChange();
  3426. //CExtPaintManager * pPM = PmBridge_GetPM();
  3427. // g_PaintManager.OnSysColorChange( this );
  3428. // g_CmdManager.OnSysColorChange( pPM, this );
  3429. Invalidate();
  3430. }
  3431. LRESULT CExtScrollWnd::OnDisplayChange( WPARAM wParam, LPARAM lParam )
  3432. {
  3433. LRESULT lResult = CWnd::OnDisplayChange( wParam, lParam );
  3434. //CExtPaintManager * pPM = PmBridge_GetPM();
  3435. // g_PaintManager.OnDisplayChange( this, (INT)wParam, CPoint(lParam) );
  3436. // g_CmdManager.OnDisplayChange( pPM, this, (INT)wParam, CPoint(lParam) );
  3437. Invalidate();
  3438. return lResult;
  3439. }
  3440. LRESULT CExtScrollWnd::OnThemeChanged( WPARAM wParam, LPARAM lParam )
  3441. {
  3442. wParam;
  3443. lParam;
  3444. LRESULT lResult = Default();
  3445. //CExtPaintManager * pPM = PmBridge_GetPM();
  3446. // g_PaintManager.OnThemeChanged( this, wParam, lParam );
  3447. // g_CmdManager.OnThemeChanged( pPM, this, wParam, lParam );
  3448. OnSwRecalcLayout( true );
  3449. Invalidate();
  3450. return lResult;
  3451. }
  3452. void CExtScrollWnd::OnSettingChange(UINT uFlags, __EXT_MFC_SAFE_LPCTSTR lpszSection) 
  3453. {
  3454. ASSERT_VALID( this );
  3455. CWnd::OnSettingChange(uFlags, lpszSection);
  3456. //CExtPaintManager * pPM = PmBridge_GetPM();
  3457. // g_PaintManager.OnSettingChange( this, uFlags, lpszSection );
  3458. // g_CmdManager.OnSettingChange( pPM, this, uFlags, lpszSection );
  3459. OnSwRecalcLayout( true );
  3460. Invalidate();
  3461. }
  3462. void CExtScrollWnd::PmBridge_OnPaintManagerChanged(
  3463. CExtPaintManager * pGlobalPM
  3464. )
  3465. {
  3466. ASSERT_VALID( this );
  3467. CExtPmBridge::PmBridge_OnPaintManagerChanged( pGlobalPM );
  3468. if( GetSafeHwnd() != NULL )
  3469. OnSwRecalcLayout( true );
  3470. }
  3471. CSize CExtScrollWnd::OnSwGetTotalSize() const
  3472. {
  3473. ASSERT_VALID( this );
  3474. return CSize( 0, 0 );
  3475. }
  3476. CSize CExtScrollWnd::OnSwGetPageSize( int nDirection ) const
  3477. {
  3478. ASSERT_VALID( this );
  3479. nDirection;
  3480. return CSize( 0, 0 );
  3481. }
  3482. CSize CExtScrollWnd::OnSwGetLineSize( int nDirection ) const
  3483. {
  3484. ASSERT_VALID( this );
  3485. nDirection;
  3486. return CSize( 0, 0 );
  3487. }
  3488. bool CExtScrollWnd::OnSwScrollInfoAdjust(
  3489. int nBar,
  3490. SCROLLINFO & si,
  3491. bool bRedraw // = true
  3492. )
  3493. {
  3494. ASSERT_VALID( this );
  3495. ASSERT( nBar == SB_HORZ || nBar == SB_VERT );
  3496. CScrollBar * pScrollBarWnd = GetScrollBarCtrl( nBar );
  3497. if( pScrollBarWnd != NULL )
  3498. {
  3499. if( pScrollBarWnd->SetScrollInfo(
  3500. &si,
  3501. bRedraw ? TRUE : FALSE
  3502. )
  3503. )
  3504. return true;
  3505. return false;
  3506. } // if( pScrollBarWnd != NULL )
  3507. if( CWnd::SetScrollInfo(
  3508. nBar,
  3509. &si,
  3510. bRedraw ? TRUE : FALSE
  3511. )
  3512. )
  3513. return true;
  3514. return false;
  3515. }
  3516. void CExtScrollWnd::OnSwSetScrollRange(
  3517. int nBar,
  3518. LONG nMinPos,
  3519. LONG nMaxPos,
  3520. bool bRedraw // = true
  3521. )
  3522. {
  3523. ASSERT_VALID( this );
  3524. ASSERT( nBar == SB_HORZ || nBar == SB_VERT );
  3525. CScrollBar * pScrollBarWnd = GetScrollBarCtrl( nBar );
  3526. if( pScrollBarWnd != NULL )
  3527. {
  3528. pScrollBarWnd->SetScrollRange(
  3529. (int)nMinPos,
  3530. (int)nMaxPos,
  3531. bRedraw ? TRUE : FALSE
  3532. );
  3533. return;
  3534. } // if( pScrollBarWnd != NULL )
  3535. CWnd::SetScrollRange(
  3536. nBar,
  3537. (int)nMinPos,
  3538. (int)nMaxPos,
  3539. bRedraw ? TRUE : FALSE
  3540. );
  3541. }
  3542. LONG CExtScrollWnd::ScrollLimit32Get( int nBar ) const
  3543. {
  3544. ASSERT_VALID( this );
  3545. ASSERT( nBar == SB_HORZ || nBar == SB_VERT );
  3546. CScrollBar * pScrollBarWnd = GetScrollBarCtrl( nBar );
  3547. if( pScrollBarWnd != NULL )
  3548. {
  3549. if( m_bUse32BitScrollInfo )
  3550. {
  3551. SCROLLINFO _scroll_info;
  3552. ::memset( &_scroll_info, 0, sizeof(SCROLLINFO) );
  3553. _scroll_info.cbSize = sizeof(SCROLLINFO);
  3554. if( pScrollBarWnd->GetScrollInfo(
  3555. &_scroll_info,
  3556. SIF_RANGE|SIF_PAGE
  3557. )
  3558. )
  3559. {
  3560. LONG nRetVal = (LONG)
  3561. (_scroll_info.nMax
  3562. - _scroll_info.nMin
  3563. - _scroll_info.nPage
  3564. + 1);
  3565. ASSERT( nRetVal >= 0 );
  3566. return nRetVal;
  3567. }
  3568. //ASSERT( FALSE );
  3569. } // if( m_bUse32BitScrollInfo )
  3570. LONG nRetVal = (LONG)
  3571. pScrollBarWnd->GetScrollLimit();
  3572. return nRetVal;
  3573. } // if( pScrollBarWnd != NULL )
  3574. if( m_bUse32BitScrollInfo )
  3575. {
  3576. SCROLLINFO _scroll_info;
  3577. ::memset( &_scroll_info, 0, sizeof(SCROLLINFO) );
  3578. _scroll_info.cbSize = sizeof(SCROLLINFO);
  3579. if( ( const_cast < CExtScrollWnd * > ( this ) ) ->
  3580. CWnd::GetScrollInfo(
  3581. nBar,
  3582. &_scroll_info,
  3583. SIF_RANGE|SIF_PAGE
  3584. )
  3585. )
  3586. {
  3587. LONG nRetVal = (LONG)
  3588. (_scroll_info.nMax
  3589. - _scroll_info.nMin
  3590. - _scroll_info.nPage
  3591. + 1);
  3592. ASSERT( nRetVal >= 0 );
  3593. return nRetVal;
  3594. }
  3595. //ASSERT( FALSE );
  3596. } // if( m_bUse32BitScrollInfo )
  3597. LONG nRetVal = (LONG)
  3598. ( ( const_cast < CExtScrollWnd * > ( this ) ) ->
  3599. CWnd::GetScrollLimit( nBar )
  3600. );
  3601. return nRetVal;
  3602. }
  3603. void CExtScrollWnd::ScrollInfo32Get(
  3604. int nBar,
  3605. LONG * p_nMinPos,
  3606. LONG * p_nMaxPos,
  3607. LONG * p_nPageSize,
  3608. LONG * p_nCurrPos,
  3609. LONG * p_nTrackPos
  3610. ) const
  3611. {
  3612. ASSERT_VALID( this );
  3613. ASSERT( nBar == SB_HORZ || nBar == SB_VERT );
  3614. if( p_nMinPos != NULL )
  3615. *p_nMinPos = 0L;
  3616. if( p_nMaxPos != NULL )
  3617. *p_nMaxPos = 0L;
  3618. if( p_nPageSize != NULL )
  3619. *p_nPageSize = 0L;
  3620. if( p_nCurrPos != NULL )
  3621. *p_nCurrPos = 0L;
  3622. if( p_nTrackPos != NULL )
  3623. *p_nTrackPos = 0L;
  3624. CScrollBar * pScrollBarWnd = GetScrollBarCtrl( nBar );
  3625. if( pScrollBarWnd != NULL )
  3626. {
  3627. if( m_bUse32BitScrollInfo )
  3628. {
  3629. SCROLLINFO _scroll_info;
  3630. ::memset( &_scroll_info, 0, sizeof(SCROLLINFO) );
  3631. _scroll_info.cbSize = sizeof(SCROLLINFO);
  3632. if( pScrollBarWnd->GetScrollInfo(
  3633. &_scroll_info,
  3634. SIF_RANGE|SIF_PAGE|SIF_POS|SIF_TRACKPOS
  3635. )
  3636. )
  3637. {
  3638. if( p_nMinPos != NULL )
  3639. *p_nMinPos = _scroll_info.nMin;
  3640. if( p_nMaxPos != NULL )
  3641. *p_nMaxPos = _scroll_info.nMax;
  3642. if( p_nPageSize != NULL )
  3643. *p_nPageSize = _scroll_info.nPage;
  3644. if( p_nCurrPos != NULL )
  3645. *p_nCurrPos = _scroll_info.nPos;
  3646. if( p_nTrackPos != NULL )
  3647. *p_nTrackPos = _scroll_info.nTrackPos;
  3648. return;
  3649. }
  3650. //ASSERT( FALSE );
  3651. } // if( m_bUse32BitScrollInfo )
  3652. if( p_nMinPos != NULL || p_nMaxPos != NULL )
  3653. {
  3654. INT nMin = 0, nMax = 0;
  3655. pScrollBarWnd->GetScrollRange( &nMin, &nMax );
  3656. if( p_nMinPos != NULL )
  3657. *p_nMinPos = nMin;
  3658. if( p_nMaxPos != NULL )
  3659. *p_nMaxPos = nMax;
  3660. } // if( p_nMinPos != NULL || p_nMaxPos != NULL )
  3661. if( p_nCurrPos != NULL || p_nTrackPos != NULL )
  3662. {
  3663. INT nPos = pScrollBarWnd->GetScrollPos();
  3664. if( p_nCurrPos != NULL )
  3665. *p_nCurrPos = nPos;
  3666. if( p_nTrackPos != NULL )
  3667. *p_nTrackPos = nPos;
  3668. } // if( p_nCurrPos != NULL || p_nTrackPos != NULL )
  3669. return;
  3670. } // if( pScrollBarWnd != NULL )
  3671. if( m_bUse32BitScrollInfo )
  3672. {
  3673. SCROLLINFO _scroll_info;
  3674. ::memset( &_scroll_info, 0, sizeof(SCROLLINFO) );
  3675. _scroll_info.cbSize = sizeof(SCROLLINFO);
  3676. if( ( const_cast < CExtScrollWnd * > ( this ) ) ->
  3677. CWnd::GetScrollInfo(
  3678. nBar,
  3679. &_scroll_info,
  3680. SIF_RANGE|SIF_PAGE|SIF_POS|SIF_TRACKPOS
  3681. )
  3682. )
  3683. {
  3684. if( p_nMinPos != NULL )
  3685. *p_nMinPos = _scroll_info.nMin;
  3686. if( p_nMaxPos != NULL )
  3687. *p_nMaxPos = _scroll_info.nMax;
  3688. if( p_nPageSize != NULL )
  3689. *p_nPageSize = _scroll_info.nPage;
  3690. if( p_nCurrPos != NULL )
  3691. *p_nCurrPos = _scroll_info.nPos;
  3692. if( p_nTrackPos != NULL )
  3693. *p_nTrackPos = _scroll_info.nTrackPos;
  3694. return;
  3695. }
  3696. //ASSERT( FALSE );
  3697. } // if( m_bUse32BitScrollInfo )
  3698. if( p_nMinPos != NULL || p_nMaxPos != NULL )
  3699. {
  3700. INT nMin = 0, nMax = 0;
  3701. CWnd::GetScrollRange( nBar, &nMin, &nMax );
  3702. if( p_nMinPos != NULL )
  3703. *p_nMinPos = nMin;
  3704. if( p_nMaxPos != NULL )
  3705. *p_nMaxPos = nMax;
  3706. } // if( p_nMinPos != NULL || p_nMaxPos != NULL )
  3707. if( p_nCurrPos != NULL || p_nTrackPos != NULL )
  3708. {
  3709. INT nPos = CWnd::GetScrollPos( nBar );
  3710. if( p_nCurrPos != NULL )
  3711. *p_nCurrPos = nPos;
  3712. if( p_nTrackPos != NULL )
  3713. *p_nTrackPos = nPos;
  3714. } // if( p_nCurrPos != NULL || p_nTrackPos != NULL )
  3715. return;
  3716. }
  3717. LONG CExtScrollWnd::ScrollPos32Get(
  3718. int nBar,
  3719. bool bTrackPos // = false