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

界面编程

开发平台:

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. #if (!defined __EXT_SCROLLWND_H)
  22. #define __EXT_SCROLLWND_H
  23. #if _MSC_VER > 1000
  24. #pragma once
  25. #endif // _MSC_VER > 1000
  26. #if (!defined __EXT_MFC_DEF_H)
  27. #include <ExtMfcDef.h>
  28. #endif // __EXT_MFC_DEF_H
  29. #if (!defined __AFXTEMPL_H__)
  30. #include <AfxTempl.h>
  31. #endif
  32. #if (!defined __EXT_MOUSECAPTURESINK_H)
  33. #include <../Src/ExtMouseCaptureSink.h>
  34. #endif
  35. #if (!defined __EXT_CONTROLBAR_H)
  36. #include <ExtControlBar.h>
  37. #endif
  38. #if (!defined __EXT_HOOK_H)
  39. #include "../Src/ExtHook.h"
  40. #endif
  41. #if (!defined __EXT_PAINT_MANAGER_H)
  42. #include <ExtPaintManager.h>
  43. #endif
  44. #if (!defined __EXT_MEMORY_DC_H)
  45. #include <../Src/ExtMemoryDC.h>
  46. #endif
  47. #if (!defined __EXT_MFC_NO_SCROLLCONAINERWND)
  48. #if (!defined __EXT_LABEL_H)
  49. #include <ExtLabel.h>
  50. #endif
  51. #endif // (!defined __EXT_MFC_NO_SCROLLCONAINERWND)
  52. #define __EXT_SCROLL_NUMERIC_MAX INT_MAX
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CExtScrollBar window
  55. class CExtNCSB_ScrollContainer;
  56. #define __EXT_ID_SCROLL_HERE 0x100
  57. #define __EXT_ID_SCROLL_EDGE_LOWER 0x101
  58. #define __EXT_ID_SCROLL_EDGE_UPPER 0x102
  59. #define __EXT_ID_SCROLL_PAGE_LOWER 0x103
  60. #define __EXT_ID_SCROLL_PAGE_UPPER 0x104
  61. #define __EXT_ID_SCROLL_LINE_LOWER 0x105
  62. #define __EXT_ID_SCROLL_LINE_UPPER 0x106
  63. class __PROF_UIS_API CExtScrollBar
  64. : public CScrollBar
  65. , public CExtAnimationSingleton
  66. , public CExtHookSpy
  67. {
  68. public:
  69. DECLARE_DYNCREATE( CExtScrollBar );
  70. CExtScrollBar();
  71. public:
  72. INT m_nStepSize;
  73. virtual INT GetStepSize() const;
  74. /*
  75. SCROLLINFO m_scrollInfo;
  76. */
  77. enum eScrollerOrientation_t
  78. {
  79. __ESO_TOP = 0,
  80. __ESO_BOTTOM = 1,
  81. __ESO_LEFT = 2,
  82. __ESO_RIGHT = 3,
  83. __ESO_AUTO = 4,
  84. __ESO_NONE = 5,
  85. __ESO_MIN_VALUE = 0,
  86. __ESO_MAX_VALUE = 5,
  87. };
  88. eScrollerOrientation_t m_eSO;
  89. bool m_bAutoDeleteOnPostNcDestroy:1, m_bReflectParentSizing:1,
  90. m_bDisableAutoReserveSpace:1, m_bHelperLightAccent:1,
  91. m_bAutoReserveSpaceBefore:1, m_bAutoReserveSpaceAfter:1,
  92. m_bCompleteRepaint:1, m_bSmoothPainting:1,
  93. m_bHideHwndBefore:1, m_bHideHwndAfter:1,
  94. m_bEnabledToolTips:1, m_bEnabledTrackingToolTips:1,
  95. m_bEnableHookSpy:1, m_bHookCapturedState:1,
  96. m_bSendActionNotifications:1, m_bPopupInactiveLightMode:1,
  97. m_bSendEqualNotifications:1;
  98. HWND m_hWndBefore, m_hWndAfter;
  99. CExtSafeString
  100. m_strTipTextForUpButton, m_strTipTextForDownButton,
  101. m_strTipTextForPageUpArea, m_strTipTextForPageDownArea,
  102. m_strTipTextForThumbButton;
  103. int m_nMouseActivateCode;
  104. virtual void SyncReservedSpace( CExtScrollBar * pOtherBar );
  105. virtual eScrollerOrientation_t GetScrollerOrientation() const;
  106. public:
  107. //{{AFX_VIRTUAL(CExtScrollBar)
  108. protected:
  109. virtual void PreSubclassWindow();
  110. virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
  111. virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
  112. //}}AFX_VIRTUAL
  113. public:
  114. virtual bool OnHookSpyPreTranslateMessage(
  115. MSG * pMSG
  116. );
  117. virtual bool OnHookSpyMouseMoveMsg(
  118. MSG * pMSG
  119. );
  120. virtual bool OnHookSpyMouseClickMsg(
  121. MSG * pMSG
  122. );
  123. bool ScrollBar_OnMouseMoveMsg(
  124. MSG * pMSG
  125. );
  126. bool ScrollBar_OnMouseClickMsg(
  127. MSG * pMSG
  128. );
  129. virtual HWND ScrollBar_CaptureGet() const;
  130. virtual void ScrollBar_CaptureSet();
  131. virtual void ScrollBar_CaptureRelease();
  132. virtual void ScrollBar_TrackMouseLButtonDown(
  133. MSG * pMSG
  134. );
  135. virtual void OnSbPaint( CDC & dc );
  136. virtual bool _IsLockAbleMessage( UINT message ) const;
  137. virtual INT _GetScrollPos(
  138. bool bTrackPos = false
  139. ) const;
  140. virtual void _SetScrollPos(
  141. INT nPos,
  142. bool bTrackPos = false,
  143. bool bRedraw = true,
  144. bool bSendScrollingNotification = true
  145. );
  146. virtual ~CExtScrollBar();
  147. CExtNCSB_ScrollContainer * _GetParentScrollContainer();
  148. virtual CExtPopupMenuTipWnd * OnAdvancedPopupMenuTipWndGet() const;
  149. virtual bool OnAdvancedPopupMenuTipWndGetInfo(
  150. CExtPopupMenuTipWnd & _ATTW,
  151. INT nSBMHT,
  152. bool bTrackingTip,
  153. CRect & rcExcludeArea,
  154. CExtSafeString & strTipText
  155. ) const;
  156. virtual void OnAdvancedPopupMenuTipWndDisplay(
  157. CExtPopupMenuTipWnd & _ATTW,
  158. INT nSBMHT,
  159. bool bTrackingTip
  160. ) const;
  161. virtual void OnAdvancedPopupMenuTipWndDisplay(
  162. CExtPopupMenuTipWnd & _ATTW,
  163. const RECT & rcExcludeArea,
  164. __EXT_MFC_SAFE_LPCTSTR strTipText,
  165. bool bTrackingTip
  166. ) const;
  167. virtual void PostNcDestroy();
  168. virtual bool AnimationClient_EnabledGet() const;
  169. virtual bool AnimationSite_EnabledGet() const;
  170. virtual void AnimationSite_OnProgressShutdownTimer( UINT nTimerID );
  171. virtual HWND AnimationSite_GetSafeHWND() const;
  172. virtual const CExtAnimationParameters *
  173. AnimationClient_OnQueryAnimationParameters(
  174. INT eAPT // __EAPT_*** animation type
  175. ) const;
  176. virtual bool AnimationClient_CacheNextState(
  177. CDC & dc,
  178. const RECT & rcAcAnimationTarget,
  179. bool bAnimate,
  180. INT eAPT // __EAPT_*** animation type
  181. );
  182. virtual void PmBridge_OnPaintManagerChanged(
  183. CExtPaintManager * pGlobalPM
  184. );
  185. INT m_nHorzBarHeight, m_nVertBarWidth,
  186. m_nHorzButtonWidth, m_nVertButtonHeight,
  187. m_nHorzThumbMinWidth, m_nVertThumbMinHeight;
  188. protected:
  189. virtual void _ScanSysMertics();
  190. bool m_bProcessingClick:1, m_bProcessingOutClick:1,
  191. m_bProcessingHover:1, m_bProcessingCancelMode:1,
  192. m_bHelperHaveTrackPos:1;
  193. INT m_nSBMHT, m_nHelperTrackPos;
  194. CPoint m_ptCtxMenuCache;
  195. public:
  196. bool m_bAlwaysSendThumbButtonNotifications:1, m_bEnableCtxMenu:1;
  197. protected:
  198. //{{AFX_MSG(CExtScrollBar)
  199. afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  200. afx_msg void OnPaint();
  201.     afx_msg void OnWindowPosChanging(WINDOWPOS FAR* lpwndpos);
  202. afx_msg void OnWindowPosChanged(WINDOWPOS FAR* lpwndpos);
  203.     afx_msg void OnSize(UINT nType, int cx, int cy);
  204. afx_msg void OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp);
  205. afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
  206. afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message);
  207. afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
  208. afx_msg void OnEnable(BOOL bEnable);
  209. afx_msg void OnCancelMode();
  210. afx_msg void OnCaptureChanged(CWnd *pWnd);
  211. afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
  212. afx_msg void OnMouseMove(UINT nFlags, CPoint point);
  213. afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  214. afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  215. afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
  216. afx_msg void OnMButtonDown(UINT nFlags, CPoint point);
  217. afx_msg void OnMButtonUp(UINT nFlags, CPoint point);
  218. afx_msg void OnMButtonDblClk(UINT nFlags, CPoint point);
  219. afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
  220. afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
  221. afx_msg void OnRButtonDblClk(UINT nFlags, CPoint point);
  222. //}}AFX_MSG
  223. afx_msg UINT OnNcHitTest(CPoint point);
  224. afx_msg void OnTimer(__EXT_MFC_UINT_PTR nIDEvent);
  225. afx_msg void OnSettingChange(UINT uFlags, __EXT_MFC_SAFE_LPCTSTR lpszSection);
  226. afx_msg LRESULT OnSizeParent( WPARAM wParam, LPARAM lParam );
  227. afx_msg void OnScrollHere();
  228. afx_msg void OnScrollEdgeLower();
  229. afx_msg void OnScrollEdgeUpper();
  230. afx_msg void OnScrollPageLower();
  231. afx_msg void OnScrollPageUpper();
  232. afx_msg void OnScrollLineLower();
  233. afx_msg void OnScrollLineUpper();
  234. DECLARE_MESSAGE_MAP()
  235. }; // class CExtScrollBar
  236. /////////////////////////////////////////////////////////////////////////////
  237. // CExtNSB template
  238. // Provides any CWnd with Prof-UIS CExtScrollBar nicer scroll bars.
  239. // CWnd should use RepositionBars for docking Prof-UIS scroll bars to its borders.
  240. template < class _BT >
  241. class CExtNSB : public _BT
  242. {
  243. public:
  244. mutable CExtScrollBar m_wndScrollBarH, m_wndScrollBarV;
  245. virtual bool NSB_EnsureScrollBarsCreated() const
  246. {
  247. if( m_wndScrollBarH.GetSafeHwnd() != NULL
  248. && m_wndScrollBarV.GetSafeHwnd() != NULL
  249. )
  250. return true;
  251. m_wndScrollBarH.m_eSO = CExtScrollBar::__ESO_BOTTOM;
  252. m_wndScrollBarV.m_eSO = CExtScrollBar::__ESO_RIGHT;
  253. if( m_wndScrollBarV.GetSafeHwnd() == NULL )
  254. {
  255. if( ! m_wndScrollBarV.Create(
  256. WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|SBS_VERT|SBS_RIGHTALIGN,
  257. CRect(0,0,0,0),
  258. ((CWnd*)this),
  259. 1
  260. )
  261. )
  262. {
  263. ASSERT( FALSE );
  264. return false;
  265. }
  266. }
  267. if( m_wndScrollBarH.GetSafeHwnd() == NULL )
  268. {
  269. if( ! m_wndScrollBarH.Create(
  270. WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|SBS_HORZ|SBS_BOTTOMALIGN,
  271. CRect(0,0,0,0),
  272. ((CWnd*)this),
  273. 2
  274. )
  275. )
  276. {
  277. ASSERT( FALSE );
  278. return false;
  279. }
  280. }
  281. m_wndScrollBarH.SyncReservedSpace( &m_wndScrollBarV );
  282. m_wndScrollBarV.SyncReservedSpace( &m_wndScrollBarH );
  283. return true;
  284. }
  285. virtual CScrollBar * GetScrollBarCtrl( int nBar ) const
  286. {
  287. ASSERT_VALID( this );
  288. switch( nBar )
  289. {
  290. case SB_HORZ:
  291. case SB_VERT:
  292. if( NSB_EnsureScrollBarsCreated() )
  293. {
  294. CExtScrollBar * pExtScrollBar = ( nBar == SB_HORZ ) ? (&m_wndScrollBarH) : (&m_wndScrollBarV);
  295. ASSERT_VALID( pExtScrollBar );
  296. ASSERT( pExtScrollBar->GetSafeHwnd() != NULL );
  297. //pExtScrollBar->m_bSendActionNotifications = false;
  298. return pExtScrollBar;
  299. }
  300. break;
  301. }
  302. return NULL;
  303. }
  304. }; // class CExtNSB
  305. /////////////////////////////////////////////////////////////////////////////
  306. // CExtZoomScrollBar window
  307. class __PROF_UIS_API CExtZoomScrollBar : public CExtScrollBar
  308. {
  309. // Construction
  310. public:
  311. DECLARE_DYNCREATE( CExtZoomScrollBar );
  312. CExtZoomScrollBar();
  313. public:
  314. //{{AFX_VIRTUAL(CExtZoomScrollBar)
  315. //}}AFX_VIRTUAL
  316. public:
  317. virtual ~CExtZoomScrollBar();
  318. protected:
  319. //{{AFX_MSG(CExtZoomScrollBar)
  320. //}}AFX_MSG
  321. DECLARE_MESSAGE_MAP()
  322. }; // class CExtZoomScrollBar
  323. /////////////////////////////////////////////////////////////////////////////
  324. // class CExtNCSB_ScrollContainer
  325. #define __EXT_NCSB_SCROLL_CONTAINER_CLASS_NAME _T("ProfUIS-NCSB_ScrollContainer")
  326. class __PROF_UIS_API CExtNCSB_ScrollContainer : public CWnd
  327. {
  328. public:
  329. enum e_mode_t
  330. {
  331. __EM_MIDDLE_CONTAINER = 0,
  332. __EM_CORNER_AREA = 1,
  333. __EM_HORIZONTAL_SCROLL_BAR = 2,
  334. __EM_VERTICAL_SCROLL_BAR = 3,
  335. __EM_MIN_VALUE = 0,
  336. __EM_MAX_VALUE = 3,
  337. };
  338. protected:
  339. mutable HWND m_hWndScrollingTaget;
  340. e_mode_t m_eMode;
  341. mutable CExtScrollBar * m_pWndScrollBar;
  342. public:
  343. DECLARE_DYNAMIC( CExtNCSB_ScrollContainer );
  344. CExtNCSB_ScrollContainer(
  345. HWND hWndScrollingTaget,
  346. e_mode_t eMode
  347. );
  348. virtual ~CExtNCSB_ScrollContainer();
  349. HWND GetSafeScrollingTargetHWND() const;
  350. CExtScrollBar * GetScrollBarInContainer() const;
  351. e_mode_t GetMode() const;
  352. virtual CExtScrollBar * OnInstantiateAndCreateScrollBar( bool bChildMode );
  353. virtual bool Create( CWnd * pWndParent );
  354. protected:
  355. virtual void PreSubclassWindow();
  356. virtual void PostNcDestroy();
  357. virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam );
  358. }; /// class CExtNCSB_ScrollContainer
  359. /////////////////////////////////////////////////////////////////////////////
  360. // template class CExtNCSB_Impl
  361. // skin scroll bars of any window with non-client area scroll bars
  362. template < class _BTNCSBimpl >
  363. class CExtNCSB_Impl : public _BTNCSBimpl
  364. {
  365. protected:
  366. mutable HWND m_hWndNcsbContainerHorizontal, m_hWndNcsbContainerVertical, m_hWndNcsbContainerCorner, m_hWndNcsbContainerMiddle;
  367. mutable CExtNCSB_ScrollContainer * m_pNcsbContainerHorizontal, * m_pNcsbContainerVertical, * m_pNcsbContainerCorner, * m_pNcsbContainerMiddle;
  368. bool m_bNcsbHelperDestructionMode:1, m_bNcsbFirstPaintMessagePassed:1;
  369. public:
  370. CPoint m_ptNcsbProtectMouseMoveLast;
  371. bool m_bNcsbUse32BitScrollInfo:1, m_bNcsbForceMiddleContainerMode:1,
  372. m_bNcsbProtectMessageLoopFromMfcToolHitTesting:1, m_bNcsbDelayedInitialization:1,
  373. m_bNcsbForceRedrawOnMouseWheel:1, m_bNcsbCreatingContainers:1,
  374. m_bNcsbUpdateTargetWindowScrollInfoH:1, m_bNcsbUpdateTargetWindowScrollInfoV:1,
  375. m_bNcsbUpdateTargetWindowScrollPosH:1, m_bNcsbUpdateTargetWindowScrollPosV:1;
  376. CRect m_rcNcsbCustomNcAreaSizes;
  377. COLORREF m_clrNcsbCustomNcAreaFill;
  378. CExtNCSB_Impl(
  379. bool bNcsbDelayedInitialization = false,
  380. bool bNcsbForceMiddleContainerMode = false
  381. )
  382. : m_pNcsbContainerHorizontal( NULL )
  383. , m_pNcsbContainerVertical( NULL )
  384. , m_pNcsbContainerCorner( NULL )
  385. , m_pNcsbContainerMiddle( NULL )
  386. , m_hWndNcsbContainerHorizontal( NULL )
  387. , m_hWndNcsbContainerVertical( NULL )
  388. , m_hWndNcsbContainerCorner( NULL )
  389. , m_hWndNcsbContainerMiddle( NULL )
  390. , m_bNcsbUse32BitScrollInfo( true )
  391. , m_bNcsbHelperDestructionMode( false )
  392. , m_bNcsbDelayedInitialization( bNcsbDelayedInitialization )
  393. , m_bNcsbForceMiddleContainerMode( bNcsbForceMiddleContainerMode )
  394. , m_bNcsbProtectMessageLoopFromMfcToolHitTesting( true )
  395. , m_ptNcsbProtectMouseMoveLast( -32767, -32767 )
  396. , m_rcNcsbCustomNcAreaSizes( -1, -1, -1, -1 )
  397. , m_clrNcsbCustomNcAreaFill( COLORREF(-1L) )
  398. , m_bNcsbFirstPaintMessagePassed( false )
  399. , m_bNcsbForceRedrawOnMouseWheel( false )
  400. , m_bNcsbCreatingContainers( false )
  401. , m_bNcsbUpdateTargetWindowScrollInfoH( false )
  402. , m_bNcsbUpdateTargetWindowScrollInfoV( false )
  403. , m_bNcsbUpdateTargetWindowScrollPosH( false )
  404. , m_bNcsbUpdateTargetWindowScrollPosV( false )
  405. {
  406. }
  407. CExtNCSB_Impl(
  408. UINT nIDTemplate,
  409. CWnd * pParentWnd,
  410. bool bNcsbDelayedInitialization = false,
  411. bool bNcsbForceMiddleContainerMode = false
  412. )
  413. : _BTNCSBimpl( nIDTemplate, pParentWnd )
  414. , m_pNcsbContainerHorizontal( NULL )
  415. , m_pNcsbContainerVertical( NULL )
  416. , m_pNcsbContainerCorner( NULL )
  417. , m_pNcsbContainerMiddle( NULL )
  418. , m_hWndNcsbContainerHorizontal( NULL )
  419. , m_hWndNcsbContainerVertical( NULL )
  420. , m_hWndNcsbContainerCorner( NULL )
  421. , m_hWndNcsbContainerMiddle( NULL )
  422. , m_bNcsbUse32BitScrollInfo( true )
  423. , m_bNcsbHelperDestructionMode( false )
  424. , m_bNcsbDelayedInitialization( bNcsbDelayedInitialization )
  425. , m_bNcsbForceMiddleContainerMode( bNcsbForceMiddleContainerMode )
  426. , m_bNcsbProtectMessageLoopFromMfcToolHitTesting( true )
  427. , m_ptNcsbProtectMouseMoveLast( -32767, -32767 )
  428. , m_rcNcsbCustomNcAreaSizes( -1, -1, -1, -1 )
  429. , m_clrNcsbCustomNcAreaFill( COLORREF(-1L) )
  430. , m_bNcsbFirstPaintMessagePassed( false )
  431. , m_bNcsbForceRedrawOnMouseWheel( false )
  432. , m_bNcsbCreatingContainers( false )
  433. {
  434. }
  435. CExtNCSB_Impl(
  436. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  437. CWnd * pParentWnd,
  438. bool bNcsbDelayedInitialization = false,
  439. bool bNcsbForceMiddleContainerMode = false
  440. )
  441. : _BTNCSBimpl( lpszTemplateName, pParentWnd )
  442. , m_pNcsbContainerHorizontal( NULL )
  443. , m_pNcsbContainerVertical( NULL )
  444. , m_pNcsbContainerCorner( NULL )
  445. , m_pNcsbContainerMiddle( NULL )
  446. , m_hWndNcsbContainerHorizontal( NULL )
  447. , m_hWndNcsbContainerVertical( NULL )
  448. , m_hWndNcsbContainerCorner( NULL )
  449. , m_hWndNcsbContainerMiddle( NULL )
  450. , m_bNcsbUse32BitScrollInfo( true )
  451. , m_bNcsbHelperDestructionMode( false )
  452. , m_bNcsbDelayedInitialization( bNcsbDelayedInitialization )
  453. , m_bNcsbForceMiddleContainerMode( bNcsbForceMiddleContainerMode )
  454. , m_bNcsbProtectMessageLoopFromMfcToolHitTesting( true )
  455. , m_ptNcsbProtectMouseMoveLast( -32767, -32767 )
  456. , m_rcNcsbCustomNcAreaSizes( -1, -1, -1, -1 )
  457. , m_clrNcsbCustomNcAreaFill( COLORREF(-1L) )
  458. , m_bNcsbFirstPaintMessagePassed( false )
  459. , m_bNcsbForceRedrawOnMouseWheel( false )
  460. , m_bNcsbCreatingContainers( false )
  461. {
  462. }
  463. virtual ~CExtNCSB_Impl()
  464. {
  465. NCSB_EnsureContainersDestroyed();
  466. }
  467. virtual bool NCSB_IsDestructionMode() const
  468. {
  469. ASSERT_VALID( this );
  470. return m_bNcsbHelperDestructionMode;
  471. }
  472. virtual bool NCSB_IsMiddleContainerRequired() const
  473. {
  474. ASSERT_VALID( this );
  475. if( m_bNcsbForceMiddleContainerMode )
  476. return true;
  477. return false;
  478. }
  479. virtual CWnd * NCSB_GetParentWindow()
  480. {
  481. ASSERT_VALID( this );
  482. if( GetSafeHwnd() == NULL )
  483. return NULL;
  484. DWORD dwStyle = GetStyle();
  485. if( (dwStyle&WS_CHILD) == 0 )
  486. return this;
  487. CWnd * pWndParent = GetParent();
  488. if( pWndParent->GetSafeHwnd() == ::GetDesktopWindow() )
  489. return this;
  490. return pWndParent;
  491. }
  492. virtual bool NSCB_IsLeftScrollBarMode() const
  493. {
  494. ASSERT_VALID( this );
  495. DWORD dwStyleEx = GetExStyle();
  496. if( (dwStyleEx&WS_EX_LEFTSCROLLBAR) != 0 )
  497. return true;
  498. else
  499. return false;
  500. }
  501. virtual CExtNCSB_ScrollContainer * NCSB_GetContainer( CExtNCSB_ScrollContainer::e_mode_t eMode ) const
  502. {
  503. ASSERT_VALID( this );
  504. ASSERT( INT(CExtNCSB_ScrollContainer::__EM_MIN_VALUE) <= INT(eMode) && INT(eMode) <= INT(CExtNCSB_ScrollContainer::__EM_MAX_VALUE) );
  505. CExtNCSB_ScrollContainer * pWnd = NULL;
  506. HWND hWnd = NULL;
  507. switch( eMode )
  508. {
  509. case CExtNCSB_ScrollContainer::__EM_MIDDLE_CONTAINER:
  510. pWnd = m_pNcsbContainerMiddle;
  511. hWnd = m_hWndNcsbContainerMiddle;
  512. break;
  513. case CExtNCSB_ScrollContainer::__EM_CORNER_AREA:
  514. pWnd = m_pNcsbContainerCorner;
  515. hWnd = m_hWndNcsbContainerCorner;
  516. break;
  517. case CExtNCSB_ScrollContainer::__EM_HORIZONTAL_SCROLL_BAR:
  518. pWnd = m_pNcsbContainerHorizontal;
  519. hWnd = m_hWndNcsbContainerHorizontal;
  520. break;
  521. case CExtNCSB_ScrollContainer::__EM_VERTICAL_SCROLL_BAR:
  522. pWnd = m_pNcsbContainerVertical;
  523. hWnd = m_hWndNcsbContainerVertical;
  524. break;
  525. }
  526. if( pWnd == NULL
  527. || hWnd == NULL
  528. || (! ::IsWindow( hWnd ) )
  529. || LPVOID( CWnd::FromHandlePermanent( hWnd ) ) != LPVOID( pWnd )
  530. )
  531. return NULL;
  532. return pWnd;
  533. }
  534. virtual CExtNCSB_ScrollContainer * NCSB_InstantiateAndCreateContainer(
  535. CExtNCSB_ScrollContainer::e_mode_t eMode,
  536. CWnd * pWndParent
  537. )
  538. {
  539. ASSERT_VALID( this );
  540. if( NCSB_IsDestructionMode() || GetSafeHwnd() == NULL || pWndParent->GetSafeHwnd() == NULL )
  541. return NULL;
  542. ASSERT_VALID( pWndParent );
  543. CExtNCSB_ScrollContainer * pWnd =
  544. new CExtNCSB_ScrollContainer(
  545. m_hWnd,
  546. eMode
  547. );
  548. if( ! pWnd->Create( pWndParent ) )
  549. return NULL;
  550. return pWnd;
  551. }
  552. virtual bool NCSB_EnsureContainersCreated()
  553. {
  554. ASSERT_VALID( this );
  555. if( ! g_PaintManager.m_bAutoSkinScrollBars )
  556. return false;
  557. if( NCSB_IsDestructionMode() || GetSafeHwnd() == NULL )
  558. return false;
  559. if( m_pNcsbContainerHorizontal != NULL || m_pNcsbContainerVertical != NULL || m_pNcsbContainerCorner != NULL )
  560. {
  561. ASSERT( m_pNcsbContainerHorizontal != NULL && m_pNcsbContainerVertical != NULL && m_pNcsbContainerCorner != NULL );
  562. ASSERT( m_hWndNcsbContainerHorizontal != NULL && m_hWndNcsbContainerVertical != NULL && m_hWndNcsbContainerCorner != NULL );
  563. return true;
  564. }
  565. CWnd * pWndParent = NCSB_GetParentWindow();
  566. if( pWndParent == NULL )
  567. return false;
  568. ASSERT_VALID( pWndParent );
  569. ASSERT( pWndParent->GetSafeHwnd() != NULL );
  570. if( m_bNcsbCreatingContainers )
  571. return false;
  572. m_bNcsbCreatingContainers = true;
  573. if( NCSB_IsMiddleContainerRequired() )
  574. {
  575. ASSERT( (GetStyle()&WS_CHILD) != 0 );
  576. if( m_pNcsbContainerMiddle == NULL )
  577. {
  578. m_pNcsbContainerMiddle = NCSB_InstantiateAndCreateContainer( CExtNCSB_ScrollContainer::__EM_MIDDLE_CONTAINER, pWndParent );
  579. m_hWndNcsbContainerMiddle = m_pNcsbContainerMiddle->GetSafeHwnd();
  580. if( m_pNcsbContainerMiddle == NULL )
  581. {
  582. m_bNcsbCreatingContainers = false;
  583. return false;
  584. }
  585. }
  586. pWndParent = m_pNcsbContainerMiddle;
  587. ASSERT( LPVOID(pWndParent) == LPVOID(NCSB_GetParentWindow()) );
  588. }
  589. m_pNcsbContainerHorizontal = NCSB_InstantiateAndCreateContainer( CExtNCSB_ScrollContainer::__EM_HORIZONTAL_SCROLL_BAR, pWndParent );
  590. m_hWndNcsbContainerHorizontal = m_pNcsbContainerHorizontal->GetSafeHwnd();
  591. if( m_pNcsbContainerHorizontal == NULL )
  592. {
  593. NCSB_EnsureContainersDestroyed();
  594. m_pNcsbContainerHorizontal = m_pNcsbContainerVertical = m_pNcsbContainerCorner = m_pNcsbContainerMiddle = NULL;
  595. m_hWndNcsbContainerHorizontal = m_hWndNcsbContainerVertical = m_hWndNcsbContainerCorner = m_hWndNcsbContainerMiddle = NULL;
  596. m_bNcsbCreatingContainers = false;
  597. return false;
  598. }
  599. m_pNcsbContainerVertical = NCSB_InstantiateAndCreateContainer( CExtNCSB_ScrollContainer::__EM_VERTICAL_SCROLL_BAR, pWndParent );
  600. m_hWndNcsbContainerVertical = m_pNcsbContainerVertical->GetSafeHwnd();
  601. if( m_pNcsbContainerVertical == NULL )
  602. {
  603. NCSB_EnsureContainersDestroyed();
  604. m_pNcsbContainerHorizontal = m_pNcsbContainerVertical = m_pNcsbContainerCorner = m_pNcsbContainerMiddle = NULL;
  605. m_hWndNcsbContainerHorizontal = m_hWndNcsbContainerVertical = m_hWndNcsbContainerCorner = m_hWndNcsbContainerMiddle = NULL;
  606. m_bNcsbCreatingContainers = false;
  607. return false;
  608. }
  609. m_pNcsbContainerCorner = NCSB_InstantiateAndCreateContainer( CExtNCSB_ScrollContainer::__EM_CORNER_AREA, pWndParent );
  610. m_hWndNcsbContainerCorner = m_pNcsbContainerCorner->GetSafeHwnd();
  611. if( m_pNcsbContainerCorner == NULL )
  612. {
  613. NCSB_EnsureContainersDestroyed();
  614. m_pNcsbContainerHorizontal = m_pNcsbContainerVertical = m_pNcsbContainerCorner =  m_pNcsbContainerMiddle = NULL;
  615. m_hWndNcsbContainerHorizontal = m_hWndNcsbContainerVertical = m_hWndNcsbContainerCorner = m_hWndNcsbContainerMiddle = NULL;
  616. m_bNcsbCreatingContainers = false;
  617. return false;
  618. }
  619. m_bNcsbCreatingContainers = false;
  620. return true;
  621. }
  622. virtual void NCSB_EnsureContainersDestroyed()
  623. {
  624. ASSERT_VALID( this );
  625. CExtNCSB_ScrollContainer * pWnd;
  626. pWnd = NCSB_GetContainer( CExtNCSB_ScrollContainer::__EM_HORIZONTAL_SCROLL_BAR );
  627. if( pWnd->GetSafeHwnd() != NULL )
  628. pWnd->DestroyWindow();
  629. pWnd = NCSB_GetContainer( CExtNCSB_ScrollContainer::__EM_VERTICAL_SCROLL_BAR );
  630. if( pWnd->GetSafeHwnd() != NULL )
  631. pWnd->DestroyWindow();
  632. pWnd = NCSB_GetContainer( CExtNCSB_ScrollContainer::__EM_CORNER_AREA );
  633. if( pWnd->GetSafeHwnd() != NULL )
  634. pWnd->DestroyWindow();
  635. pWnd = NCSB_GetContainer( CExtNCSB_ScrollContainer::__EM_MIDDLE_CONTAINER );
  636. if( pWnd->GetSafeHwnd() != NULL )
  637. pWnd->PostMessage( WM_CLOSE );
  638. }
  639. virtual INT NCSB_GetScrollBarExtent( bool bHorizontal )
  640. {
  641. ASSERT_VALID( this );
  642. INT nExtent = (INT)::GetSystemMetrics( bHorizontal ? SM_CYHSCROLL : SM_CXVSCROLL );
  643. return nExtent;
  644. }
  645. virtual void NCSB_GetScrollInfoWindow( bool bHorizontal, SCROLLINFO & _scroll_info )
  646. {
  647. ASSERT_VALID( this );
  648. ::memset( &_scroll_info, 0, sizeof(SCROLLINFO) );
  649. _scroll_info.cbSize = sizeof(SCROLLINFO);
  650. if( NCSB_IsDestructionMode() || GetSafeHwnd() == NULL )
  651. return;
  652. int nBar = bHorizontal ? SB_HORZ : SB_VERT;
  653. if( m_bNcsbUse32BitScrollInfo )
  654. {
  655. if( ((CWnd*)(this)) ->
  656. CWnd::GetScrollInfo(
  657. nBar,
  658. &_scroll_info,
  659. SIF_RANGE|SIF_PAGE|SIF_POS|SIF_TRACKPOS
  660. )
  661. )
  662. return;
  663. } // if( m_bNcsbUse32BitScrollInfo )
  664. INT nMin = 0, nMax = 0;
  665. CWnd::GetScrollRange( nBar, &nMin, &nMax );
  666. _scroll_info.nMin = nMin;
  667. _scroll_info.nMax = nMax;
  668. _scroll_info.nPos = _scroll_info.nTrackPos = CWnd::GetScrollPos( nBar );
  669. }
  670. virtual void NCSB_SetScrollInfoWindow( bool bHorizontal, SCROLLINFO & _scroll_info )
  671. {
  672. ASSERT_VALID( this );
  673. ::memset( &_scroll_info, 0, sizeof(SCROLLINFO) );
  674. _scroll_info.cbSize = sizeof(SCROLLINFO);
  675. if( NCSB_IsDestructionMode() || GetSafeHwnd() == NULL )
  676. return;
  677. int nBar = bHorizontal ? SB_HORZ : SB_VERT;
  678. if( m_bNcsbUse32BitScrollInfo )
  679. {
  680. if( ((CWnd*)(this)) ->
  681. CWnd::SetScrollInfo(
  682. nBar,
  683. &_scroll_info
  684. )
  685. )
  686. return;
  687. } // if( m_bNcsbUse32BitScrollInfo )
  688. if( ( _scroll_info.fMask & SIF_RANGE ) != 0 )
  689. CWnd::SetScrollRange( nBar, _scroll_info.nMin, _scroll_info.nMax );
  690. if( ( _scroll_info.fMask & SIF_POS ) != 0 )
  691. CWnd::SetScrollPos( nBar, _scroll_info.nPos );
  692. }
  693. virtual void NCSB_GetScrollInfoBar( CExtScrollBar * pScrollBar, SCROLLINFO & _scroll_info )
  694. {
  695. ASSERT_VALID( this );
  696. ::memset( &_scroll_info, 0, sizeof(SCROLLINFO) );
  697. _scroll_info.cbSize = sizeof(SCROLLINFO);
  698. if( NCSB_IsDestructionMode() || GetSafeHwnd() == NULL )
  699. return;
  700. ASSERT_VALID( pScrollBar );
  701. ASSERT( pScrollBar->GetSafeHwnd() != NULL );
  702. if( m_bNcsbUse32BitScrollInfo )
  703. {
  704. if( pScrollBar->GetScrollInfo(
  705. &_scroll_info,
  706. SIF_RANGE|SIF_PAGE|SIF_POS|SIF_TRACKPOS
  707. )
  708. )
  709. return;
  710. } // if( m_bNcsbUse32BitScrollInfo )
  711. INT nMin = 0, nMax = 0;
  712. pScrollBar->GetScrollRange( &nMin, &nMax );
  713. _scroll_info.nMin = nMin;
  714. _scroll_info.nMax = nMax;
  715. _scroll_info.nPos = _scroll_info.nTrackPos = pScrollBar->GetScrollPos();
  716. }
  717. virtual void NCSB_UpdateChannelPos( bool bHorizontal, bool bTrackPos )
  718. {
  719. ASSERT_VALID( this );
  720. if( NCSB_IsDestructionMode() || GetSafeHwnd() == NULL )
  721. return;
  722. CExtNCSB_ScrollContainer * pWnd =
  723. NCSB_GetContainer(
  724. bHorizontal
  725. ? CExtNCSB_ScrollContainer::__EM_HORIZONTAL_SCROLL_BAR
  726. : CExtNCSB_ScrollContainer::__EM_VERTICAL_SCROLL_BAR
  727. );
  728. if( pWnd == NULL )
  729. return;
  730. ASSERT( pWnd->GetSafeHwnd() != NULL );
  731. CExtScrollBar * pScrollBar = pWnd->GetScrollBarInContainer();
  732. if( pScrollBar == NULL )
  733. return;
  734. ASSERT( pScrollBar->GetSafeHwnd() != NULL );
  735. int nBar = bHorizontal ? SB_HORZ : SB_VERT;
  736. INT nPos = (INT)pScrollBar->_GetScrollPos( bTrackPos );
  737. CWnd::SetScrollPos( nBar, nPos );
  738. }
  739. virtual void NCSB_UpdateChannel( bool bHorizontal )
  740. {
  741. ASSERT_VALID( this );
  742. if( NCSB_IsDestructionMode() || GetSafeHwnd() == NULL )
  743. return;
  744. CExtNCSB_ScrollContainer * pWnd =
  745. NCSB_GetContainer(
  746. bHorizontal
  747. ? CExtNCSB_ScrollContainer::__EM_HORIZONTAL_SCROLL_BAR
  748. : CExtNCSB_ScrollContainer::__EM_VERTICAL_SCROLL_BAR
  749. );
  750. if( pWnd == NULL )
  751. return;
  752. ASSERT( pWnd->GetSafeHwnd() != NULL );
  753. CExtScrollBar * pScrollBar = pWnd->GetScrollBarInContainer();
  754. if( pScrollBar == NULL )
  755. return;
  756. ASSERT( pScrollBar->GetSafeHwnd() != NULL );
  757. BOOL bWindowEnabled = IsWindowEnabled();
  758. pWnd->EnableWindow( bWindowEnabled );
  759. SCROLLINFO _scroll_info_window, _scroll_info_bar;
  760. ::memset( &_scroll_info_window, 0, sizeof(SCROLLINFO) );
  761. ::memset( &_scroll_info_bar, 0, sizeof(SCROLLINFO) );
  762. _scroll_info_window.cbSize = sizeof(SCROLLINFO);
  763. _scroll_info_bar.cbSize = sizeof(SCROLLINFO);
  764. if( bWindowEnabled )
  765. {
  766. NCSB_GetScrollInfoWindow( bHorizontal, _scroll_info_window );
  767. NCSB_GetScrollInfoBar( pScrollBar, _scroll_info_bar );
  768. }
  769. //_scroll_info_window.fMask = _scroll_info_bar.fMask = SIF_POS|SIF_TRACKPOS;
  770. //_scroll_info_window.nMin = _scroll_info_window.nMax = _scroll_info_window.nPage
  771. // = _scroll_info_bar.nMin = _scroll_info_bar.nMax = _scroll_info_bar.nPage
  772. // = 0;
  773. if( ::memcmp( &_scroll_info_window, &_scroll_info_bar, sizeof(SCROLLINFO) ) != 0 )
  774. NCSB_SetScrollInfoWindow( bHorizontal, _scroll_info_bar );
  775. }
  776. virtual void NCSB_RescanChannel( bool bHorizontal )
  777. {
  778. ASSERT_VALID( this );
  779. if( NCSB_IsDestructionMode() || GetSafeHwnd() == NULL )
  780. return;
  781. CExtNCSB_ScrollContainer * pWnd =
  782. NCSB_GetContainer(
  783. bHorizontal
  784. ? CExtNCSB_ScrollContainer::__EM_HORIZONTAL_SCROLL_BAR
  785. : CExtNCSB_ScrollContainer::__EM_VERTICAL_SCROLL_BAR
  786. );
  787. if( pWnd == NULL )
  788. return;
  789. ASSERT( pWnd->GetSafeHwnd() != NULL );
  790. CExtScrollBar * pScrollBar = pWnd->GetScrollBarInContainer();
  791. if( pScrollBar == NULL )
  792. return;
  793. ASSERT( pScrollBar->GetSafeHwnd() != NULL );
  794. BOOL bWindowEnabled = IsWindowEnabled();
  795. pWnd->EnableWindow( bWindowEnabled );
  796. SCROLLINFO _scroll_info_window, _scroll_info_bar;
  797. ::memset( &_scroll_info_window, 0, sizeof(SCROLLINFO) );
  798. ::memset( &_scroll_info_bar, 0, sizeof(SCROLLINFO) );
  799. _scroll_info_window.cbSize = sizeof(SCROLLINFO);
  800. _scroll_info_bar.cbSize = sizeof(SCROLLINFO);
  801. if( bWindowEnabled )
  802. {
  803. NCSB_GetScrollInfoWindow( bHorizontal, _scroll_info_window );
  804. NCSB_GetScrollInfoBar( pScrollBar, _scroll_info_bar );
  805. }
  806. if( ::memcmp( &_scroll_info_window, &_scroll_info_bar, sizeof(SCROLLINFO) ) != 0 )
  807. {
  808. if( m_bNcsbUse32BitScrollInfo )
  809. pScrollBar->SetScrollInfo( &_scroll_info_window, FALSE );
  810. else
  811. {
  812. pScrollBar->SetScrollRange( _scroll_info_window.nMin, _scroll_info_window.nMax, FALSE );
  813. pScrollBar->SetScrollPos( _scroll_info_window.nPos, FALSE );
  814. }
  815. }
  816. BOOL bEnable =
  817. ( bWindowEnabled
  818. && ( _scroll_info_window.nMin < _scroll_info_window.nMax )
  819. && ( _scroll_info_window.nPage == 0
  820. || INT( _scroll_info_window.nMax - _scroll_info_window.nMin + 1 ) > INT(_scroll_info_window.nPage)
  821. )
  822. ) ? TRUE : FALSE;
  823. pScrollBar->EnableWindow( bEnable );
  824. pScrollBar->Invalidate();
  825. pScrollBar->UpdateWindow();
  826. }
  827. virtual void NCSB_RescanContainers()
  828. {
  829. ASSERT_VALID( this );
  830. if( NCSB_IsDestructionMode() || GetSafeHwnd() == NULL )
  831. return;
  832. NCSB_RescanChannel( true );
  833. NCSB_RescanChannel( false );
  834. CExtNCSB_ScrollContainer * pWndC = NCSB_GetContainer( CExtNCSB_ScrollContainer::__EM_CORNER_AREA );
  835. if( pWndC != NULL )
  836. {
  837. ASSERT( pWndC->GetSafeHwnd() != NULL );
  838. pWndC->Invalidate();
  839. pWndC->UpdateWindow();
  840. }
  841. }
  842. virtual bool NCSB_RepositionContainers( bool bRescanScrollPositions = true )
  843. {
  844. ASSERT_VALID( this );
  845. if( NCSB_IsDestructionMode() || GetSafeHwnd() == NULL )
  846. return false;
  847. CWnd * pWndParent = NCSB_GetParentWindow();
  848. if( pWndParent == NULL )
  849. {
  850. NCSB_EnsureContainersDestroyed();
  851. m_pNcsbContainerHorizontal = m_pNcsbContainerVertical = m_pNcsbContainerCorner =  m_pNcsbContainerMiddle = NULL;
  852. m_hWndNcsbContainerHorizontal = m_hWndNcsbContainerVertical = m_hWndNcsbContainerCorner = m_hWndNcsbContainerMiddle = NULL;
  853. return false;
  854. }
  855. ASSERT( pWndParent->GetSafeHwnd() != NULL );
  856. if( ! NCSB_EnsureContainersCreated() )
  857. return false;
  858. CExtNCSB_ScrollContainer * pWndH = NCSB_GetContainer( CExtNCSB_ScrollContainer::__EM_HORIZONTAL_SCROLL_BAR );
  859. CExtNCSB_ScrollContainer * pWndV = NCSB_GetContainer( CExtNCSB_ScrollContainer::__EM_VERTICAL_SCROLL_BAR );
  860. CExtNCSB_ScrollContainer * pWndC = NCSB_GetContainer( CExtNCSB_ScrollContainer::__EM_CORNER_AREA );
  861. CRect rcClient, rcLarger;
  862. GetClientRect( &rcClient );
  863. rcLarger = rcClient;
  864. bool bShowH = false, bShowV = false;
  865. DWORD dwStyle = GetStyle();
  866. bool bLeftScrollBarMode = NSCB_IsLeftScrollBarMode();
  867. if( (dwStyle&WS_HSCROLL) != 0 )
  868. {
  869. if( (dwStyle&WS_VISIBLE) != 0 )
  870. bShowH = true;
  871. rcLarger.bottom += NCSB_GetScrollBarExtent( true );
  872. }
  873. if( (dwStyle&WS_VSCROLL) != 0 )
  874. {
  875. if( (dwStyle&WS_VISIBLE) != 0 )
  876. bShowV = true;
  877. if( bLeftScrollBarMode )
  878. rcLarger.left -= NCSB_GetScrollBarExtent( false );
  879. else
  880. rcLarger.right += NCSB_GetScrollBarExtent( false );
  881. }
  882. const CWnd * pWndInsertAfter = &CWnd::wndTop;
  883. bool bChildMode = ( (dwStyle&WS_CHILD) != 0 ) ? true : false;
  884. if( bChildMode && ::GetParent(m_hWnd) == ::GetDesktopWindow() )
  885. bChildMode = false;
  886. UINT nBasecSetWindowPosFlags = SWP_NOCOPYBITS|SWP_NOOWNERZORDER;
  887. if( ! bChildMode )
  888. {
  889. pWndInsertAfter = &wndTopMost; // pWndParent;
  890. nBasecSetWindowPosFlags |= SWP_NOACTIVATE;
  891. }
  892. bool bShowC = ( bShowH && bShowV ) ? true : false;
  893. bool bVisibleH = false, bVisibleV = false, bVisibleC = false;
  894. if( pWndH != NULL )
  895. {
  896. ASSERT( pWndH->GetSafeHwnd() != NULL );
  897. if( (pWndH->GetStyle()&WS_VISIBLE) != 0 )
  898. bVisibleH = true;
  899. }
  900. if( pWndV != NULL )
  901. {
  902. ASSERT( pWndV->GetSafeHwnd() != NULL );
  903. if( (pWndV->GetStyle()&WS_VISIBLE) != 0 )
  904. bVisibleV = true;
  905. }
  906. if( pWndC != NULL )
  907. {
  908. ASSERT( pWndC->GetSafeHwnd() != NULL );
  909. if( (pWndC->GetStyle()&WS_VISIBLE) != 0 )
  910. bVisibleC = true;
  911. }
  912. bool bAnyMoved = false;
  913. if( pWndH != NULL )
  914. {
  915. ASSERT( pWndH->GetSafeHwnd() != NULL );
  916. CRect rcReal, rc(
  917. rcClient.left,
  918. rcClient.bottom,
  919. rcClient.right,
  920. rcLarger.bottom
  921. );
  922. ClientToScreen( &rc );
  923. pWndH->GetWindowRect( &rcReal );
  924. if( bVisibleH != bShowH || rcReal != rc )
  925. {
  926. bAnyMoved = true;
  927. if( bChildMode )
  928. pWndParent->ScreenToClient( &rc );
  929. pWndH->SetWindowPos(
  930. pWndInsertAfter, rc.left, rc.top, rc.Width(), rc.Height(),
  931. nBasecSetWindowPosFlags | ( bShowH ? SWP_SHOWWINDOW : SWP_HIDEWINDOW )
  932. );
  933. } // if( rcReal != rc )
  934. }
  935. if( pWndV != NULL )
  936. {
  937. ASSERT( pWndV->GetSafeHwnd() != NULL );
  938. CRect rcReal, rc(
  939. bLeftScrollBarMode ? rcLarger.left : rcClient.right,
  940. rcClient.top,
  941. bLeftScrollBarMode ? rcClient.left : rcLarger.right,
  942. rcClient.bottom
  943. );
  944. ClientToScreen( &rc );
  945. pWndV->GetWindowRect( &rcReal );
  946. if( bVisibleV != bShowV || rcReal != rc )
  947. {
  948. bAnyMoved = true;
  949. if( bChildMode )
  950. pWndParent->ScreenToClient( &rc );
  951. pWndV->SetWindowPos(
  952. pWndInsertAfter, rc.left, rc.top, rc.Width(), rc.Height(),
  953. nBasecSetWindowPosFlags | ( bShowV ? SWP_SHOWWINDOW : SWP_HIDEWINDOW )
  954. );
  955. } // if( rcReal != rc )
  956. }
  957. if( pWndC != NULL )
  958. {
  959. ASSERT( pWndC->GetSafeHwnd() != NULL );
  960. CRect rcReal, rc(
  961. bLeftScrollBarMode ? rcLarger.left : rcClient.right,
  962. rcClient.bottom,
  963. bLeftScrollBarMode ? rcClient.left : rcLarger.right,
  964. rcLarger.bottom
  965. );
  966. ClientToScreen( &rc );
  967. pWndC->GetWindowRect( &rcReal );
  968. if( bVisibleC != bShowC || rcReal != rc )
  969. {
  970. bAnyMoved = true;
  971. if( bChildMode )
  972. pWndParent->ScreenToClient( &rc );
  973. pWndC->SetWindowPos(
  974. pWndInsertAfter, rc.left, rc.top, rc.Width(), rc.Height(),
  975. nBasecSetWindowPosFlags | ( bShowC ? SWP_SHOWWINDOW : SWP_HIDEWINDOW )
  976. );
  977. } // if( rcReal != rc )
  978. }
  979. if( bRescanScrollPositions )
  980. NCSB_RescanContainers();
  981. return bAnyMoved;
  982. }
  983. virtual bool NSCB_MessageCanAffectScrollBars( UINT message ) const
  984. {
  985. ASSERT_VALID( this );
  986. if( ( __EXT_MFC_WM_MOUSEFIRST <= message && message <= __EXT_MFC_WM_MOUSELAST )
  987. || ( WM_KEYFIRST <= message && message <= WM_KEYLAST )
  988. )
  989. return true;
  990. return false;
  991. }
  992. protected:
  993. virtual void PreSubclassWindow()
  994. {
  995. m_bNcsbHelperDestructionMode = false;
  996. _BTNCSBimpl::PreSubclassWindow();
  997. TCHAR szCompare[512] = _T("");
  998. ::GetClassName(
  999. m_hWnd,
  1000. szCompare,
  1001. sizeof( szCompare )/sizeof( szCompare[0] )
  1002. );
  1003. if( ! m_bNcsbForceRedrawOnMouseWheel )
  1004. {
  1005. if( _tcsicmp( szCompare, _T("LISTBOX") ) == 0
  1006. || _tcsicmp( szCompare, _T("COMBOLBOX") ) == 0
  1007. )
  1008. m_bNcsbForceRedrawOnMouseWheel = true;
  1009. }
  1010. if( g_PaintManager.m_bIsWinVistaOrLater
  1011. && _tcsicmp( szCompare, _T("SysTreeView32") ) == 0
  1012. )
  1013. m_bNcsbUpdateTargetWindowScrollPosH = m_bNcsbUpdateTargetWindowScrollPosV = true;
  1014. if( ( GetStyle() & (WS_CLIPCHILDREN|WS_CLIPSIBLINGS) ) != (WS_CLIPCHILDREN|WS_CLIPSIBLINGS) )
  1015. ModifyStyle( 0, WS_CLIPCHILDREN|WS_CLIPSIBLINGS );
  1016. if( ! m_bNcsbDelayedInitialization )
  1017. NCSB_RepositionContainers();
  1018. }
  1019. virtual void PostNcDestroy()
  1020. {
  1021. m_bNcsbHelperDestructionMode = true;
  1022. m_bNcsbFirstPaintMessagePassed = true;
  1023. //NCSB_EnsureContainersDestroyed();
  1024. m_pNcsbContainerHorizontal = m_pNcsbContainerVertical = m_pNcsbContainerCorner = m_pNcsbContainerMiddle = NULL;
  1025. m_hWndNcsbContainerHorizontal = m_hWndNcsbContainerVertical = m_hWndNcsbContainerCorner = m_hWndNcsbContainerMiddle = NULL;
  1026. m_ptNcsbProtectMouseMoveLast.x = m_ptNcsbProtectMouseMoveLast.y = -32767;
  1027. _BTNCSBimpl::PostNcDestroy();
  1028. }
  1029. virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
  1030. {
  1031. if( ( ! g_PaintManager.m_bAutoSkinScrollBars )
  1032. || ( (! m_bNcsbFirstPaintMessagePassed)
  1033. && message != WM_ERASEBKGND
  1034. && message != WM_PAINT
  1035. && message != WM_NCPAINT
  1036. )
  1037. )
  1038. return _BTNCSBimpl::WindowProc( message, wParam, lParam );;
  1039. switch( message )
  1040. {
  1041. case WM_NCCALCSIZE:
  1042. if( m_rcNcsbCustomNcAreaSizes.left >= 0
  1043. && m_rcNcsbCustomNcAreaSizes.top >= 0
  1044. && m_rcNcsbCustomNcAreaSizes.right >= 0
  1045. && m_rcNcsbCustomNcAreaSizes.bottom >= 0
  1046. )
  1047. {
  1048. NCCALCSIZE_PARAMS * pNCCSP =
  1049. reinterpret_cast < NCCALCSIZE_PARAMS * > ( lParam );
  1050. ASSERT( pNCCSP != NULL );
  1051. CRect rcCalcClient( pNCCSP->rgrc[0] );
  1052. rcCalcClient.DeflateRect( &m_rcNcsbCustomNcAreaSizes );
  1053. DWORD dwStyle = GetStyle();
  1054. bool bLeftScrollBarMode = NSCB_IsLeftScrollBarMode();
  1055. if( (dwStyle&WS_HSCROLL) != 0 )
  1056. rcCalcClient.bottom -= NCSB_GetScrollBarExtent( true );
  1057. if( (dwStyle&WS_VSCROLL) != 0 )
  1058. {
  1059. if( bLeftScrollBarMode )
  1060. rcCalcClient.left += NCSB_GetScrollBarExtent( false );
  1061. else
  1062. rcCalcClient.right -= NCSB_GetScrollBarExtent( false );
  1063. }
  1064. ::CopyRect( &(pNCCSP->rgrc[0]), rcCalcClient );
  1065. return 0L;
  1066. }
  1067. break;
  1068. case WM_NCPAINT:
  1069. m_bNcsbFirstPaintMessagePassed = true;
  1070. if( m_rcNcsbCustomNcAreaSizes.left >= 0
  1071. && m_rcNcsbCustomNcAreaSizes.top >= 0
  1072. && m_rcNcsbCustomNcAreaSizes.right >= 0
  1073. && m_rcNcsbCustomNcAreaSizes.bottom >= 0
  1074. )
  1075. {
  1076. CRect rcInBarWnd, rcInBarClient;
  1077. GetWindowRect( &rcInBarWnd );
  1078. GetClientRect( &rcInBarClient );
  1079. ClientToScreen( &rcInBarClient );
  1080. if( rcInBarWnd == rcInBarClient )
  1081. return 0;
  1082. CPoint ptDevOffset = -rcInBarWnd.TopLeft();
  1083. rcInBarWnd.OffsetRect( ptDevOffset );
  1084. rcInBarClient.OffsetRect( ptDevOffset );
  1085. CWindowDC dcWindow( this );
  1086. dcWindow.ExcludeClipRect( &rcInBarClient );
  1087. CExtMemoryDC dc( &dcWindow );
  1088. if( m_clrNcsbCustomNcAreaFill != COLORREF(-1L) )
  1089. dc.FillSolidRect( &rcInBarWnd, m_clrNcsbCustomNcAreaFill );
  1090. else if( ! g_PaintManager->PaintDockerBkgnd( true, dc, this ) )
  1091. dc.FillSolidRect( &rcInBarWnd, g_PaintManager->GetColor( COLOR_3DDKSHADOW ) );
  1092. dc.__Flush();
  1093. NCSB_RepositionContainers();
  1094. return 0;
  1095. }
  1096. NCSB_RepositionContainers();
  1097. break;
  1098. case WM_MOUSEMOVE:
  1099. if( m_bNcsbProtectMessageLoopFromMfcToolHitTesting )
  1100. {
  1101. CPoint point( short(LOWORD(DWORD(lParam))), short(HIWORD(DWORD(lParam))) );
  1102. if( m_ptNcsbProtectMouseMoveLast == point )
  1103. return 0;
  1104. m_ptNcsbProtectMouseMoveLast = point;
  1105. }
  1106. break;
  1107. case WM_WINDOWPOSCHANGED:
  1108. case WM_SHOWWINDOW:
  1109. case WM_SIZE:
  1110. case WM_ENABLE:
  1111. NCSB_RepositionContainers();
  1112. break;
  1113. case WM_DESTROY:
  1114. m_bNcsbHelperDestructionMode = true;
  1115. NCSB_EnsureContainersDestroyed();
  1116. m_pNcsbContainerHorizontal = m_pNcsbContainerVertical = m_pNcsbContainerCorner = m_pNcsbContainerMiddle = NULL;
  1117. m_hWndNcsbContainerHorizontal = m_hWndNcsbContainerVertical = m_hWndNcsbContainerCorner = m_hWndNcsbContainerMiddle = NULL;
  1118. break;
  1119. default:
  1120. if( NSCB_MessageCanAffectScrollBars( message ) )
  1121. {
  1122. if( NCSB_RepositionContainers() )
  1123. Invalidate();
  1124. }
  1125. break;
  1126. case WM_PAINT:
  1127. case WM_ERASEBKGND:
  1128. m_bNcsbFirstPaintMessagePassed = true;
  1129. break;
  1130. } // switch( message )
  1131. LRESULT lResult = _BTNCSBimpl::WindowProc( message, wParam, lParam );
  1132. switch( message )
  1133. {
  1134. case WM_HSCROLL:
  1135. NCSB_RescanContainers();
  1136. if( m_bNcsbUpdateTargetWindowScrollInfoH )
  1137. NCSB_UpdateChannel( true );
  1138. else if( m_bNcsbUpdateTargetWindowScrollPosH )
  1139. NCSB_UpdateChannelPos( true, true );
  1140. break;
  1141. case WM_VSCROLL:
  1142. NCSB_RescanContainers();
  1143. if( m_bNcsbUpdateTargetWindowScrollInfoV )
  1144. NCSB_UpdateChannel( false );
  1145. else if( m_bNcsbUpdateTargetWindowScrollPosV )
  1146. NCSB_UpdateChannelPos( false, true );
  1147. break;
  1148. case WM_PAINT:
  1149. NCSB_RescanContainers();
  1150. break;
  1151. case WM_MOUSEWHEEL:
  1152. if( m_bNcsbForceRedrawOnMouseWheel )
  1153. {
  1154. Invalidate();
  1155. UpdateWindow();
  1156. }
  1157. break;
  1158. } // switch( message )
  1159. return lResult;
  1160. }
  1161. }; /// template class CExtNCSB_Impl
  1162. template < class _BTNCSB >
  1163. class CExtNCSB : public CExtNCSB_Impl < _BTNCSB >
  1164. {
  1165. public:
  1166. CExtNCSB(
  1167. bool bNcsbDelayedInitialization = false,
  1168. bool bNcsbForceMiddleContainerMode = false
  1169. )
  1170. : CExtNCSB_Impl < _BTNCSB > (
  1171. bNcsbDelayedInitialization,
  1172. bNcsbForceMiddleContainerMode
  1173. )
  1174. {
  1175. }
  1176. CExtNCSB(
  1177. UINT nIDTemplate,
  1178. CWnd * pParentWnd,
  1179. bool bNcsbDelayedInitialization = false,
  1180. bool bNcsbForceMiddleContainerMode = false
  1181. )
  1182. : CExtNCSB_Impl < _BTNCSB > ( nIDTemplate, pParentWnd, bNcsbDelayedInitialization, bNcsbForceMiddleContainerMode )
  1183. {
  1184. }
  1185. CExtNCSB(
  1186. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  1187. CWnd * pParentWnd,
  1188. bool bNcsbDelayedInitialization = false,
  1189. bool bNcsbForceMiddleContainerMode = false
  1190. )
  1191. : CExtNCSB_Impl < _BTNCSB > ( lpszTemplateName, pParentWnd, bNcsbDelayedInitialization, bNcsbForceMiddleContainerMode )
  1192. {
  1193. }
  1194. virtual ~CExtNCSB()
  1195. {
  1196. }
  1197. }; /// template class CExtNCSB
  1198. template < class _BA > class CExtANCSB : public _BA
  1199. {
  1200. public:
  1201. CExtANCSB(
  1202. bool bNcsbDelayedInitialization = false,
  1203. bool bNcsbForceMiddleContainerMode = false
  1204. )
  1205. {
  1206. bNcsbDelayedInitialization;
  1207. bNcsbForceMiddleContainerMode;
  1208. }
  1209. CExtANCSB(
  1210. UINT nIDTemplate,
  1211. CWnd * pParentWnd,
  1212. bool bNcsbDelayedInitialization = false,
  1213. bool bNcsbForceMiddleContainerMode = false
  1214. )
  1215. {
  1216. nIDTemplate;
  1217. pParentWnd;
  1218. bNcsbDelayedInitialization;
  1219. bNcsbForceMiddleContainerMode;
  1220. }
  1221. CExtANCSB(
  1222. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  1223. CWnd * pParentWnd,
  1224. bool bNcsbDelayedInitialization = false,
  1225. bool bNcsbForceMiddleContainerMode = false
  1226. )
  1227. {
  1228. lpszTemplateName;
  1229. pParentWnd;
  1230. bNcsbDelayedInitialization;
  1231. bNcsbForceMiddleContainerMode;
  1232. }
  1233. virtual ~CExtANCSB()
  1234. {
  1235. }
  1236. }; // template < class _BA > class CExtANCSB
  1237. #if _MFC_VER >= 0x700
  1238. #ifndef __EXT_PROFUIS_STATIC_LINK
  1239. template class __PROF_UIS_API CExtNCSB_Impl < CExtANCSB < CScrollView > >;
  1240. #endif  // #ifndef __EXT_PROFUIS_STATIC_LINK
  1241. #endif // _MFC_VER >= 0x700
  1242. template < > class __PROF_UIS_API CExtNCSB < CScrollView > : public CExtNCSB_Impl < CExtANCSB < CScrollView > >
  1243. {
  1244. public:
  1245. CExtNCSB(
  1246. bool bNcsbDelayedInitialization = false,
  1247. bool bNcsbForceMiddleContainerMode = false
  1248. )
  1249. {
  1250. m_bNcsbDelayedInitialization = bNcsbDelayedInitialization;
  1251. m_bNcsbForceMiddleContainerMode = bNcsbForceMiddleContainerMode;
  1252. }
  1253. virtual ~CExtNCSB()
  1254. {
  1255. }
  1256. }; // template < > class CExtNCSB < CScrollView >
  1257. #if _MFC_VER >= 0x700
  1258. #ifndef __EXT_PROFUIS_STATIC_LINK
  1259. template class __PROF_UIS_API CExtNCSB_Impl < CExtANCSB < CListCtrl > >;
  1260. #endif  // #ifndef __EXT_PROFUIS_STATIC_LINK
  1261. #endif // _MFC_VER >= 0x700
  1262. template < > class __PROF_UIS_API CExtNCSB < CListCtrl > : public CExtNCSB_Impl < CExtANCSB < CListCtrl > >
  1263. {
  1264. public:
  1265. CExtNCSB(
  1266. bool bNcsbDelayedInitialization = false,
  1267. bool bNcsbForceMiddleContainerMode = false
  1268. );
  1269. virtual ~CExtNCSB();
  1270. virtual void AdjustScrollMetrics();
  1271. protected:
  1272. virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam );
  1273. }; // template < > class CExtNCSB < CListCtrl >
  1274. #if (!defined __EXT_MFC_NO_SCROLLWND)
  1275. /////////////////////////////////////////////////////////////////////////////
  1276. // CExtScrollWnd window
  1277. // based on MFC source code in viewscrl.cpp
  1278. class __PROF_UIS_API CExtScrollWnd
  1279. : public CWnd
  1280. , public CExtMouseCaptureSink
  1281. , public CExtPmBridge
  1282. {
  1283. public:
  1284. class __PROF_UIS_API CRectWH : public CRect
  1285. {
  1286. public:
  1287. CRectWH( LONG x, LONG y, LONG w, LONG h )
  1288. : CRect( x, y, ( x + w ), ( y + h ) )
  1289. {
  1290. }
  1291. };
  1292. DECLARE_DYNCREATE( CExtScrollWnd );
  1293. DECLARE_CExtPmBridge_MEMBERS( CExtScrollWnd );
  1294. CExtScrollWnd();
  1295. virtual ~CExtScrollWnd();
  1296. public:
  1297. bool m_bScrollPhysical:1, m_bEatErasing:1,
  1298. m_bClientCB:1, m_bBufferedPainting:1,
  1299. m_bScrollInvalidate:1, m_bScrollErase:1,
  1300. m_bScrollUpdateWindow:1, m_bRedrawUpdateWindow:1,
  1301. m_bRedrawInvalidate:1, m_bRedrawErase:1,
  1302. m_bUse32BitScrollInfo:1;
  1303. protected:
  1304. HFONT m_hFont;
  1305. int m_nUpdateScrollBars;
  1306. public:
  1307. //{{AFX_VIRTUAL(CExtScrollWnd)
  1308. public:
  1309. virtual BOOL PreTranslateMessage(MSG* pMsg);
  1310. protected:
  1311. virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
  1312. //}}AFX_VIRTUAL
  1313. public:
  1314. virtual void PmBridge_OnPaintManagerChanged(
  1315. CExtPaintManager * pGlobalPM
  1316. );
  1317. virtual CSize OnSwGetTotalSize() const;
  1318. virtual CSize OnSwGetPageSize( int nDirection ) const;
  1319. virtual CSize OnSwGetLineSize( int nDirection ) const;
  1320. virtual CRect OnSwRecalcLayout(
  1321. bool bDoLayout,
  1322. LPCRECT pRectClientSrc = NULL
  1323. );
  1324. virtual CRect OnSwGetClientRect() const;
  1325. virtual bool OnSwCanAutoHideScrollBar( bool bHorz ) const;
  1326. virtual bool OnSwHasScrollBar( bool bHorz ) const;
  1327. virtual void OnSwEnableScrollBarCtrl( int nBar, bool bEnable );
  1328. virtual bool OnSwScrollInfoAdjust(
  1329. int nBar,
  1330. SCROLLINFO & si,
  1331. bool bRedraw = true
  1332. );
  1333. virtual void OnSwSetScrollRange(
  1334. int nBar,
  1335. LONG nMinPos,
  1336. LONG nMaxPos,
  1337. bool bRedraw = true
  1338. );
  1339. virtual bool OnSwQueryThumbTrackEnabled( bool bHorz ) const;
  1340. virtual LONG ScrollLimit32Get( int nBar ) const;
  1341. virtual void ScrollInfo32Get(
  1342. int nBar,
  1343. LONG * p_nMinPos,
  1344. LONG * p_nMaxPos,
  1345. LONG * p_nPageSize,
  1346. LONG * p_nCurrPos,
  1347. LONG * p_nTrackPos
  1348. ) const;
  1349. virtual LONG ScrollPos32Get(
  1350. int nBar,
  1351. bool bTrackPos = false
  1352. ) const;
  1353. virtual void ScrollPos32Set(
  1354. int nBar,
  1355. LONG nPos,
  1356. bool bRedraw = true
  1357. );
  1358. virtual CPoint OnSwGetScrollPos() const;
  1359. virtual CPoint OnSwGetScrollPaintPos() const;
  1360. virtual void OnSwSetScrollPos( POINT pt );
  1361. virtual void OnSwGetScrollBarState(
  1362. CSize sizeClient,
  1363. CSize & sizeNeedSB,
  1364. CSize & sizeRange,
  1365. CPoint & ptMove,
  1366. bool bInsideClient
  1367. ) const;
  1368. virtual CSize OnSwGetScrollBarSizes() const;
  1369. virtual bool OnSwCalcClientSizes(
  1370. CSize & size,
  1371. CSize & sizeSb
  1372. );
  1373. virtual UINT OnSwCalcMouseScrollLines(
  1374. UINT fFlags,
  1375. short zDelta,
  1376. CPoint point
  1377. );
  1378. virtual bool OnSwDoMouseWheel(
  1379. UINT fFlags,
  1380. short zDelta,
  1381. CPoint point
  1382. );
  1383. virtual bool OnSwDoScroll(
  1384. UINT nScrollCode,
  1385. UINT nPos,
  1386. bool bDoScroll = true
  1387. );
  1388. virtual bool OnSwDoScrollBy(
  1389. CSize sizeScroll,
  1390. bool bDoScroll = true
  1391. );
  1392. virtual void OnSwUpdateScrollBars();
  1393. virtual void OnSwDoScrollWindow(
  1394. int xAmount,
  1395. int yAmount,
  1396. LPCRECT lpRect = NULL,
  1397. LPCRECT lpClipRect = NULL
  1398. );
  1399. virtual void OnSwEnsurePointAvail( CPoint point );
  1400. virtual void OnSwInvalidate( bool bErase );
  1401. virtual void OnSwUpdateWindow();
  1402. virtual void OnSwDoRedraw();
  1403. virtual void OnSwPaint( CDC & dc );
  1404. virtual void OnSwPaintAreaBetweenScrollBarWindows(
  1405. CDC & dc,
  1406. const RECT & rcAreaBetweenScrollBarWindows
  1407. );
  1408. // Generated message map functions
  1409. protected:
  1410. //{{AFX_MSG(CExtScrollWnd)
  1411. afx_msg void OnSize(UINT nType, int cx, int cy);
  1412. afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
  1413. afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
  1414. afx_msg BOOL OnMouseWheel(UINT fFlags, short zDelta, CPoint point);
  1415. afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  1416. afx_msg void OnPaint();
  1417. afx_msg void OnEnable( BOOL bEnable );
  1418. afx_msg LRESULT OnSetFont( WPARAM wParam, LPARAM lParam );
  1419. afx_msg LRESULT OnGetFont( WPARAM, LPARAM );
  1420. //}}AFX_MSG
  1421. afx_msg void OnSysColorChange();
  1422. afx_msg void OnSettingChange(UINT uFlags, __EXT_MFC_SAFE_LPCTSTR lpszSection);
  1423. afx_msg LRESULT OnDisplayChange( WPARAM wParam, LPARAM lParam );
  1424. afx_msg LRESULT OnThemeChanged( WPARAM wParam, LPARAM lParam );
  1425. DECLARE_MESSAGE_MAP()
  1426. }; // class CExtScrollWnd
  1427. #if (!defined __EXT_MFC_NO_SCROLLITEMWND)
  1428. /////////////////////////////////////////////////////////////////////////////
  1429. // CExtScrollItemWnd window & CExtScrollItemCacheInfo helper
  1430. // item scrolling type
  1431. #define __ESIW_ST_NONE 0x00000000L
  1432. #define __ESIW_ST_PIXEL 0x00000001L
  1433. #define __ESIW_ST_ITEM 0x00000002L
  1434. #define __ESIW_ST_VIRTUAL 0x00000003L
  1435. #define __ESIW_ST_MASK 0x00000003L
  1436. #define __ESIW_ST_BIT_COUNT 2L
  1437. // item scroll window styles
  1438. #define __ESIS_STH_NONE __ESIW_ST_NONE
  1439. #define __ESIS_STH_PIXEL __ESIW_ST_PIXEL
  1440. #define __ESIS_STH_ITEM __ESIW_ST_ITEM
  1441. #define __ESIS_STH_VIRTUAL __ESIW_ST_VIRTUAL
  1442. #define __ESIS_STV_NONE (__ESIW_ST_NONE << __ESIW_ST_BIT_COUNT)
  1443. #define __ESIS_STV_PIXEL (__ESIW_ST_PIXEL << __ESIW_ST_BIT_COUNT)
  1444. #define __ESIS_STV_ITEM (__ESIW_ST_ITEM << __ESIW_ST_BIT_COUNT)
  1445. #define __ESIS_STV_VIRTUAL (__ESIW_ST_VIRTUAL << __ESIW_ST_BIT_COUNT)
  1446. #define __ESIS_STH_MASK __ESIW_ST_MASK
  1447. #define __ESIS_STV_MASK (__ESIW_ST_MASK << __ESIW_ST_BIT_COUNT)
  1448. #define __ESIS_ST_MASK (__ESIS_STH_MASK|__ESIS_STV_MASK)
  1449. #define __ESIS_DISABLE_THUMBTRACK_H 0x00000010L
  1450. #define __ESIS_DISABLE_THUMBTRACK_V 0x00000020L
  1451. #define __ESIS_DISABLE_THUMBTRACK (__ESIS_DISABLE_THUMBTRACK_H|__ESIS_DISABLE_THUMBTRACK_V)
  1452. #define __ESIS_DISABLE_AUTOHIDE_SB_H 0x00000040L
  1453. #define __ESIS_DISABLE_AUTOHIDE_SB_V 0x00000080L
  1454. #define __ESIS_DISABLE_AUTOHIDE_SB (__ESIS_DISABLE_AUTOHIDE_SB_H|__ESIS_DISABLE_AUTOHIDE_SB_V)
  1455. #define __ESIS_PREFER_HORZ_WALK 0x00000100L
  1456. #if (!defined __EXT_MFC_NO_GRIDBASEWND)
  1457. // helper flags to optimize event processing when
  1458. // all rows/columns have equal sizes
  1459. #define __EGBS_FIXED_SIZE_COLUMNS 0x00000200L
  1460. #define __EGBS_FIXED_SIZE_ROWS 0x00000400L
  1461. // basic selection/focus type
  1462. #define __EGBS_SFB_NONE 0x00000000L
  1463. #define __EGBS_SFB_CELLS 0x00001000L
  1464. #define __EGBS_SFB_FULL_ROWS 0x00002000L
  1465. #define __EGBS_SFB_FULL_COLUMNS 0x00003000L
  1466. #define __EGBS_SFB_MASK 0x00003000L
  1467. // allow multiple row/column/cell selection
  1468. #define __EGBS_SFM_ROWS 0x00000800L
  1469. #define __EGBS_SFM_COLUMNS 0x00008000L
  1470. #define __EGBS_SFM_MASK (__EGBS_SFM_ROWS|__EGBS_SFM_COLUMNS)
  1471. // enabled multiple selection types
  1472. #define __EGBS_SFM_CELLS_H (__EGBS_SFB_CELLS|__EGBS_SFM_COLUMNS)
  1473. #define __EGBS_SFM_CELLS_V (__EGBS_SFB_CELLS|__EGBS_SFM_ROWS)
  1474. #define __EGBS_SFM_CELLS_HV (__EGBS_SFB_CELLS|__EGBS_SFM_COLUMNS|__EGBS_SFM_ROWS)
  1475. #define __EGBS_SFM_FULL_ROWS (__EGBS_SFB_FULL_ROWS|__EGBS_SFM_ROWS)
  1476. #define __EGBS_SFM_FULL_COLUMNS (__EGBS_SFB_FULL_COLUMNS|__EGBS_SFM_COLUMNS)
  1477. // any selection mask
  1478. #define __EGBS_SF_MASK (__EGBS_SFB_MASK|__EGBS_SFM_MASK)
  1479. // allow selection via outer row/column clicks
  1480. #define __EGBS_SF_SELECT_OUTER_ROWS 0x00010000L
  1481. #define __EGBS_SF_SELECT_OUTER_COLUMNS 0x00020000L
  1482. #define __EGBS_SF_SELECT_OUTER (__EGBS_SF_SELECT_OUTER_COLUMNS|__EGBS_SF_SELECT_OUTER_ROWS)
  1483. // enable row/column resizing
  1484. #define __EGBS_RESIZING_CELLS_OUTER_H 0x00040000L
  1485. #define __EGBS_RESIZING_CELLS_OUTER_V 0x00100000L
  1486. #define __EGBS_RESIZING_CELLS_OUTER (__EGBS_RESIZING_CELLS_OUTER_H|__EGBS_RESIZING_CELLS_OUTER_V)
  1487. #define __EGBS_RESIZING_CELLS_INNER_H 0x00200000L
  1488. #define __EGBS_RESIZING_CELLS_INNER_V 0x00400000L
  1489. #define __EGBS_RESIZING_CELLS_INNER (__EGBS_RESIZING_CELLS_INNER_H|__EGBS_RESIZING_CELLS_INNER_V)
  1490. #define __EGBS_RESIZING_CELLS_MASK (__EGBS_RESIZING_CELLS_OUTER|__EGBS_RESIZING_CELLS_INNER)
  1491. // auto move focused cell to bottom/right corner of selection
  1492. #define __EGBS_AUTO_FOCUS_BOTTOM_RIGHT 0x00800000L
  1493. // allow multiple cell ranges to be selected at a time
  1494. #define __EGBS_MULTI_AREA_SELECTION 0x01000000L
  1495. // no hide selection when not focused
  1496. #define __EGBS_NO_HIDE_SELECTION 0x02000000L
  1497. // draw grid lines
  1498. #define __EGBS_GRIDLINES_H 0x04000000L
  1499. #define __EGBS_GRIDLINES_V 0x08000000L
  1500. #define __EGBS_GRIDLINES (__EGBS_GRIDLINES_H|__EGBS_GRIDLINES_V)
  1501. // mouse click + move selects cell range
  1502. #define __EGBS_LBEXT_SELECTION 0x10000000L
  1503. // subtract overlapped cell ranges in selection areas
  1504. #define __EGBS_SUBTRACT_SEL_AREAS 0x20000000L
  1505. // resize rows/columns on-the-fly (no half-tone tracker lines)
  1506. #define __EGBS_DYNAMIC_RESIZING_H 0x40000000L
  1507. #define __EGBS_DYNAMIC_RESIZING_V 0x80000000L
  1508. #define __EGBS_DYNAMIC_RESIZING (__EGBS_DYNAMIC_RESIZING_H|__EGBS_DYNAMIC_RESIZING_V)
  1509. #endif // (!defined __EXT_MFC_NO_GRIDBASEWND)
  1510. // extended/behavior styles provided with
  1511. // CExtScrollItemWnd::SiwGetStyleEx()
  1512. // ( these styles are not intersected with
  1513. //   CExtScrollItemWnd::SiwGetStyle() style values )
  1514. #if (!defined __EGWS_EX_PM_COLORS)
  1515. #define __EGWS_EX_PM_COLORS 0x80000000L
  1516. #endif
  1517. class __PROF_UIS_API CExtScrollItemCacheInfo
  1518. {
  1519. public:
  1520. LONG m_nPosH;
  1521. LONG m_nMaxH;
  1522. LONG m_nPageSizeH;
  1523. LONG m_nPosV;
  1524. LONG m_nMaxV;
  1525. LONG m_nPageSizeV;
  1526. bool m_bBeginH:1;
  1527. bool m_bEndH:1;
  1528. bool m_bBeginV:1;
  1529. bool m_bEndV:1;
  1530. CExtScrollItemCacheInfo(
  1531. LONG nPosH = 0L,
  1532. LONG nMaxH = 0L,
  1533. LONG nPageSizeH = 0L,
  1534. LONG nPosV = 0L,
  1535. LONG nMaxV = 0L,
  1536. LONG nPageSizeV = 0L,
  1537. bool bBeginH = false,
  1538. bool bEndH = false,
  1539. bool bBeginV = false,
  1540. bool bEndV = false
  1541. );
  1542. CExtScrollItemCacheInfo(
  1543. const CExtScrollItemCacheInfo & other
  1544. );
  1545. CExtScrollItemCacheInfo & operator = (
  1546. const CExtScrollItemCacheInfo & other
  1547. );
  1548. bool operator == (
  1549. const CExtScrollItemCacheInfo & other
  1550. ) const;
  1551. bool operator != (
  1552. const CExtScrollItemCacheInfo & other
  1553. ) const;
  1554. void Empty(
  1555. bool bEmptyH = true,
  1556. bool bEmptyV = true
  1557. );
  1558. void EmptyH();
  1559. void EmptyV();
  1560. bool IsEmpty(
  1561. bool bCheckEmptyH = true,
  1562. bool bCheckEmptyV = true
  1563. ) const;
  1564. bool IsEmptyH() const;
  1565. bool IsEmptyV() const;
  1566. bool IsValid() const;
  1567. static bool IsEqual(
  1568. const CExtScrollItemCacheInfo & left,
  1569. const CExtScrollItemCacheInfo & right,
  1570. bool bComparePosH = true,
  1571. bool bComparePosV = true,
  1572. bool bCompareMaxH = true,
  1573. bool bCompareMaxV = true,
  1574. bool bComparePageSizeH = true,
  1575. bool bComparePageSizeV = true,
  1576. bool bCompareBofH = false,
  1577. bool bCompareBofV = false,
  1578. bool bCompareEofH = false,
  1579. bool bCompareEofV = false
  1580. );
  1581. bool IsEqual(
  1582. const CExtScrollItemCacheInfo & other,
  1583. bool bComparePosH = true,
  1584. bool bComparePosV = true,
  1585. bool bCompareMaxH = true,
  1586. bool bCompareMaxV = true,
  1587. bool bComparePageSizeH = true,
  1588. bool bComparePageSizeV = true,
  1589. bool bCompareBofH = false,
  1590. bool bCompareBofV = false,
  1591. bool bCompareEofH = false,
  1592. bool bCompareEofV = false
  1593. ) const;
  1594. LONG GetExtentH() const;
  1595. LONG GetExtentV() const;
  1596. LONG GetPosChangingH(
  1597. const CExtScrollItemCacheInfo & _sciOld
  1598. ) const;
  1599. LONG GetPosChangingV(
  1600. const CExtScrollItemCacheInfo & _sciOld
  1601. ) const;
  1602. LONG GetMaxChangingH(
  1603. const CExtScrollItemCacheInfo & _sciOld
  1604. ) const;
  1605. LONG GetMaxChangingV(
  1606. const CExtScrollItemCacheInfo & _sciOld
  1607. ) const;
  1608. LONG GetExtentChangingH(
  1609. const CExtScrollItemCacheInfo & _sciOld
  1610. ) const;
  1611. LONG GetExtentChangingV(
  1612. const CExtScrollItemCacheInfo & _sciOld
  1613. ) const;
  1614. LONG GetPageSizeChangingH(
  1615. const CExtScrollItemCacheInfo & _sciOld
  1616. ) const;
  1617. LONG GetPageSizeChangingV(
  1618. const CExtScrollItemCacheInfo & _sciOld
  1619. ) const;
  1620. bool IsShiftToBofH(
  1621. const CExtScrollItemCacheInfo & _sciOld
  1622. ) const;
  1623. bool IsShiftToBofV(
  1624. const CExtScrollItemCacheInfo & _sciOld
  1625. ) const;
  1626. bool IsShiftToEofH(
  1627. const CExtScrollItemCacheInfo & _sciOld
  1628. ) const;
  1629. bool IsShiftToEofV(
  1630. const CExtScrollItemCacheInfo & _sciOld
  1631. ) const;
  1632. void FlipHV();
  1633. void Assign(
  1634. const CExtScrollItemCacheInfo & other,
  1635. bool bAssignH = true,
  1636. bool bAssignV = true
  1637. );
  1638. void AssignH(
  1639. const CExtScrollItemCacheInfo & other
  1640. );
  1641. void AssignV(
  1642. const CExtScrollItemCacheInfo & other
  1643. );
  1644. }; // class CExtScrollItemCacheInfo
  1645. class __PROF_UIS_API CExtScrollItemWnd : public CExtScrollWnd
  1646. {
  1647. public:
  1648. DECLARE_DYNCREATE( CExtScrollItemWnd );
  1649. CExtScrollItemWnd();
  1650. public:
  1651. bool m_bExtractResourceStyles:1;
  1652. protected:
  1653. static bool g_bScrollItemWndClassRegistered;
  1654. bool m_bDirectCreateCall:1;
  1655. DWORD m_dwScrollItemWndStyle, m_dwScrollItemWndStyleEx;
  1656. public:
  1657. virtual DWORD SiwGetStyle() const;
  1658. virtual DWORD SiwModifyStyle(
  1659. DWORD dwStyleAdd,
  1660. DWORD dwStyleRemove = 0L,
  1661. bool bUpdateWnd = true
  1662. );
  1663. virtual DWORD SiwGetStyleEx() const;
  1664. virtual DWORD SiwModifyStyleEx(
  1665. DWORD dwStyleExAdd,
  1666. DWORD dwStyleExRemove = 0L,
  1667. bool bUpdateWnd = true
  1668. );
  1669. DWORD SiwScrollTypeHGet() const;
  1670. DWORD SiwScrollTypeVGet() const;
  1671. DWORD SiwScrollTypeHSet(
  1672. DWORD dwScrollTypeNew,
  1673. bool bUpdateWnd = true
  1674. );
  1675. DWORD SiwScrollTypeVSet(
  1676. DWORD dwScrollTypeNew,
  1677. bool bUpdateWnd = true
  1678. );
  1679. bool SiwPreferHorizontalWalkGet() const;
  1680. bool SiwPreferHorizontalWalkSet(
  1681. bool bPreferHorizontalWalk
  1682. );
  1683. bool SiwThumbTrackEnabledGet( bool bHorz ) const;
  1684. bool SiwThumbTrackEnabledSet(
  1685. bool bHorz,
  1686. bool bEnabled = true
  1687. );
  1688. bool SiwAutohideScrollBarGet( bool bHorz ) const;
  1689. bool SiwAutohideScrollBarSet(
  1690. bool bHorz,
  1691. bool bAutoHide = true
  1692. );
  1693. //{{AFX_VIRTUAL(CExtScrollItemWnd)
  1694. protected:
  1695. virtual void PreSubclassWindow();
  1696. virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
  1697. //}}AFX_VIRTUAL
  1698. public:
  1699. virtual ~CExtScrollItemWnd();
  1700. virtual BOOL Create(
  1701. CWnd * pParentWnd,
  1702. const RECT & rcWnd = CRect( 0, 0, 0, 0 ),
  1703. UINT nDlgCtrlID = UINT( __EXT_MFC_IDC_STATIC ),
  1704. DWORD dwScrollItemWndStyle = 0L,
  1705. DWORD dwWindowStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
  1706. CCreateContext * pContext = NULL
  1707. );
  1708. virtual bool _CreateHelper();
  1709. static bool RegisterScrollItemWndClass();
  1710. virtual void OnSwGetScrollBarState(
  1711. CSize sizeClient,
  1712. CSize & sizeNeedSB,
  1713. CSize & sizeRange,
  1714. CPoint & ptMove,
  1715. bool bInsideClient
  1716. ) const;
  1717. virtual CSize OnSwGetLineSize( int nDirection ) const;
  1718. virtual void OnSwUpdateScrollBars();
  1719. virtual CSize OnSwGetPageSize( int nDirection ) const;
  1720. virtual CSize OnSwGetTotalSize() const;
  1721. virtual bool OnSwDoScroll(
  1722. UINT nScrollCode,
  1723. UINT nPos,
  1724. bool bDoScroll = true
  1725. );
  1726. virtual bool OnSwDoScrollBy(
  1727. CSize sizeScroll,
  1728. bool bDoScroll = true
  1729. );
  1730. virtual bool SiwFireCacheChanging(
  1731. LONG nScrollPosNewX = -1L, // if <0L - use current
  1732. LONG nScrollPosNewY = -1L, // if <0L - use current
  1733. bool bUpdate = true
  1734. );
  1735. virtual CPoint OnSwGetScrollPaintPos() const;
  1736. virtual void OnSwPaint( CDC & dc );
  1737. virtual bool OnSwQueryThumbTrackEnabled( bool bHorz ) const;
  1738. virtual bool OnSwCanAutoHideScrollBar( bool bHorz ) const;
  1739. virtual CSize OnSiwCalcItemSize() const;
  1740. virtual CSize OnSiwCalcPageMetrics( int nDirection ) const;
  1741. virtual bool OnSiwQueryVirtualBOF( bool bHorz ) const;
  1742. virtual bool OnSiwQueryVirtualEOF( bool bHorz ) const;
  1743. virtual CRect OnSiwGetFrozenRange() const;
  1744. virtual CRect OnSiwGetVisibleRange() const;
  1745. virtual INT OnSiwQueryItemExtentH(
  1746. LONG nColNo,
  1747. INT * p_nExtraSpaceBefore = NULL,
  1748. INT * p_nExtraSpaceAfter = NULL
  1749. ) const;
  1750. virtual INT OnSiwQueryItemExtentV(
  1751. LONG nRowNo,
  1752. INT * p_nExtraSpaceBefore = NULL,
  1753. INT * p_nExtraSpaceAfter = NULL
  1754. ) const;
  1755. virtual bool OnSiwVirtualEndTestH( LONG nColNo, LPARAM lParam ) const;
  1756. virtual bool OnSiwVirtualEndTestV( LONG nRowNo, LPARAM lParam ) const;
  1757. virtual bool OnSiwWalkCell(
  1758. CDC & dc,
  1759. LPVOID pQueryData,
  1760. LONG nVisibleColNo,
  1761. LONG nVisibleRowNo,
  1762. LONG nColNo,
  1763. LONG nRowNo,
  1764. const RECT & rcCellExtra,
  1765. const RECT & rcCell,
  1766. const RECT & rcVisibleRange,
  1767. bool & bVirtualRightReached,
  1768. bool & bVirtualBottomReached,
  1769. DWORD dwAreaFlags,
  1770. bool bFocusedControl
  1771. ) const;
  1772. virtual bool OnSiwWalkItemsH(
  1773. CDC & dc,
  1774. LPVOID pQueryData,
  1775. const RECT & rcRowExtra,
  1776. const RECT & rcRow,
  1777. LONG nVisibleRowNo,
  1778. LONG nRowNo,
  1779. const RECT & rcVisibleRange,
  1780. bool & bVirtualBottomReached,
  1781. DWORD dwAreaFlags,
  1782. bool bFocusedControl
  1783. ) const;
  1784. virtual bool OnSiwWalkItemsV(
  1785. CDC & dc,
  1786. LPVOID pQueryData,
  1787. const RECT & rcColExtra,
  1788. const RECT & rcCol,
  1789. LONG nVisibleColNo,
  1790. LONG nColNo,
  1791. const RECT & rcVisibleRange,
  1792. bool & bVirtualRightReached,
  1793. DWORD dwAreaFlags,
  1794. bool bFocusedControl
  1795. ) const;
  1796. virtual void OnSiwPaintBackground(
  1797. CDC & dc,
  1798. bool bFocusedControl
  1799. ) const;
  1800. virtual void OnSiwPaintForeground(
  1801. CDC & dc,
  1802. bool bFocusedControl
  1803. ) const;
  1804. virtual bool OnSiwQueryFocusedControlState() const;
  1805. virtual void OnSiwDrawFocusRect(
  1806. CDC &dc,
  1807. LPCRECT pRect,
  1808. CObject * pObjSrc = NULL,
  1809. LPARAM lParam = 0L
  1810. ) const;
  1811. virtual COLORREF OnSiwGetReadOnlyTextColor() const;
  1812. virtual COLORREF OnSiwGetReadOnlyBackgroundColor() const;
  1813. virtual COLORREF OnSiwGetSysColor( int nIndex ) const;
  1814. // nLighterOrDarker is related to COLOR_3DFACE brush:
  1815. // -3 - darkest, -2 - darker, -1 - dark,
  1816. // 1 - light, 2 - lighter, 3 - lightest
  1817. virtual CBrush & OnSiwGetLighterOrDarkerBrush( int nLighterOrDarker ) const;
  1818. virtual CFont & OnSiwGetDefaultFont() const;
  1819. virtual bool OnSiwCacheChanged(
  1820. const CExtScrollItemCacheInfo & _sciNew,
  1821. const CExtScrollItemCacheInfo & _sciOld
  1822. );
  1823. protected:
  1824. CExtScrollItemCacheInfo m_sciLast;
  1825. virtual bool _NotifyCacheChanged(
  1826. LONG nPosH,
  1827. LONG nPosOldH,
  1828. LONG nMaxH,
  1829. LONG nPageSizeH,
  1830. LONG nPosV,
  1831. LONG nPosOldV,
  1832. LONG nMaxV,
  1833. LONG nPageSizeV,
  1834. bool bBeginH,
  1835. bool bEndH,
  1836. bool bBeginV,
  1837. bool bEndV
  1838. );
  1839. public:
  1840. protected:
  1841. //{{AFX_MSG(CExtScrollItemWnd)
  1842. //}}AFX_MSG
  1843. DECLARE_MESSAGE_MAP()
  1844. }; // class CExtScrollItemWnd
  1845. #define __EXT_SCROLLITEMWND_CLASS_NAME _T("ProfUIS-ScrollItemWindow")
  1846. #endif // (!defined __EXT_MFC_NO_SCROLLITEMWND)
  1847. #if (!defined __EXT_MFC_NO_SCROLLCONAINERWND)
  1848. /////////////////////////////////////////////////////////////////////////////
  1849. // CExtScrollContainerWnd window
  1850. class __PROF_UIS_API CExtScrollContainerWnd : public CExtScrollWnd
  1851. {
  1852. public:
  1853. mutable CSize m_sizeToScroll;
  1854. DECLARE_DYNCREATE( CExtScrollContainerWnd );
  1855. CExtScrollContainerWnd();
  1856. virtual ~CExtScrollContainerWnd();
  1857. CExtScrollBar m_wndScrollBarH, m_wndScrollBarV;
  1858. CExtLabel m_wndCorner;
  1859. COLORREF m_clrBkColor;
  1860. bool m_bAutoDelete:1, m_bRedirectPreTranslateMessage:1, m_bRedirectOnCmdMsg:1,
  1861. m_bRedirectFocus:1, m_bSynchronizeEnabledState:1;
  1862. UINT m_nScrollRedrawFlags;
  1863. //{{AFX_VIRTUAL(CExtScrollContainerWnd)
  1864. public:
  1865. virtual CScrollBar * GetScrollBarCtrl(int nBar) const;
  1866. virtual BOOL PreTranslateMessage( MSG * pMsg );
  1867. virtual BOOL OnCmdMsg( UINT nID, int nCode, void * pExtra, AFX_CMDHANDLERINFO * pHandlerInfo );
  1868. protected:
  1869. virtual BOOL PreCreateWindow( CREATESTRUCT & cs );
  1870. virtual void PreSubclassWindow();
  1871. virtual void PostNcDestroy();
  1872. //}}AFX_VIRTUAL
  1873. public:
  1874. virtual bool Create(
  1875. CWnd * pWndParent,
  1876. const RECT & rc,
  1877. UINT nDlgCtrlID = AFX_IDW_PANE_FIRST
  1878. );
  1879. virtual CWnd * OnGetWndToScroll();
  1880. virtual CPoint OnSwGetScrollPaintPos() const;
  1881. virtual void OnSwPaint( CDC & dc );
  1882. virtual void OnSwPaintAreaBetweenScrollBarWindows(
  1883. CDC & dc,
  1884. const RECT & rcAreaBetweenScrollBarWindows
  1885. );
  1886. virtual CSize OnSwGetTotalSize() const;
  1887. virtual CSize OnSwGetPageSize( int nDirection ) const;
  1888. virtual CSize OnSwGetLineSize( int nDirection ) const;
  1889. virtual CRect OnSwRecalcLayout(
  1890. bool bDoLayout,
  1891. LPCRECT pRectClientSrc = NULL
  1892. );
  1893. virtual bool OnSwDoScrollBy(
  1894. CSize sizeScroll,
  1895. bool bDoScroll = true
  1896. );
  1897. protected:
  1898. //{{AFX_MSG(CExtScrollContainerWnd)
  1899. afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );
  1900. afx_msg void OnSetFocus( CWnd * pOldWnd );
  1901. afx_msg void OnEnable( BOOL bEnable );
  1902. //}}AFX_MSG
  1903. DECLARE_MESSAGE_MAP()
  1904. }; /// class CExtScrollContainerWnd
  1905. #endif // (!defined __EXT_MFC_NO_SCROLLCONAINERWND)
  1906. #endif // (!defined __EXT_MFC_NO_SCROLLWND)
  1907. /////////////////////////////////////////////////////////////////////////////
  1908. //{{AFX_INSERT_LOCATION}}
  1909. // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
  1910. #endif // !defined __EXT_SCROLLWND_H