滚动条(1)

2017-11-23 07:51:59来源:CSDN作者:weixin_37736913人点击

分享

1:
滚动条的创建:
CreateWindow的第三个参数增添类型:

WM_VSCROLL(V+scroll)垂直  WM_HSCROLL(H+scroll)水平所以一般样式为 WS_OVERLAPPED  WM_(H|V)SCROLL(WS_OVERLAPPED) :产生一个层叠的窗口,一个层叠的窗口有一个标题栏和一个边框

2:
在窗口处理程序中,收到创建窗口信息WM_CREATE时设置
重置滚动条范围和滚动条位置。

 SetScrollRange(hwnd,iBar(滚动条类型),iMin,iMax,bRedraw)1】为什么说是重画呢,因为内定情况下,内定范围是0~1002】可能有小伙伴不知道范围意味着什么。后面会有这么一句:iVscrolPos=max0min(iVscrollPos,SB_VERT));就是一次的操作不允许超过你设置的范围,如果你设置的很小,比如(0,1)那么你在滚动条操作一次,滚动条就滚动到底部了(一般SB_PAGEUP|SB_PAGEDOWN的一次操作为iVscrolPos +|-=1;)可以理解为,你做了一次操作,然而只上拉或下拉只是一行。那滚动条的作用就大大减低了。3】看参数类型名称可以知道参数相对应的是(句柄,类型,最小值,最大值,是否重画(bool redraw))最后一个参数bRedRaw: 在呼叫了SetScroll后,呼叫了影响了滚动条位置的其他函数,则应该将bRedraw设定为FALSE以避免过多的重画

滚动条的位置重置也是类似,只不过参数稍有不同
SetScroll(hwnd,iBar,iVscrollPos,TRUE);

3
关于滚动条消息诠释用下图表示:
这里写图片描述

4 滚动条信息处理之后(eg:SB_PAGEUP…),要记得增条两句如下:
iVscrollPos=max(0,min(iVscrollPos,NUMLINES-1));
上面已经阐释;
if(iVscrollPos!=GetScrollPos(hwnd,iBar))
{
SetScrollPos(hwnd,iBar,iVscrollPos,TRUE);
InvalidateRect(hwnd,NULL,TRUE);

}
如果滚动条位置发生变化,则重置滚动条位置,要不然滚动条拖动后,又会弹回去。但显示器内容是不会‘弹’回去的哦。毕竟显示器内容与重画才直接相关,与iVscrollPos大小相关。这里引出另外一个话题,为什么有时候滚动条拉动后,显示内容没有变化,这是直接和重画相关的。
与y的计算公式cyChar*(i-iVscrollPos),毕竟滑块影响的就是iVscrollPos的值。

至于InvalidateRect(hwnd,NULL,TRUE),使窗口显示区域标记为无效。
产生重绘信息WM_PAINT,由于windows将WM_PAINT视为低优先级消息。如果程序在完成其他消息时,可能会导致产生空白显示的情况。一般小程序是不会的,其他动作不会很多。但以防这种情况出现,可以在InvalidataRect(hwnd,NULL,TRUE)函数后添加函数 UpdateWindow(hwnd)立即更新无效区域。

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台