三九宝宝网宝宝百科宝宝知识

SDK中控制滚动条

11月11日 编辑 39baobao.com

[你对孩子的控制是怎样得手的]“什么?控制孩子?我那是教育孩子好不好?!我很负责任的!”真的是这样吗?控制孩子VS教育孩子参加幼教界某研讨,关于常规培养。一个幼儿老师提问:小朋友洗手时,肥皂在手里到底应该转...+阅读

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

一、滚动条细节问题

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

滚动条上常用的有五种操作:

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

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

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

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

5.拖动卷动方块

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

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

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

case WM_VSCROLL: 响应垂直滚动条操作的消息

switch(LOWORD(wParam))

{

case SB_DOWN: 向下移动通知码标识符

程序执行代码

break;

}

头痛呀,本来有着很清晰的思路,但现在无缘无故多了个LOWORD,书中的前面几章也没讲这东西,只说了这是一个宏,在用GetSystemMetrics获取窗体显示区域大小时,到是用过LOWORD宏,除此之外还有一个HIWORD宏。

case WM_SIZE:

x = LOWORD(lParam);

y = HIWORD(lParam);

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

先了解一下lParam和wParam两个参数,lParam是一个UINT数据类型(unsigned int),wParam是一个LONG数据类型。在这两个参数中分别包含一个16位低位字和一个16位高位字。通过sizeof计算出,一个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语句的作用。

二、控制滚动条操作方法

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

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

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

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

下面给个简单的示例代码:

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

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

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

case WM_VSCROLL: 垂直滚动条操作消息

switch (LOWORD (wParam)) wParam 16位低位值,即「通知码」

{

case SB_LINEDOWN: 滚动条向下移动一行

iVscrollPos += 1;

break;

case SB_LINEUP: 滚动条向上移动一行

iVscrollPos -= 1;

break;

case SB_PAGEDOWN: 滚动条向下翻一页

break;

case SB_PAGEUP: 滚动条向上翻一页

break;

case SB_TOP: 将卷动方块移置顶部

iVscrollPos = 0;

break;

case SB_BOTTOM: 将卷动方块移置底部

break;

case SB_THUMBPOSITION: 拖动卷动方块释放鼠标后

break;

case SB_THUMBTRACK: 托运卷动方块

break;

case SB_ENDSROLL: 完成滚动操作?

break;

}

上面的代码只是修改了iVscrollPos的值,要想让滚动条发生视觉改变,还得使用SetScrollPos来重新定位卷动方块的位置。

用min和max宏来调控iVscrollPos,确保iVscrollPos的值在SetScrollRange设置的范围之内

iVscrollPos = max (0, min (iVscrollPos, NUMLINES - 1)) ;

if (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函数。这两个函数可以完成上面几个函数的功能,而且还多了两个特性:

第一个特性

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

第二个特性

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

以下为关联文档:

严格的控制会使孩子感到缺少爱吗“严格的控制会使孩子感到缺少爱吗?”这是我在很久一段时间里,心里存在的疑问。尤其是要“尊重孩子”等观点甚嚣尘上。因为要尊重孩子,所以做什么事情的时候,都会对问孩子“好不...

控制气氛的谈判技巧1、积极主动地创造和谐的谈判气氛谈判气氛是在双方开始会谈的一瞬间就形成了,并影响以后会谈气氛的发展,因此,在谈判初始段形成的气氛十分重要,双方都应重视,力图有一个良好的开...

如果孩子能控制情绪,那就怪了前一天,收到一个妈妈的留言,已经有很多的父母提起过这个问题。“鱼爸,我家也是个儿子,现在两岁快三个月,一直都比较听话,但是近来我发现他好像不太会控制自己的情绪,特别是自己高兴...

如何控制自己的说话语气我们是不是看到过这样的事情发生在我们周围:本来已经板上钉钉的一件事,却被一个没有眼力见儿的愣头青搅黄了?走进一家高档时装的专卖店,哪怕你根本忘了带钱包,如果你从容地、甚...

孩子控制不了自己的情绪怎么办孩子控制不了自己的情绪怎么办?如何教孩子学会情绪管理?我们如何处理自己的情绪,与小时候父母给我们怎么样的教育方式大有关联。如何更有效地引导孩子处理生气、愤怒、自卑、害...

控制性的妈妈带出强悍的孩子每天早上,小航会高高兴兴的进教室,大大方方的叫老师好,然后搬起椅子走向自己的位子,在活动中,她也愿意和小朋友交朋友了,但谦让合作意识还是很弱,总是很霸道,所以引起小朋友都知道她...

儿童哮喘只能控制哮喘,是慢性疾病,有轻,中,重三种。轻度哮喘的痊愈可能很小只能控制,在生活中努力避免孩子过敏等。 如今,孩子都是父母的掌中宝、心头肉,孩子半分的小毛病就能引起父母十二分的恐慌...

《烟草控制框架公约》世界第一个旨在限制全球烟草和烟草制品的公约《烟草控制框架公约》今天在最早批准该条约的40个国家生效,这是世界卫生组织第一个具有国际法约束力的全球性公约,也是针对烟草的...

学做一个会控制情绪的人前言:想要孩子有一个好的脾气,家长们首先就要做一个会控制情绪的人,若是家长在孩子的面前都做不好,那么又如何来要求孩子呢?以下就让我们结合实例来详细的了解下,父母对孩子情绪方...

推荐阅读
图文推荐