329 lines
7.5 KiB
C++
329 lines
7.5 KiB
C++
|
|
// ExcelScrollView.cpp : implementation file
|
||
|
|
//
|
||
|
|
// This file is a part of the XTREME CONTROLS MFC class library.
|
||
|
|
// (c)1998-2008 Codejock Software, All Rights Reserved.
|
||
|
|
//
|
||
|
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
||
|
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
||
|
|
// CONSENT OF CODEJOCK SOFTWARE.
|
||
|
|
//
|
||
|
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
||
|
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
||
|
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
||
|
|
// SINGLE COMPUTER.
|
||
|
|
//
|
||
|
|
// CONTACT INFORMATION:
|
||
|
|
// support@codejock.com
|
||
|
|
// http://www.codejock.com
|
||
|
|
//
|
||
|
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
#include "stdafx.h"
|
||
|
|
#include "ExcelTab.h"
|
||
|
|
#include "ExcelScrollView.h"
|
||
|
|
|
||
|
|
#ifdef _DEBUG
|
||
|
|
#define new DEBUG_NEW
|
||
|
|
#undef THIS_FILE
|
||
|
|
static char THIS_FILE[] = __FILE__;
|
||
|
|
#endif
|
||
|
|
|
||
|
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
// CExcelScrollView
|
||
|
|
|
||
|
|
IMPLEMENT_DYNCREATE(CExcelScrollView, CScrollView)
|
||
|
|
|
||
|
|
BEGIN_MESSAGE_MAP(CExcelScrollView, CScrollView)
|
||
|
|
//{{AFX_MSG_MAP(CExcelScrollView)
|
||
|
|
ON_WM_HSCROLL()
|
||
|
|
ON_WM_CREATE()
|
||
|
|
ON_WM_PAINT()
|
||
|
|
//}}AFX_MSG_MAP
|
||
|
|
// Standard printing commands
|
||
|
|
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
|
||
|
|
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
|
||
|
|
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
|
||
|
|
END_MESSAGE_MAP()
|
||
|
|
|
||
|
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
// CExcelScrollView construction/destruction
|
||
|
|
|
||
|
|
CExcelScrollView::CExcelScrollView()
|
||
|
|
{
|
||
|
|
// TODO: add construction code here
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
CExcelScrollView::~CExcelScrollView()
|
||
|
|
{
|
||
|
|
}
|
||
|
|
|
||
|
|
BOOL CExcelScrollView::PreCreateWindow(CREATESTRUCT& cs)
|
||
|
|
{
|
||
|
|
return CScrollView::PreCreateWindow(cs);
|
||
|
|
}
|
||
|
|
|
||
|
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
// CExcelScrollView drawing
|
||
|
|
|
||
|
|
void CExcelScrollView::OnDraw(CDC* pDC)
|
||
|
|
{
|
||
|
|
// TODO: add draw code for native data here
|
||
|
|
CRect rc;
|
||
|
|
CString strTemp;
|
||
|
|
|
||
|
|
GetClientRect( &rc );
|
||
|
|
|
||
|
|
int nPosX = GetScrollPos(SB_HORZ);
|
||
|
|
int nPosY = GetScrollPos(SB_VERT);
|
||
|
|
|
||
|
|
pDC->SetBkMode( TRANSPARENT );
|
||
|
|
|
||
|
|
strTemp.Format( _T("nPosX: %d nPosY: %d"), nPosX , nPosY );
|
||
|
|
|
||
|
|
pDC->TextOut( nPosX+ (rc.Width()/3) , nPosY + (rc.Height() /2 ) , strTemp);
|
||
|
|
}
|
||
|
|
|
||
|
|
#ifndef MM_NONE
|
||
|
|
#define MM_NONE 0
|
||
|
|
#endif//MM_NONE
|
||
|
|
|
||
|
|
void CExcelScrollView::OnInitialUpdate()
|
||
|
|
{
|
||
|
|
CScrollView::OnInitialUpdate();
|
||
|
|
|
||
|
|
SetScrollSizes( MM_TEXT, CSize( 16400, 16400 ));
|
||
|
|
ResizeParentToFit( );
|
||
|
|
SyncScrollBar();
|
||
|
|
}
|
||
|
|
|
||
|
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
// CExcelScrollView printing
|
||
|
|
|
||
|
|
BOOL CExcelScrollView::OnPreparePrinting(CPrintInfo* pInfo)
|
||
|
|
{
|
||
|
|
// default preparation
|
||
|
|
return DoPreparePrinting(pInfo);
|
||
|
|
}
|
||
|
|
|
||
|
|
void CExcelScrollView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
|
||
|
|
{
|
||
|
|
// TODO: add extra initialization before printing
|
||
|
|
}
|
||
|
|
|
||
|
|
void CExcelScrollView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
|
||
|
|
{
|
||
|
|
// TODO: add cleanup after printing
|
||
|
|
}
|
||
|
|
|
||
|
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
// CExcelScrollView diagnostics
|
||
|
|
|
||
|
|
#ifdef _DEBUG
|
||
|
|
void CExcelScrollView::AssertValid() const
|
||
|
|
{
|
||
|
|
CScrollView::AssertValid();
|
||
|
|
}
|
||
|
|
|
||
|
|
void CExcelScrollView::Dump(CDumpContext& dc) const
|
||
|
|
{
|
||
|
|
CScrollView::Dump(dc);
|
||
|
|
}
|
||
|
|
/*
|
||
|
|
CTestScrollDoc* CExcelScrollView::GetDocument() // non-debug version is inline
|
||
|
|
{
|
||
|
|
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestScrollDoc)));
|
||
|
|
return (CTestScrollDoc*)m_pDocument;
|
||
|
|
}*/
|
||
|
|
#endif //_DEBUG
|
||
|
|
|
||
|
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
|
// CExcelScrollView message handlers
|
||
|
|
|
||
|
|
BOOL CExcelScrollView::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll)
|
||
|
|
{
|
||
|
|
/////////////////////////////////
|
||
|
|
// 32K H/V Scroll Limit Bug Fix
|
||
|
|
CXTExcelTabCtrl *pParent = (CXTExcelTabCtrl *)GetParent();
|
||
|
|
if( pParent && ::IsWindow( pParent->m_hWnd ) )
|
||
|
|
{
|
||
|
|
if( pParent->IsKindOf( RUNTIME_CLASS( CXTExcelTabCtrl ) ) )
|
||
|
|
{
|
||
|
|
ASSERT_KINDOF(CXTExcelTabCtrl, pParent);
|
||
|
|
|
||
|
|
SCROLLINFO siFlat;
|
||
|
|
ZeroMemory(&siFlat, sizeof(siFlat));
|
||
|
|
siFlat.cbSize = sizeof(siFlat);
|
||
|
|
siFlat.fMask = SIF_ALL;
|
||
|
|
|
||
|
|
if (LOBYTE(nScrollCode) == SB_THUMBTRACK)
|
||
|
|
{
|
||
|
|
pParent->GetScrollInfo(SB_HORZ, &siFlat);
|
||
|
|
nPos = siFlat.nTrackPos;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
Invalidate( TRUE );
|
||
|
|
|
||
|
|
return CScrollView::OnScroll(nScrollCode, nPos, bDoScroll);
|
||
|
|
}
|
||
|
|
|
||
|
|
void CExcelScrollView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
|
||
|
|
{
|
||
|
|
// TODO: Add your message handler code here and/or call default
|
||
|
|
TRACE1("CExcelScrollView::OnHScroll( %d ) \n",nPos);
|
||
|
|
if (m_ScrollBarH.m_hWnd &&
|
||
|
|
pScrollBar->GetSafeHwnd() == m_ScrollBarH.m_hWnd )
|
||
|
|
{
|
||
|
|
SCROLLINFO si;
|
||
|
|
ZeroMemory(&si, sizeof(si));
|
||
|
|
si.cbSize = sizeof(si);
|
||
|
|
si.fMask = SIF_PAGE;
|
||
|
|
m_ScrollBarH.GetScrollInfo(&si);
|
||
|
|
|
||
|
|
int x = m_ScrollBarH.GetScrollPos();
|
||
|
|
switch (nSBCode)
|
||
|
|
{
|
||
|
|
case SB_TOP:
|
||
|
|
x = 0;
|
||
|
|
break;
|
||
|
|
case SB_BOTTOM:
|
||
|
|
x = INT_MAX;
|
||
|
|
break;
|
||
|
|
case SB_LINEUP:
|
||
|
|
x--;
|
||
|
|
break;
|
||
|
|
case SB_LINEDOWN:
|
||
|
|
x++;
|
||
|
|
break;
|
||
|
|
case SB_PAGEUP:
|
||
|
|
x -= si.nPage;
|
||
|
|
break;
|
||
|
|
case SB_PAGEDOWN:
|
||
|
|
x += si.nPage;
|
||
|
|
break;
|
||
|
|
case SB_THUMBTRACK:
|
||
|
|
x = nPos;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
si.nPos = x;
|
||
|
|
si.fMask = SIF_POS;
|
||
|
|
m_ScrollBarH.SetScrollInfo(&si);
|
||
|
|
TRACE1("OnHScroll( #1 si.nPos : %x\n", si.nPos);
|
||
|
|
}
|
||
|
|
|
||
|
|
TRACE1("OnHScroll( #2 nPos : %x\n", nPos);
|
||
|
|
CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
CScrollBar* CExcelScrollView::GetScrollBarCtrl(int nBar)const
|
||
|
|
{
|
||
|
|
TRACE1("CExcelScrollView::GetScrollBarCtrl( %d )\n", nBar);
|
||
|
|
|
||
|
|
if (nBar == SB_HORZ) {
|
||
|
|
return (CScrollBar *)&m_ScrollBarH;
|
||
|
|
}
|
||
|
|
return CScrollView::GetScrollBarCtrl(nBar);
|
||
|
|
}
|
||
|
|
|
||
|
|
int CExcelScrollView::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
||
|
|
{
|
||
|
|
if (CScrollView::OnCreate(lpCreateStruct) == -1)
|
||
|
|
return -1;
|
||
|
|
|
||
|
|
m_ScrollBarH.Create(WS_CHILD, CRect(0, 0, 0, 0), this, 0);
|
||
|
|
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
BOOL CExcelScrollView::SyncScrollBar()
|
||
|
|
{
|
||
|
|
CXTExcelTabCtrl *pParent = DYNAMIC_DOWNCAST(CXTExcelTabCtrl, GetParent());
|
||
|
|
if ( ::IsWindow( pParent->GetSafeHwnd( )))
|
||
|
|
{
|
||
|
|
pParent->SyncScrollBar( );
|
||
|
|
return TRUE;
|
||
|
|
}
|
||
|
|
return FALSE;
|
||
|
|
}
|
||
|
|
|
||
|
|
void CExcelScrollView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/)
|
||
|
|
{
|
||
|
|
SyncScrollBar();
|
||
|
|
}
|
||
|
|
|
||
|
|
BOOL CExcelScrollView::OnScrollBy(CSize sizeScroll, BOOL bDoScroll)
|
||
|
|
{
|
||
|
|
int xOrig, x;
|
||
|
|
int yOrig, y;
|
||
|
|
|
||
|
|
// don't scroll if there is no valid scroll range (ie. no scroll bar)
|
||
|
|
CScrollBar* pBar;
|
||
|
|
DWORD dwStyle = GetStyle();
|
||
|
|
pBar = GetScrollBarCtrl(SB_VERT);
|
||
|
|
if ((pBar != NULL && !pBar->IsWindowEnabled()) ||
|
||
|
|
(pBar == NULL && !(dwStyle & WS_VSCROLL)))
|
||
|
|
{
|
||
|
|
// vertical scroll bar not enabled
|
||
|
|
sizeScroll.cy = 0;
|
||
|
|
}
|
||
|
|
pBar = GetScrollBarCtrl(SB_HORZ);
|
||
|
|
if ((pBar != NULL && !pBar->IsWindowEnabled()) ||
|
||
|
|
(pBar == NULL && !(dwStyle & WS_HSCROLL)))
|
||
|
|
{
|
||
|
|
// horizontal scroll bar not enabled
|
||
|
|
sizeScroll.cx = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
// adjust current x position
|
||
|
|
xOrig = x = GetScrollPos(SB_HORZ);
|
||
|
|
int xMax = GetScrollLimit(SB_HORZ);
|
||
|
|
x += sizeScroll.cx;
|
||
|
|
if (x < 0)
|
||
|
|
x = 0;
|
||
|
|
else if (x > xMax)
|
||
|
|
x = xMax;
|
||
|
|
|
||
|
|
// adjust current y position
|
||
|
|
yOrig = y = GetScrollPos(SB_VERT);
|
||
|
|
int yMax = GetScrollLimit(SB_VERT);
|
||
|
|
y += sizeScroll.cy;
|
||
|
|
if (y < 0)
|
||
|
|
y = 0;
|
||
|
|
else if (y > yMax)
|
||
|
|
y = yMax;
|
||
|
|
|
||
|
|
// did anything change?
|
||
|
|
if (x == xOrig && y == yOrig)
|
||
|
|
return FALSE;
|
||
|
|
|
||
|
|
if (bDoScroll)
|
||
|
|
{
|
||
|
|
// do scroll and update scroll positions
|
||
|
|
ScrollWindow(-(x-xOrig), -(y-yOrig));
|
||
|
|
if (x != xOrig)
|
||
|
|
SetScrollPos(SB_HORZ, x);
|
||
|
|
if (y != yOrig)
|
||
|
|
SetScrollPos(SB_VERT, y);
|
||
|
|
}
|
||
|
|
return TRUE;
|
||
|
|
}
|
||
|
|
|
||
|
|
void CExcelScrollView::OnPaint()
|
||
|
|
{
|
||
|
|
if (m_nMapMode == MM_NONE)
|
||
|
|
{
|
||
|
|
SetScrollSizes( MM_TEXT, CSize( 16400, 16400 ));
|
||
|
|
ResizeParentToFit( );
|
||
|
|
SyncScrollBar();
|
||
|
|
}
|
||
|
|
|
||
|
|
// standard paint routine
|
||
|
|
CPaintDC dc(this);
|
||
|
|
OnPrepareDC(&dc);
|
||
|
|
OnDraw(&dc);
|
||
|
|
}
|