2012年(11)
分类: 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保存滚动条信息并做边界检查,更好的实现了滚动条的功能。