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

对话框与窗口

开发平台:

Visual C++

  1. // ExcelScrollView.cpp : implementation file
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "ExcelTab.h"
  22. #include "ExcelScrollView.h"
  23. #ifdef _DEBUG
  24. #define new DEBUG_NEW
  25. #undef THIS_FILE
  26. static char THIS_FILE[] = __FILE__;
  27. #endif
  28. /////////////////////////////////////////////////////////////////////////////
  29. // CExcelScrollView
  30. IMPLEMENT_DYNCREATE(CExcelScrollView, CScrollView)
  31. BEGIN_MESSAGE_MAP(CExcelScrollView, CScrollView)
  32. //{{AFX_MSG_MAP(CExcelScrollView)
  33. ON_WM_HSCROLL()
  34. ON_WM_CREATE()
  35. ON_WM_PAINT()
  36. //}}AFX_MSG_MAP
  37. // Standard printing commands
  38. ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
  39. ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
  40. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
  41. END_MESSAGE_MAP()
  42. /////////////////////////////////////////////////////////////////////////////
  43. // CExcelScrollView construction/destruction
  44. CExcelScrollView::CExcelScrollView()
  45. {
  46. // TODO: add construction code here
  47. }
  48. CExcelScrollView::~CExcelScrollView()
  49. {
  50. }
  51. BOOL CExcelScrollView::PreCreateWindow(CREATESTRUCT& cs)
  52. {
  53. return CScrollView::PreCreateWindow(cs);
  54. }
  55. /////////////////////////////////////////////////////////////////////////////
  56. // CExcelScrollView drawing
  57. void CExcelScrollView::OnDraw(CDC* pDC)
  58. {
  59. // TODO: add draw code for native data here
  60. CRect rc;
  61. CString strTemp;
  62. GetClientRect( &rc );
  63. int nPosX = GetScrollPos(SB_HORZ);
  64. int nPosY = GetScrollPos(SB_VERT);
  65. pDC->SetBkMode( TRANSPARENT );
  66. strTemp.Format( _T("nPosX: %d  nPosY: %d"), nPosX , nPosY   );
  67. pDC->TextOut( nPosX+ (rc.Width()/3) , nPosY + (rc.Height() /2 )  , strTemp);
  68. }
  69. #ifndef MM_NONE
  70. #define MM_NONE 0
  71. #endif//MM_NONE
  72. void CExcelScrollView::OnInitialUpdate()
  73. {
  74. CScrollView::OnInitialUpdate();
  75. SetScrollSizes( MM_TEXT, CSize( 16400, 16400 ));
  76. ResizeParentToFit( );
  77. SyncScrollBar();
  78. }
  79. /////////////////////////////////////////////////////////////////////////////
  80. // CExcelScrollView printing
  81. BOOL CExcelScrollView::OnPreparePrinting(CPrintInfo* pInfo)
  82. {
  83. // default preparation
  84. return DoPreparePrinting(pInfo);
  85. }
  86. void CExcelScrollView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  87. {
  88. // TODO: add extra initialization before printing
  89. }
  90. void CExcelScrollView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  91. {
  92. // TODO: add cleanup after printing
  93. }
  94. /////////////////////////////////////////////////////////////////////////////
  95. // CExcelScrollView diagnostics
  96. #ifdef _DEBUG
  97. void CExcelScrollView::AssertValid() const
  98. {
  99. CScrollView::AssertValid();
  100. }
  101. void CExcelScrollView::Dump(CDumpContext& dc) const
  102. {
  103. CScrollView::Dump(dc);
  104. }
  105. /*
  106. CTestScrollDoc* CExcelScrollView::GetDocument() // non-debug version is inline
  107. {
  108. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestScrollDoc)));
  109. return (CTestScrollDoc*)m_pDocument;
  110. }*/
  111. #endif //_DEBUG
  112. /////////////////////////////////////////////////////////////////////////////
  113. // CExcelScrollView message handlers
  114. BOOL CExcelScrollView::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll)
  115. {
  116. /////////////////////////////////
  117. // 32K H/V Scroll Limit Bug Fix
  118. CXTExcelTabCtrl *pParent = (CXTExcelTabCtrl *)GetParent();
  119. if( pParent && ::IsWindow( pParent->m_hWnd ) )
  120. {
  121. if( pParent->IsKindOf( RUNTIME_CLASS( CXTExcelTabCtrl ) ) )
  122. {
  123. ASSERT_KINDOF(CXTExcelTabCtrl, pParent);
  124. SCROLLINFO siFlat;
  125. ZeroMemory(&siFlat, sizeof(siFlat));
  126. siFlat.cbSize = sizeof(siFlat);
  127. siFlat.fMask = SIF_ALL;
  128. if (LOBYTE(nScrollCode) == SB_THUMBTRACK)
  129. {
  130. pParent->GetScrollInfo(SB_HORZ, &siFlat);
  131. nPos = siFlat.nTrackPos;
  132. }
  133. }
  134. }
  135. Invalidate( TRUE );
  136. return CScrollView::OnScroll(nScrollCode, nPos, bDoScroll);
  137. }
  138. void CExcelScrollView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  139. {
  140. // TODO: Add your message handler code here and/or call default
  141. TRACE1("CExcelScrollView::OnHScroll( %d ) n",nPos);
  142. if (m_ScrollBarH.m_hWnd   &&
  143. pScrollBar->GetSafeHwnd() == m_ScrollBarH.m_hWnd )
  144. {
  145. SCROLLINFO si;
  146. ZeroMemory(&si, sizeof(si));
  147. si.cbSize = sizeof(si);
  148. si.fMask = SIF_PAGE;
  149. m_ScrollBarH.GetScrollInfo(&si);
  150. int x = m_ScrollBarH.GetScrollPos();
  151. switch (nSBCode)
  152. {
  153. case SB_TOP:
  154. x = 0;
  155. break;
  156. case SB_BOTTOM:
  157. x = INT_MAX;
  158. break;
  159. case SB_LINEUP:
  160. x--;
  161. break;
  162. case SB_LINEDOWN:
  163. x++;
  164. break;
  165. case SB_PAGEUP:
  166. x -= si.nPage;
  167. break;
  168. case SB_PAGEDOWN:
  169. x += si.nPage;
  170. break;
  171. case SB_THUMBTRACK:
  172. x = nPos;
  173. break;
  174. }
  175. si.nPos = x;
  176. si.fMask = SIF_POS;
  177. m_ScrollBarH.SetScrollInfo(&si);
  178. TRACE1("OnHScroll( #1 si.nPos : %xn", si.nPos);
  179. }
  180. TRACE1("OnHScroll( #2 nPos : %xn", nPos);
  181. CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
  182. }
  183. CScrollBar* CExcelScrollView::GetScrollBarCtrl(int nBar)const
  184. {
  185. TRACE1("CExcelScrollView::GetScrollBarCtrl( %d )n", nBar);
  186. if (nBar == SB_HORZ)  {
  187. return (CScrollBar *)&m_ScrollBarH;
  188. }
  189. return CScrollView::GetScrollBarCtrl(nBar);
  190. }
  191. int CExcelScrollView::OnCreate(LPCREATESTRUCT lpCreateStruct)
  192. {
  193. if (CScrollView::OnCreate(lpCreateStruct) == -1)
  194. return -1;
  195. m_ScrollBarH.Create(WS_CHILD, CRect(0, 0, 0, 0), this, 0);
  196. return 0;
  197. }
  198. BOOL CExcelScrollView::SyncScrollBar()
  199. {
  200. CXTExcelTabCtrl *pParent = DYNAMIC_DOWNCAST(CXTExcelTabCtrl, GetParent());
  201. if ( ::IsWindow( pParent->GetSafeHwnd( )))
  202. {
  203. pParent->SyncScrollBar( );
  204. return TRUE;
  205. }
  206. return FALSE;
  207. }
  208. void CExcelScrollView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
  209. {
  210. SyncScrollBar();
  211. }
  212. BOOL CExcelScrollView::OnScrollBy(CSize sizeScroll, BOOL bDoScroll)
  213. {
  214. int xOrig, x;
  215. int yOrig, y;
  216. // don't scroll if there is no valid scroll range (ie. no scroll bar)
  217. CScrollBar* pBar;
  218. DWORD dwStyle = GetStyle();
  219. pBar = GetScrollBarCtrl(SB_VERT);
  220. if ((pBar != NULL && !pBar->IsWindowEnabled()) ||
  221. (pBar == NULL && !(dwStyle & WS_VSCROLL)))
  222. {
  223. // vertical scroll bar not enabled
  224. sizeScroll.cy = 0;
  225. }
  226. pBar = GetScrollBarCtrl(SB_HORZ);
  227. if ((pBar != NULL && !pBar->IsWindowEnabled()) ||
  228. (pBar == NULL && !(dwStyle & WS_HSCROLL)))
  229. {
  230. // horizontal scroll bar not enabled
  231. sizeScroll.cx = 0;
  232. }
  233. // adjust current x position
  234. xOrig = x = GetScrollPos(SB_HORZ);
  235. int xMax = GetScrollLimit(SB_HORZ);
  236. x += sizeScroll.cx;
  237. if (x < 0)
  238. x = 0;
  239. else if (x > xMax)
  240. x = xMax;
  241. // adjust current y position
  242. yOrig = y = GetScrollPos(SB_VERT);
  243. int yMax = GetScrollLimit(SB_VERT);
  244. y += sizeScroll.cy;
  245. if (y < 0)
  246. y = 0;
  247. else if (y > yMax)
  248. y = yMax;
  249. // did anything change?
  250. if (x == xOrig && y == yOrig)
  251. return FALSE;
  252. if (bDoScroll)
  253. {
  254. // do scroll and update scroll positions
  255. ScrollWindow(-(x-xOrig), -(y-yOrig));
  256. if (x != xOrig)
  257. SetScrollPos(SB_HORZ, x);
  258. if (y != yOrig)
  259. SetScrollPos(SB_VERT, y);
  260. }
  261. return TRUE;
  262. }
  263. void CExcelScrollView::OnPaint() 
  264. {
  265. if (m_nMapMode == MM_NONE)
  266. {
  267. SetScrollSizes( MM_TEXT, CSize( 16400, 16400 ));
  268. ResizeParentToFit( );
  269. SyncScrollBar();
  270. }
  271. // standard paint routine
  272. CPaintDC dc(this);
  273. OnPrepareDC(&dc);
  274. OnDraw(&dc);
  275. }