创建一个基于CScrollview的SDI Project(在第6步中选CScrollview)
若你已创建了,这步可以省略。
然后:
改为如
void
CTestView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize
sizeTotal;
// TODO: calculate the total size of this
view
sizeTotal.cx = 1024; //改这两个
sizeTotal.cy =
768; //
SetScrollSizes(MM_TEXT,
sizeTotal);
}
BOOL CDiagramShowView::PreTranslateMessage(MSG* pMsg)
{
CFileTreeDoc* pDoc = (CFileTreeDoc*)GetDocument();
CPoint point = GetScrollPosition();
if(pMsg->message == WM_KEYDOWN)
{
switch(pMsg->wParam)
{
case VK_LEFT:
if( point.x > 10)
{
EndPoint.x = EndPoint.x - 10;
EndPoint.y = EndPoint.y;
}
else
{
EndPoint.x = 0;
EndPoint.y = EndPoint.y;
}
ScrollToPosition(EndPoint);
InvalidateRect(NULL,TRUE);
break;
case VK_RIGHT:
if( point.x < pDoc->intDiagramColumnCount * pDoc->intColumnWidth - 10 )
{
EndPoint.x = EndPoint.x + 10;
EndPoint.y = EndPoint.y;
}
else
{
EndPoint.y = pDoc->intDiagramColumnCount * pDoc->intColumnWidth;
EndPoint.x = EndPoint.x;
}
ScrollToPosition(EndPoint);
InvalidateRect(NULL,TRUE);
break;
case VK_UP:
if( point.y > 10)
{
EndPoint.y = EndPoint.y - 10;
EndPoint.x = EndPoint.x;
}
else
{
EndPoint.y = 0;
EndPoint.x = EndPoint.x;
}
ScrollToPosition(EndPoint);
InvalidateRect(NULL,TRUE);
break;
case VK_DOWN:
if( point.y < pDoc->intDiagramRowCount * pDoc->intRowHeight - 10 )
{
EndPoint.y = EndPoint.y + 10;
EndPoint.x = EndPoint.x;
}
else
{
EndPoint.y = pDoc->intDiagramRowCount * pDoc->intRowHeight;
EndPoint.x = EndPoint.x;
}
ScrollToPosition(EndPoint);
InvalidateRect(NULL,TRUE);
break;
default:
break;
}
}
return FALSE;
}
// 通过正负号判断是向上还是向下滚动
if(zDelta==120)
向上滚动
if(zDelta==-120)
向下滚动
BOOL CDiagramShowView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
CFileTreeDoc* pDoc = (CFileTreeDoc*)GetDocument();
CPoint point = GetScrollPosition();
if(zDelta==120)
{
if( point.y >= 20 )
{
EndPoint.x = point.x;
EndPoint.y = point.y;
EndPoint.x = EndPoint.x;
EndPoint.y = EndPoint.y - 20;
}
else
{
EndPoint.x = EndPoint.x;
EndPoint.y = 0;
}
}
if(zDelta==-120)
{
if( point.y <= pDoc->intDiagramRowCount * pDoc->intRowHeight - 20 )
{
EndPoint.x = point.x;
EndPoint.y = point.y;
EndPoint.x = EndPoint.x;
EndPoint.y = EndPoint.y + 20;
}
else
{
EndPoint.x = EndPoint.x;
EndPoint.y = EndPoint.y;
}
}
ScrollToPosition(EndPoint);
InvalidateRect(NULL,TRUE);
return CScrollView::OnMouseWheel(nFlags, zDelta, pt);
}
ModifyStyle(0,WS_VSCROLL);
我的问题是当我用鼠标滚动分割窗口时,视口滚动都很正常,但用键盘时,却什么也没有发生.
在你的视图继承类中加入如下两个函数,假定该类为CScrollerView:
void CScrollerView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT
nFlags)
{
BOOL
processed;
for (unsigned int
i=0;i<
nRepCnt&&processed;i++)
processed=KeyScroll(nChar);
if
(!processed)
CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
}
BOOL CScrollerView::KeyScroll(UINT
nChar)
{
switch
(nChar)
{
case
VK_UP:
OnVScroll(SB_LINEUP,0,NULL);
break;
case
VK_DOWN:
OnVScroll(SB_LINEDOWN,0,NULL);
break;
case
VK_LEFT:
OnHScroll(SB_LINELEFT,0,NULL);
break;
case
VK_RIGHT:
OnHScroll(SB_LINERIGHT,0,NULL);
break;
case
VK_HOME:
OnHScroll(SB_LEFT,0,NULL);
break;
case
VK_END:
OnHScroll(SB_RIGHT,0,NULL);
break;
case
VK_PRIOR:
OnVScroll(SB_PAGEUP,0,NULL);
break;
case
VK_NEXT:
OnVScroll(SB_PAGEDOWN,0,NULL);
break;
default:
return
FALSE; // not for
us
// and let the default
class
// process
it.
}
return TRUE;
}
原文:http://www.cnblogs.com/lidabo/p/3703502.html