DragonNest/Third/XTToolkitPro/Samples/Controls/ExcelTabView/ExcelScrollView.cpp

329 lines
7.5 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
// 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);
}