vc++如何为窗口添加滚动条?

vc++如何为窗口添加滚动条?,第1张

第一步,在 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)

}

MFC中,窗口的滚动条是“自动”出现的,而不必自己添加。

但前提是您要选用哪种CView的继承类。

您要选用CScollView,那么,在InitialUpdate函数中,就可以设置窗口的大小。

那么,运行的时候,如果窗口的尺寸小于当初的设置,那么滚动条就自动出现了。

建议:认真看看《Visual C++技术内幕》

用ShowScrollBar可以显示滚动条。

SetScrollRange设置滚动范围。

响应消息WM_VSCROLL和WM_HSCROLL。

可能需要移动控件的位置,再重绘。

自己处理有点麻烦,建议改用CFormView。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7921451.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存