C++实例:SDK中控制滚动条
SDK的复杂,所谓复杂,就是在一个程序中,大大小小的事情都要程序员自己去做,Windows帮不上什么忙。我在想,如果用文本框之类的组件,就得一句一句写滚动条控件代码。那还不累死!
一、滚动条的细节
滚动条是众所周知的。滚动条由三部分组成:向上(左)移动按钮、滚动框和向下(右)移动按钮。第一次看关于“卷轴盒”的书,我几乎没看懂。
滚动条上有五种常见的操作:
1。单击上移(左)按钮向上(左)移动一行
2。单击向下(右)移动按钮向下(右)移动一行
3。点击滚动框顶部的/[/]向下翻页
5。拖动滚动框
。滚动条分为水平滚动条和垂直滚动条。在Windows中对应WM_HSCROLL和WM_VSCROLL,其中WM_HSCROLL是左右移动的消息,WM_VSCROLL是上下移动的消息。也就是说,响应滚动条的五个操作都是在这两条消息下进行的。例如,当用户操作垂直滚动条时,会向Windows发送一条WM_VSCROLL消息。至于在这个垂直滚动条上具体执行了什么操作,是上移还是下移一行,这就引出了一个“通知码”的概念。
这个“通知码”是怎么来的?发送WM_VSCROLL或WM_HSCROLL消息时,会附加wParam和lParam参数。lParam的作用不是很清楚。至于wParam参数,分为一个低位字和一个高位字,我对这两个概念的理解比较模糊。低位字组是一个数值,这个数值就是“通知码”。
“通知代码”由以SB(滚动条)开头的标识符(全部大写)定义。这些标识符很容易理解。比如SB_UP上移一行,SB_DOWN下移一行。大测试提示:现在,如果你想写一段代码,让滚动条向下移动一行作为响应,你该怎么写呢?看看下面的代码:
case WM_VSCROLL: // Message响应垂直滚动条操作
switch(loword(wparam))
casesb _ down://下移通知代码标识符
//程序执行代码[/
}
我很头疼。我曾经有一个清晰的想法,现在却莫名其妙地出现了一个洛伍德。书前面几章没讲,只说是个宏。当我使用GetSystemMetrics获取表单显示区域的大小时,我甚至使用了LOWORD宏,另外还有一个HIWORD宏。
case WM _ SIZE:
x = LOWORD(lParam);
y = hi word(lParam);
上面的代码用来获取表单显示区域的宽度和高度,但是使用的参数是lParam。看来要想把滚动条的其他知识点继续讲清楚,得先搞清楚这两个宏。另外还有两个参数,lParam和wParam,也是很常见的参数,你得搞清楚。
我们来看看两个参数,lParam和wParam。lParam是UINT数据类型(无符号INT),wParam是LONG数据类型。这两个参数分别包括一个16位低位字和一个16位高位字。按sizeof计算,一个UINT类型占用4个字节,一个LONG也占用4个字节。因为一个字节等于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 getscroll range(hwnd hwnd,intnbar,LP int lpm inpos,LP int LP max pos);//获取滚动条的滚动范围
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(low word(wparam))//wparam 16位低值,即“通知代码”
{
case sb _ line down://滚动条下移一位。
break;
case SB_LINEUP: //滚动条上移一行
iVscrollPos-= 1;
break;
case SB_PAGEDOWN: //滚动条向下翻一页
break;
case SB_PAGEUP: //滚动条向上翻一页
break;
case SB_: //将滚动框移动到顶部
iVscrollPos = 0;
break;
case SB_BOTTOM: //将滚动框移动到底部
分隔符;
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),
//滚动条的滚动条已经发生变化,现在需要设置重绘显示区域的大小。
/这里使用invalid rect将整个显示区域设置为无效,即重新绘制整个显示区域
invalid rect (hwnd,null,true);
}
嗯,第一种控制滚动条的方法就是这样。其实它用了两个函数,SetScrollPos和SetScrollRange,比较简单。书上说这是很老的方法了。在WIN32 API中,提供了两个操作滚动条的新函数:SetScrollInfo和GetScrollInfo函数。这两个函数可以完成以上函数的功能,还有两个特性:
第一个特性
可以修改滚动框大小,主要是滚动框的高度。
第二个特性
可以接受32位参数。在之前的方法中,从32位数据类型中提取16位低位字和16位高位字,以获得滚动条的各种信息,如滚动框位置、通知代码等。WIN32 API中的这两个新函数可以直接接受32位参数。
0条评论