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

对话框与窗口

开发平台:

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_TRACKPOS;
  128. if (LOBYTE(nScrollCode) == SB_THUMBTRACK)
  129. {
  130. GetScrollInfo(SB_HORZ, &siFlat);
  131. nPos = siFlat.nTrackPos;
  132. }
  133. if (HIBYTE(nScrollCode) == SB_THUMBTRACK)
  134. {
  135. GetScrollInfo(SB_VERT, &siFlat);
  136. nPos = siFlat.nTrackPos;
  137. }
  138. }
  139. }
  140. Invalidate( TRUE );
  141. return CScrollView::OnScroll(nScrollCode, nPos, bDoScroll);
  142. }
  143. void CExcelScrollView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  144. {
  145. // TODO: Add your message handler code here and/or call default
  146. TRACE1("CExcelScrollView::OnHScroll( %d ) n",nPos);
  147. if (m_ScrollBarH.m_hWnd   &&
  148. pScrollBar->GetSafeHwnd() == m_ScrollBarH.m_hWnd )
  149. {
  150. SCROLLINFO si;
  151. ZeroMemory(&si, sizeof(si));
  152. si.cbSize = sizeof(si);
  153. si.fMask = SIF_PAGE;
  154. m_ScrollBarH.GetScrollInfo(&si);
  155. int x = m_ScrollBarH.GetScrollPos();
  156. switch (nSBCode)
  157. {
  158. case SB_TOP:
  159. x = 0;
  160. break;
  161. case SB_BOTTOM:
  162. x = INT_MAX;
  163. break;
  164. case SB_LINEUP:
  165. x--;
  166. break;
  167. case SB_LINEDOWN:
  168. x++;
  169. break;
  170. case SB_PAGEUP:
  171. x -= si.nPage;
  172. break;
  173. case SB_PAGEDOWN:
  174. x += si.nPage;
  175. break;
  176. case SB_THUMBTRACK:
  177. x = nPos;
  178. break;
  179. }
  180. si.nPos = x;
  181. si.fMask = SIF_POS;
  182. m_ScrollBarH.SetScrollInfo(&si);
  183. TRACE1("OnHScroll( #1 si.nPos : %xn", si.nPos);
  184. }
  185. TRACE1("OnHScroll( #2 nPos : %xn", nPos);
  186. CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
  187. }
  188. CScrollBar* CExcelScrollView::GetScrollBarCtrl(int nBar)const
  189. {
  190. TRACE1("CExcelScrollView::GetScrollBarCtrl( %d )n", nBar);
  191. if (nBar == SB_HORZ)  {
  192. return (CScrollBar *)&m_ScrollBarH;
  193. }
  194. return CScrollView::GetScrollBarCtrl(nBar);
  195. }
  196. int CExcelScrollView::OnCreate(LPCREATESTRUCT lpCreateStruct)
  197. {
  198. if (CScrollView::OnCreate(lpCreateStruct) == -1)
  199. return -1;
  200. m_ScrollBarH.Create(WS_CHILD, CRect(0, 0, 0, 0), this, 0);
  201. return 0;
  202. }
  203. BOOL CExcelScrollView::SyncScrollBar()
  204. {
  205. CXTExcelTabCtrl *pParent = DYNAMIC_DOWNCAST(CXTExcelTabCtrl, GetParent());
  206. if ( ::IsWindow( pParent->GetSafeHwnd( )))
  207. {
  208. pParent->SyncScrollBar( );
  209. return TRUE;
  210. }
  211. return FALSE;
  212. }
  213. void CExcelScrollView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
  214. {
  215. SyncScrollBar();
  216. }
  217. BOOL CExcelScrollView::OnScrollBy(CSize sizeScroll, BOOL bDoScroll)
  218. {
  219. int xOrig, x;
  220. int yOrig, y;
  221. // don't scroll if there is no valid scroll range (ie. no scroll bar)
  222. CScrollBar* pBar;
  223. DWORD dwStyle = GetStyle();
  224. pBar = GetScrollBarCtrl(SB_VERT);
  225. if ((pBar != NULL && !pBar->IsWindowEnabled()) ||
  226. (pBar == NULL && !(dwStyle & WS_VSCROLL)))
  227. {
  228. // vertical scroll bar not enabled
  229. sizeScroll.cy = 0;
  230. }
  231. pBar = GetScrollBarCtrl(SB_HORZ);
  232. if ((pBar != NULL && !pBar->IsWindowEnabled()) ||
  233. (pBar == NULL && !(dwStyle & WS_HSCROLL)))
  234. {
  235. // horizontal scroll bar not enabled
  236. sizeScroll.cx = 0;
  237. }
  238. // adjust current x position
  239. xOrig = x = GetScrollPos(SB_HORZ);
  240. int xMax = GetScrollLimit(SB_HORZ);
  241. x += sizeScroll.cx;
  242. if (x < 0)
  243. x = 0;
  244. else if (x > xMax)
  245. x = xMax;
  246. // adjust current y position
  247. yOrig = y = GetScrollPos(SB_VERT);
  248. int yMax = GetScrollLimit(SB_VERT);
  249. y += sizeScroll.cy;
  250. if (y < 0)
  251. y = 0;
  252. else if (y > yMax)
  253. y = yMax;
  254. // did anything change?
  255. if (x == xOrig && y == yOrig)
  256. return FALSE;
  257. if (bDoScroll)
  258. {
  259. // do scroll and update scroll positions
  260. ScrollWindow(-(x-xOrig), -(y-yOrig));
  261. if (x != xOrig)
  262. SetScrollPos(SB_HORZ, x);
  263. if (y != yOrig)
  264. SetScrollPos(SB_VERT, y);
  265. }
  266. return TRUE;
  267. }
  268. void CExcelScrollView::OnPaint() 
  269. {
  270. if (m_nMapMode == MM_NONE)
  271. {
  272. SetScrollSizes( MM_TEXT, CSize( 16400, 16400 ));
  273. ResizeParentToFit( );
  274. SyncScrollBar();
  275. }
  276. // standard paint routine
  277. CPaintDC dc(this);
  278. OnPrepareDC(&dc);
  279. OnDraw(&dc);
  280. }
  281. void CExcelScrollView::ResizeParentToFit(BOOL bShrinkOnly/* = TRUE*/)
  282. {
  283. // adjust parent rect so client rect is appropriate size
  284. ASSERT(m_nMapMode != MM_NONE);  // mapping mode must be known
  285. // determine current size of the client area as if no scrollbars present
  286. CRect rectClient;
  287. GetWindowRect(rectClient);
  288. CRect rect = rectClient;
  289. CalcWindowRect(rect);
  290. rectClient.left += rectClient.left - rect.left;
  291. rectClient.top += rectClient.top - rect.top;
  292. rectClient.right -= rect.right - rectClient.right;
  293. rectClient.bottom -= rect.bottom - rectClient.bottom;
  294. rectClient.OffsetRect(-rectClient.left, -rectClient.top);
  295. ASSERT(rectClient.left == 0 && rectClient.top == 0);
  296. // determine desired size of the view
  297. CRect rectView(0, 0, m_totalDev.cx, m_totalDev.cy);
  298. if (bShrinkOnly)
  299. {
  300. if (rectClient.right <= m_totalDev.cx)
  301. rectView.right = rectClient.right;
  302. if (rectClient.bottom <= m_totalDev.cy)
  303. rectView.bottom = rectClient.bottom;
  304. }
  305. CalcWindowRect(rectView, CWnd::adjustOutside);
  306. rectView.OffsetRect(-rectView.left, -rectView.top);
  307. ASSERT(rectView.left == 0 && rectView.top == 0);
  308. if (bShrinkOnly)
  309. {
  310. if (rectClient.right <= m_totalDev.cx)
  311. rectView.right = rectClient.right;
  312. if (rectClient.bottom <= m_totalDev.cy)
  313. rectView.bottom = rectClient.bottom;
  314. }
  315. // determine and set size of frame based on desired size of view
  316. CRect rectFrame;
  317. CWnd* pParentWnd = AfxGetMainWnd();
  318. if (::IsWindow(pParentWnd->GetSafeHwnd()))
  319. {
  320. CXTPWindowRect rWindow(pParentWnd);
  321. pParentWnd->SetRedraw(FALSE);
  322. pParentWnd->SetWindowPos(NULL, 0, 0, rWindow.Width()+1, rWindow.Height(),
  323. SWP_NOMOVE|SWP_FRAMECHANGED);
  324. pParentWnd->SetRedraw(TRUE);
  325. pParentWnd->SetWindowPos(NULL, 0, 0, rWindow.Width()-1, rWindow.Height(),
  326. SWP_NOMOVE|SWP_FRAMECHANGED);
  327. }
  328. }