1.SetScrollInfo 函数的说明:
si.cbSize = sizeof(SCROLLINFO);
si.cbMask = SIF_RANGE | SIF_PAGE;
si.nMin = 0;
si.nMax = NUMLINES - 1;
si.nPage = cyClient/cyChar;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
这个时候Windows会把最大的滚动条范围限制为
si.nMax - si.nPage + 1
而不是NUMLINES-1。这样以来就很方便了。像前面说的那样,假设NUMLINES等于75,那么最后滚动条的最大范围是74-50+1,也就是25了。这正是我们想要的。这些都是系统自动设置的。虽然上面的代码中si.nMax被设置为NUMLINES-1,但是系统会自动把它设置成si.nMax - si.nPage + 1。
2
BOOL ScrollWindow( HWND hWnd, // handle to window int XAmount, // horizontal scrolling int YAmount, // vertical scrolling CONST RECT *lpRect, // client area CONST RECT *lpClipRect // clipping rectangle );
ScrollWindow的操作是根据参数的滚动范围 算出 不会滚出显示区域的矩形,对这部分像素直接BitBlt到新的合适位置,对于滚动出现的新的矩形,擦除背景,设该矩形为无效区域
窗口有无效区域会触发WM_PAINT,新的区域也会很及时的刷新
ScrollWindow做了两件事情:
1、bitblt部分像素到指定区域。2、设置无效区域。
比如说客户端只能显示100行的数据。本来显示的是1~100行,向上移动20行的距离后要显示的数据是21~120行,21-100行直接通过Bitblt赋值到前80行的位置,设置后面的20行为无效区域,由用户完成绘制。
BOOL ScrollWindow(
HWND hWnd, // handle to window
int XAmount, // horizontal scrolling
int YAmount, // vertical scrolling
CONST RECT *lpRect, // client area
CONST RECT *lpClipRect // clipping rectangle
);
卷动范围是由lpRect确定的,但是lpClipRect是由