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)

}

winform panel设置AutoScroll为True,当panel内控件超出panel范围时,就会显示滚动条,如下所示:

AutoScroll 属性说明

获取或设置一个值,该值指示容器是否允许用户滚动到任何放置在其可见边界之外的控件。

public virtual bool AutoScroll { getset}

属性值

Type: System.Boolean

如果容器允许自动滚动,则为 true;否则为 false。默认值为 false。

备注

为 true 时,此属性允许容器有一个大于其可见边界的虚拟大小。

当前 Windows 窗体中有一个限制,当启用了 RightToLeft 并且将 AutoScroll 设置为 Yes 时,该限制会使派生自 ScrollableControl 的所有类无法正确 *** 作。例如,假设在窗体上放置了一个控件(如 Panel)或从 Panel 派生的容器类(如 FlowLayoutPanel 或 TableLayoutPanel)。如果将容器的 AutoScroll 设置为 Yes,然后将容器内部的一个或多个控件的 Anchor 属性设置为 Right,则不会显示任何滚动条。从 ScrollableControl 派生的类的行为与 AutoScroll 设置为 No 时的行为类似。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存