WIN32创建滚动条

本文详细介绍了如何在Win32 API中创建和控制滚动条,包括设置滚动条的样式、范围和位置,处理滚动条消息,以及利用滚动条信息函数优化滚动条的显示效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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保存滚动条信息并做边界检查,更好的实现了滚动条的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qq_20312079

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

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

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

打赏作者

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

抵扣说明:

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

余额充值