void CMyEditorView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
cxClient = cx;
cyClient = cy;
si.cbSize = sizeof(si);
si.fMask = SIF_RANGE | SIF_PAGE ;
si.nMin = 0 ;
si.nMax = NUMLINES - 1 ;
si.nPage = cyClient / cyChar ;
SetScrollInfo (SB_VERT,&si,TRUE) ;
}
void CMyEditorView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
//保存原滚动条位置
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
GetScrollInfo(SB_VERT,&si);
iVscrollPos = si.nPos;
//更新滚动条
switch(nSBCode)
{
case SB_THUMBTRACK:
si.nPos = si.nTrackPos;
break;
case SB_PAGEDOWN:
si.nPos += si.nPage;
break;
case SB_PAGEUP:
si.nPos -= si.nPage;
break;
}
si.fMask = SIF_POS;
SetScrollInfo( SB_VERT,&si,TRUE );
GetScrollInfo( SB_VERT,&si );
//通知更新窗口
if( si.nPos!=iVscrollPos )
{
ScrollWindow( 0,cyChar*(iVscrollPos-si.nPos),NULL,NULL );
UpdateWindow();
}
}
void CMyEditorView::OnPaint()
{
//保存滚动条位置
si.cbSize = sizeof (si) ;
si.fMask = SIF_POS ;
GetScrollInfo (SB_VERT, &si) ;
iVscrollPos = si.nPos;
//确定输出范围
CPaintDC hdc(this);
RECT rect;
GetClientRect(&rect);
int iPaintBeg = max (0, si.nPos + rect.top / cyChar) ;
int iPaintEnd = min (NUMLINES-1,si.nPos + rect.bottom / cyChar) ;
//逐行输出
for ( int i = iPaintBeg ; i <= iPaintEnd ; i++)
{
TCHAR szBuffer [10] ;
int x = 0 ;
int y = cyChar * (i - iVscrollPos) ;
TextOut (hdc, x,y,sysmetrics[i].szLabel,lstrlen (sysmetrics[i].szLabel)) ;
TextOut (hdc, x+22*cxCaps,y,sysmetrics[i].szDesc,lstrlen (sysmetrics[i].szDesc)) ;
SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;
TextOut (hdc, x+22*cxCaps+40*cxChar,y,szBuffer,wsprintf (szBuffer, TEXT ("%5d"),
GetSystemMetrics (sysmetrics[i].index))) ;
SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
}
}
为滚动条添加键盘响应:
void CMyEditorView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case VK_UP:
SendMessage ( WM_VSCROLL, SB_LINEUP, 0) ;
break ;
case VK_DOWN:
SendMessage ( WM_VSCROLL, SB_LINEDOWN, 0) ;
break ;
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
疑问:
ScrollWindow扮演了什么角色?肯定不是绘图,绘图是在OnPaint里面实现的。类似Invalidate?使用InvalidateRect替代ScrollWindow能够达到同样效果,那为什么不用Invalidate呢?