www.pudn.com > SNMP·¶ÀýÔ´´úÂë.zip > AUTOSCROLLVIEW.CPP
// AutoScrollView.cpp : implementation file
//
#include "stdafx.h"
#include "OAM.h"
#include "AutoScrollView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAutoScrollView
IMPLEMENT_DYNCREATE(CAutoScrollView, CScrollView)
CAutoScrollView::CAutoScrollView()
{
m_bIsScrolling = FALSE;
}
CAutoScrollView::~CAutoScrollView()
{
}
BEGIN_MESSAGE_MAP(CAutoScrollView, CScrollView)
//{{AFX_MSG_MAP(CAutoScrollView)
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAutoScrollView drawing
void CAutoScrollView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
void CAutoScrollView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CAutoScrollView diagnostics
#ifdef _DEBUG
void CAutoScrollView::AssertValid() const
{
CScrollView::AssertValid();
}
void CAutoScrollView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CAutoScrollView message handlers
void CAutoScrollView::AutoScrollView(UINT nRefMessage)
{
HCURSOR hCur;
hCur = AfxGetApp()->LoadCursor(IDC_HANDCUR);//AFX_IDC_HSPLITBAR);
SetCursor(hCur);
m_bIsScrolling = TRUE;
MSG msg;
CPoint ptScrollPos;
CPoint ptDevScrollPos;
CPoint ptCursorPos;
CRect rc;
long dx,dy;
SIZE sizeTotal;
SIZE sizePage;
SIZE sizeLine;
int nMapMode;
int nMapFactor;
int xMin,xMax;
int yMin,yMax;
/////
CPoint ptOldCursorPos;
GetCursorPos(&ptOldCursorPos);
ScreenToClient(&ptOldCursorPos);
/////
msg.message = 0;
SetCapture();
GetDeviceScrollSizes(nMapMode,sizeTotal,sizePage,sizeLine);
GetScrollRange(SB_HORZ,&xMin,&xMax);
GetScrollRange(SB_VERT,&yMin,&yMax);
while(msg.message != nRefMessage)
{
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(msg.message != WM_MOUSEMOVE)
continue;
ptScrollPos = GetScrollPosition();
ptDevScrollPos = GetDeviceScrollPosition();
GetCursorPos(&ptCursorPos);
ScreenToClient(&ptCursorPos);
GetClientRect(&rc);
dx = 0l;
dy = 0l;
//////////////
dx = ptOldCursorPos.x - ptCursorPos.x;
if(dx < 0 && sizeTotal.cx <= rc.Width())
dx = 0;
else if(dx > 0 && (ptDevScrollPos.x < xMin || sizeTotal.cx <= rc.Width()))
dx = 0;
dy = ptOldCursorPos.y - ptCursorPos.y;
if(dy < 0 && sizeTotal.cy <= rc.Height())
dy = 0;
else if(dy > 0 && (ptDevScrollPos.y < yMin || sizeTotal.cy <= rc.Height()))
dy = 0;
ptOldCursorPos = ptCursorPos;
//////////////
/*
if((ptCursorPos.y<0)&&(ptDevScrollPos.y != yMin))
dy = min(-sizeLine.cy,max(-sizePage.cy,
(ptCursorPos.y/10)*sizeLine.cy));
else if ((ptCursorPos.y>rc.bottom)&&(ptDevScrollPos.y!=yMax))
dy = max(sizeLine.cy,min(sizePage.cy,
((ptCursorPos.y-rc.bottom)/10)*sizeLine.cy));
if((ptCursorPos.x<0)&&(ptDevScrollPos.x != xMin))
dx = min(-sizeLine.cx,max(-sizePage.cx,
(ptCursorPos.x/10)*sizeLine.cx));
else if ((ptCursorPos.x>rc.right)&&(ptDevScrollPos.x!=xMax))
dx = max(sizeLine.cx,min(sizePage.cx,
((ptCursorPos.x-rc.right)/10)*sizeLine.cx));
*/
//////////////////////
if((dx != 0)||(dy != 0))
{
nMapFactor = (nMapMode == MM_TEXT)?1:-1;
ptScrollPos.y += (int)dy*nMapFactor;
ptScrollPos.x += (int)dx;
// m_bIsScrolling = TRUE;
// OnAutoScroll(ptCursorPos,TRUE);
ScrollToPosition(ptScrollPos);
// OnAutoScroll(ptCursorPos,FALSE);
}
else
{
// m_bIsScrolling = FALSE;
}
}
ReleaseCapture();
m_bIsScrolling = FALSE;
}
void CAutoScrollView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
AutoScrollView(WM_LBUTTONUP);
CScrollView::OnLButtonDown(nFlags, point);
}