js控制滚动条:SDK中控制滚动条



总算领略到SDK复杂性了所谓复杂性即在大大小小事情都得编写者亲力亲为Windows帮忙很少我在想要是使用文本框的类组件也得写滚动条控制代码那不累死!

、滚动条细节问题

滚动条这玩意儿众所周知了个滚动条由 3个部分组成:向上(左)移动按钮、卷动方块和向下(右)移动按钮刚看到书上说这个「卷动方块」时还差点儿没明白过来

滚动条上常用有 5种操作:

1.点击向上(左)移动按钮向上(左)移动

2.点击向下(右)移动按钮向下(右)移动

3.点击卷动方块上方空白处向上翻

4.点击卷动方块下方空白处向下翻

5.拖动卷动方块



滚动条分水平滚动条和垂直滚动条在Windows中就对应WM_HSCROLL和WM_VSCROLL两种消息其中WM_HSCROLL是供左右移动消息WM_VSCROLL是供上下移动消息也就是说响应滚动条 5种操作都是在这两个消息下执行比如当用户对垂直滚动条进行操作时就会给Windows发出个WM_VSCROLL消息至于对这个垂直滚动条具体执行是什么操作是向上移动行还是向下移动这就要引出个「通知码」概念

这个「通知码」是如何来呢?当发送WM_VSCROLL或WM_HSCROLL消息时会附带有wParam和lParam参数其中lParam作用没太弄明白至于wParam参数其分为个低位字和高位字我对这两个概念认识也比较模糊其中低字组是个数值而这个数值就是「通知码」

「通知码」是以SB(scroll bar)开头标识符定义(全是大写名称)这些标识符比较好理解比如SB_UP向上移动SB_DOWN是向下移动那现在如果我要写响应将滚动条向下移动代码该如何写呢?看看下面代码:

WM_VSCROLL: //响应垂直滚动条操作消息
switch(LOWORD(wParam))
{
SB_DOWN: //向下移动通知码标识符
//执行代码
;
}
头痛呀本来有着很清晰思路但现在无缘无故多了个LOWORD书中前面几章也没讲这东西只说了这是个宏在用GetMetrics获取窗体显示区域大小时到是用过LOWORD宏除此的外还有个HIWORD宏

WM_SIZE:
x = LOWORD(lParam);

y = HIWORD(lParam);
上面这段代码就是用来获取窗体显示区域宽度和高度不过使用参数是lParam看来要想明明白白继续滚动条其它知识点还得先弄清楚这两个宏另外还有lParam和wParam这两个参数也是很常见参数得弄清楚

先了解下lParam和wParam两个参数lParam是个UINT数据类型(unsigned )wParam是个LONG数据类型在这两个参数中分别包含个16位低位字和个16位高位字通过计算出个UINT类型占用4个字节个LONG也是占用4个字节1个字节等于8比特那4个字节数据类型就是32比特由此可知UINT和LONG是32位数据类型基础知识不牢又不得不恶补了知道了lParam和wParam是32位数据类型再来说说16位低位字和16位高位字

其中LOWORD是获取个16位低位字HIWORD是获取个16位高位字我估摸着就是将个32位数据类型分解成两个16位数据类型

通过wParam低位字和高位字就能获取滚动条「通知码」和卷动方块位置

wParam低位值 wParam高位值

SB_THUMBTRACK 卷动方块时目前位置

SB_THUMBPOSITION 使用者释放鼠标键后卷动方块最终位置

其它卷动列操作 忽略

这样来就明白了上面switch语句作用

2、控制滚动条操作思路方法

SetScrollRange (hwnd, iBar, iMin, iMax, bRedraw) ; //设置滚动条卷动方块滚动范围

SetScrollPos (hwnd, iBar, iPos, bRedraw) ; //设置卷动方块位置

BOOL GetScrollRange(HWND hWnd, nBar, LPINT lpMinPos, LPINT lpMaxPos); //获取滚动条卷动广场滚动范围

GetScrollPos(HWND hWnd, nBar); //获取卷动方块位置

下面给个简单举例代码:

iVscrollPos; //滚动条卷动方块位置

SetScrollRange (hwnd, SB_VERT, 0, 20, FALSE) ; //滚动条最大范围为20

SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE) ; //化滚动条位置

WM_VSCROLL: //垂直滚动条操作消息
switch (LOWORD (wParam)) //wParam 16位低位值即「通知码」
{
SB_LINEDOWN: //滚动条向下移动
iVscrollPos 1;
;
SB_LINEUP: //滚动条向上移动
iVscrollPos -= 1;
;
SB_PAGEDOWN: //滚动条向下翻
;
SB_PAGEUP: //滚动条向上翻
;
SB_TOP: //将卷动方块移置顶部
iVscrollPos = 0;
;
SB_BOTTOM: //将卷动方块移置底部
;
SB_THUMBPOSITION: //拖动卷动方块释放鼠标后
;
SB_THUMBTRACK: //托运卷动方块
;
SB_ENDSROLL: //完成滚动操作?
;
}
上面代码只是修改了iVscrollPos要想让滚动条发生视觉改变还得使用SetScrollPos来重新定位卷动方块位置

//用min和max宏来调控iVscrollPos,确保iVscrollPos值在SetScrollRange设置范围的内
iVscrollPos = max (0, min (iVscrollPos, NUMLINES - 1)) ;

(iVscrollPos != GetScrollPos (hwnd, SB_VERT)) //如果卷动方块有变动

{

//SB_VERT表示设置垂直滚动条卷动方块位置用SB_HORZ标识符是设置水平滚动条卷动方块位置
SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE) ;

//滚动条卷动方块已经作了改变现在得设置重绘显示区域大小了
//在这里是使用InvalidateRect来设置整个显示区域为无效即重绘整个显示区域
InvalidateRect (hwnd, NULL, TRUE) ;



}
好了这第种控制滚动条思路方法就这么着了其实就用到了SetScrollPos和SetScrollRange两个相对比较简单书中说这是种很古老思路方法了在WIN32 API中新提供了两个操作滚动条:SetScrollInfo和GetScrollInfo这两个可以完成上面几个功能而且还多了两个特性:

个特性

可以修改卷动方块大小主要是修改卷动方块高度

第 2个特性

可以接受32位参数在前面思路方法中是在个32位数据类型中提取个16位低位字和个16位高位字来获取滚动条各种信息比如卷动方块位置通知码等而使用WIN32 API中这两个新可以直接接受32位参数

3、控制滚动条思路方法 2

……

以下约有 2千字左右内容因博客保存文章失败导致内容丢失也懒得再打了以后需要用到这方面应用时再补上
Tags:  开机滚动条 div滚动条 滚动条 js控制滚动条

延伸阅读

最新评论

发表评论