static SCROLLINFO si;
//设置页面大小和滚动框范围 SCROLLINFO
si.cbSize=sizeof(SCROLLINFO);
si.fMask=SIF_RANGE|SIF_PAGE;
si.nMin=0;
si.nMax=NUMLINES-1;
si.nPage=cyClient/cyChar;
SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
return 0;
case WM_VSCROLL: //处理垂直滚动条消息
si.cbSize=sizeof(SCROLLINFO);
si.fMask=SIF_ALL;
GetScrollInfo(hwnd,SB_VERT,&si); //保存当前滚动框位置
iPos=si.nPos;
//以下调整滚动框的位置
switch(LOWORD(wParam)) //wParam低位为通知代码
{
case SB_LINEUP:
si.nPos-=1;
break;
case SB_LINEDOWN:
si.nPos+=1;
break;
case SB_PAGEUP:
si.nPos-=si.nPage;
break;
case SB_PAGEDOWN:
si.nPos+=si.nPage;
break;
case SB_THUMBTRACK:
si.nPos=si.nTrackPos; //current tracking position
break;
}
si.fMask=SIF_POS;
SetScrollInfo(hwnd,SB_VERT,&si,TRUE); //若位置越界,则Windows纠正
GetScrollInfo(hwnd,SB_VERT,&si); //返回纠正后的正确值
if(si.nPos!=iPos) //if position changed
{
ScrollWindow(hwnd,0,(iPos-si.nPos)*cyChar,NULL,NULL);
UpdateWindow(hwnd);
}
return 0;
y=(i-si.nPos)*cyChar;
附:SCROLLINFO结构
typedef struct tagSCROLLINFO
{
UINT cbSize ;// set to sizeof (SCROLLINFO)
UINT fMask ; // values to set or get
int nMin ; // minimum range value
int nMax ; // maximum range value
UINT nPage ; // page size
int nPos ; // current position
int nTrackPos ;// current tracking position
}
SCROLLINFO, * PSCROLLINFO ;