关于 ScrollWindow 的很多问题
本帖最后由 ShuRay 于 2013-03-08 19:57:27 编辑 大家好!我在看《Windows程序设计》第四章关于滚动条的实现时碰到了ScrollWindow这个函数,书中介绍的不是很详细,在网上搜到的资料说的也不是很明白,有几个疑问一直没弄懂,大家帮帮忙吧~先在此谢过啦!
先贴一下代码:
case WM_VSCROLL:
{
// 获取滚动条当前信息
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_ALL;
GetScrollInfo(hwnd, SB_VERT, &si);
// 保存当前位置
iVPos = si.nPos;
switch(LOWORD(wParam))
{
case SB_TOP:
si.nPos = si.nMin;
break;
case SB_BOTTOM:
si.nPos = si.nMax;
break;
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;
break;
case SB_ENDSCROLL:
break;
case SB_THUMBPOSITION:
break;
default:
break;
}
//SetScrollInfo时如果pos不在range内,windows会自动调整,
//但要再次GetScrollInfo才能得到调整过后的正确位置pos
si.fMask = SIF_POS;
SetScrollInfo(hwnd, SB_VERT, &si, TRUE);
GetScrollInfo(hwnd, SB_VERT, &si);
if (iVPos != si.nPos) //只有当滚动条位置改变时才执行以下操作
{
ScrollWindow(hwnd, 0, cyChar*(iVPos-si.nPos), NULL, NULL); //更新客户区
UpdateWindow(hwnd); //立即刷新,发送一个不进队的WM_PAINT消息
}
}
return 0;
case WM_PAINT:
{
// 获取滚动条信息
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_ALL;
GetScrollInfo(hwnd, SB_VERT, &si);
iVPos = si.nPos;
hdc = BeginPaint(hwnd, &ps);
iPaintBgn = max(si.nMin, iVPos + ps.rcPaint.top/cyChar);
iPaintEnd = min(si.nMax, iVPos + ps.rcPaint.bottom/cyChar);
for (int i = iPaintBgn; i <= iPaintEnd; i++)
{
int x, y;
y = cyChar*(i-iVPos);
TextOut(hdc, 0, y, sysmetrics[i].szLabel, lstrlen(sysmetrics[i].szLabel));
TextOut(hdc, 22*cxCaps, y, sysmetrics[i].szDesc, lstrlen(sysmetrics[i].szDesc));
SetTextAlign(hdc, TA_RIGHT | TA_TOP);
TCHAR szBuffer[10];
int iLength;
iLength = wsprintf(szBuffer, TEXT("%5d"), GetSystemMetrics(sysmetrics[i].iIndex));
TextOut(hdc, 22*cxCaps+40*cxChar, y, szBuffer, iLength);
SetTextAlign(hdc, TA_LEFT | TA_TOP);
}
EndPaint(hwnd, &ps);
}
return 0;