WIN32创建滚动条

WIN32创建滚动条

分类: C/C++

2012-10-24 21:10:06

 

1.在win32 API创建的窗口中显示滚动条

     在CreateWindow的第三个参数中包含窗口风格(WS)标识符WS_VSCROLL和WS_HSCROLL即可。

2.滚动条的范围和位置

     每个滚动条都有一个相应的范围,默认是从0~100(离散的整数值)。

     ①改变范围: 

     SetScorllRange(hwnd, iBar, iMin, iMax, bRedraw)

     参数:

     iBar为SB_VERT或者SB_HORZ

     iMin为范围最小值

     iMax为范围最大值

     bRedraw:如果想要windows重画滚动条,则设置为TRUE,如果调用SetScorllRange后,调用其他影响滚动条位置的函数,则置为FALSE,避免过多重画

     ②设置位置:

     SetScrollPos(hwnd, iBar, iPos, bRedraw)

     参数:

     iBar为SB_VERT或者SB_HORZ

     iPos为滚动条位置

     bRedraw:是否需要重画

3.滚动条消息

    与所有消息一样,WM_VSSCROLL和WM_HSCROLL也带有wParam和lParam参数,其中lParam参数只用于作为子窗口而创建的滚动条。

    wParam分为一个高位字和低位字,低位是鼠标对滚动条进行的操作,是一个数值,这个数值被看作一个“通知码”,以SB_开头。wParam的高位在SB_THUMBTRACK时,表示滚动条当前位置,SB_THUMBPOSITION时,表示用户释放鼠标后滚动条最终位置。

    我们可以使用SetScrollPos和SetScrollRange来处理滚动条消息,但是处理完后,并不刷新客户区,调用InvalidateRect使客户区失效,导致windows发送一个WM_PAINT消息放入消息队列。但windows把WM_PAINT当成低优先级消息,如果系统有许多动作正在发生,您可能要等一段时间。如果想立即刷新无效区域,可以在调用InvalidateRect之后,调用UpdateWindow(hwnd)。

4.WM_SIZE消息

    我们可以使用GetClientRect来获得客户区域的大小,但是这样是没有效率的。

    在窗口发生改变的时候,windows给窗口过程发送一个WM_SIZE消息,在在lParam的低位参数中包含了客户区的宽度,高字节包含了客户区的高度,要获得这些尺寸,我们再窗口过程中定义两个静态变量:

    static int cxClient,cyClient;

在WM_SIZE消息的处理中获得这两个尺寸

    cxClient =LOWORD(lParam);

    cyClient =HIWORD(lParam);

    WM_SIZE后边必然跟着一个WM_PAINT消息,因为我们定义窗口类的时候制定了类风格CS_HREDRAW|CS_VREDRAW

5.滚动条信息函数

    用SetScrollPos和SetScrollRange实现的滚动条中滚动框大小事固定的,但是我们使用的滚动框大小事与文档大小成比例的。

    滚动框大小/滚动长度  ≈ 页面大小/范围 ≈ 显示的文档数量/文档的总大小,可以使用SetScrollInfo来设置页面的大小,从而设置滚动框的大小。

    SetScrollInfo(hwnd, iBar, &si, bRedraw);

    GetScrollInfo(hwnd, iBar, &si);

    两个参数的第三个参数是滚动条的信息结构体SCROLLINFO

    在设置完si后,调用ScrollWindow滚动客户区信息,而不是重画它。

    滚动条信息函数,依靠windows保存滚动条信息并做边界检查,更好的实现了滚动条的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要给窗口添加滚动条,可以通过以下步骤实现: 1. 在创建窗口时,将窗口样式中的 WS_VSCROLL 和/或 WS_HSCROLL 标志设置为需要滚动的方向。例如: ```c++ CreateWindowEx(0, L"MyWindowClass", L"My Window", WS_OVERLAPPEDWINDOW | WS_VSCROLL, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, NULL, NULL, hInstance, NULL); ``` 2. 在窗口过程中,处理 WM_VSCROLL 和/或 WM_HSCROLL 消息,根据滚动条的当前位置来更新窗口内容的显示。例如: ```c++ case WM_VSCROLL: { int nPos = GetScrollPos(hwnd, SB_VERT); switch (LOWORD(wParam)) { case SB_TOP: nPos = 0; break; case SB_BOTTOM: nPos = 100; break; case SB_LINEUP: nPos--; break; case SB_LINEDOWN: nPos++; break; case SB_PAGEUP: nPos -= 10; break; case SB_PAGEDOWN: nPos += 10; break; case SB_THUMBTRACK: nPos = HIWORD(wParam); break; } nPos = max(0, min(nPos, 100)); SetScrollPos(hwnd, SB_VERT, nPos, TRUE); UpdateWindow(hwnd); break; } ``` 其中,GetScrollPos 函数可以获取滚动条的当前位置,SetScrollPos 函数可以设置滚动条位置。在以上示例中,滚动条位置被限制在 0 到 100 之间。 3. 在需要更新窗口内容的时候,调用 InvalidateRect 函数来触发窗口进行重绘,以便显示更新后的内容。例如: ```c++ InvalidateRect(hwnd, NULL, TRUE); ``` 以上是添加垂直滚动条的示例,添加水平滚动条的方法类似,只需要将窗口样式中的 WS_HSCROLL 标志设置为需要滚动的方向,处理 WM_HSCROLL 消息,并使用 SetScrollPos 函数来设置水平滚动条位置即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_20312079

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值