在使用Windows软件时,当窗口的大小比显示的内容小,无法显示整个界面时,软件右侧会出现一个可以滚动并用于显示剩余界面的条,就叫做滚动条。
滚动条可以用鼠标轮控制、用键盘控制和用鼠标拖动控制等,实现页与页的切换。
MFC中,窗口的滚动条是“自动”出现的,而不必自己添加。但前提是您要选用哪种CView的继承类。
您要选用CScollView,那么,在InitialUpdate函数中,就可以设置窗口的大小。
那么,运行的时候,如果窗口的尺寸小于当初的设置,那么滚动条就自动出现了。
建议:认真看看《Visual C++技术内幕》
第一步,在 CreateWindow 中添加 WS_VSCROLL 如下:
hwnd = CreateWindow(szClsName, TEXT("Scroll Test."), WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL)第二步,添加 WM_VSCROLL 响应:
case WM_VSCROLL:switch(LOWORD){wParam}
{
case SB_THUMBTRACK:
nVPos = HIWORD(wParam)
break
case SB_PAGEDOWN:
nVPos += nyClient / nyChar
break
case SB_PAGEUP:
nVPos -= nyClinet / nyChar
break
case SB_LINEDOWN:
nVPos += 1
break
case SB_LINEUP:
nVPos -= 1
break
}
nVPos = max(0, min(nVPos, NUMLINES - nyClinet / nyChar))
if(nVPos != GetScrollPos(hwnd, SB_VERT)) //滑块位置改变
{
SetScrollPos(hwnd, SB_VERT, nVPos, TRUE) //重设位置
InvalidateRect(hwnd, NULL, TRUE) //重绘显示区
}
第三步:添加绘制响应
case WM_PAINT:hdc = BeginPaint(hwnd, &ps)
for(i = 0 i < NUMLINES i++)
{
y = nyChar * (i - nVPos)
TextOut(hdc, 0, y, sysmetrics[i].szLabel, lstrlen(sysmetrics[i].szLabel))
TextOut(hdc, 22*nxCaps, y,
sysmetrics[i].szDesc, lstrlen(sysmetrics[i].szDesc))
SetTextAlign(hdc, TA_RIGHT | TA_TOP)
TextOut(hdc, 22*nxCaps + 40*nxChar, y,
szBuf, wsprintf(szBuf, TEXT("%d"), GetSystemMetrics(sysmetrics[i].Index)))
SetTextAlign(hdc, TA_LEFT | TA_TOP)
}
EndPaint(hwnd, &ps)
第四步,当窗口大小发生改变时重绘
case WM_SIZE:nyClient = HIWORD(lParam)
SetScrollRange(hwnd, SB_VERT, 0, NUMLINES - nyClient / nyChar, FALSE)
SetScrollPos(hwnd, SB_VERT, nVPos, TRUE)
if((NUMLINES - nVPos)*nyChar < nyClient && NUMLINES * nyChar > nyClient)
{
nVPos = NUMLINES - nyClient / nyChar
//PostMessage(hwnd, WM_VSCROLL, (nVPos << 16) & SB_THUMBTRACK, 0)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)