本帖最后由 daiyu116 于 2011-7-15 10:20 编辑
发本帖的原因,请参照帖子 http://www.autoitx.com/thread-25900-1-1.html。
本文实验环境:win xp 32位日文版、server2008 R2日文版、server2003 32位日文版、win 7 32位中文版、server2008 R2中文版、server2003 32位中文版。
目的
最想得到滚动条在高度0时,被选中控件在GUI窗体的实际高度位置,而不是ControlGetPos得到的位置。
使用的函数说明
;1、为该GUI上的滚动条设置垂直方向的起始位置 Sets the minimum and maximum scroll box positions for the specified scroll bar
;本例设置为滚动条范围为1-40行
_GUIScrollBars_SetScrollRange(GUI句柄,$SB_VERT,1,40)
;2、为该GUI上的滚动条设置翻页大小,即每点击向下或向上按钮滚动几行。Sets the page size
;本例设置为每点击向下或向上按钮滚动1行
_GUIScrollBars_SetScrollInfoPage(GUI句柄,$SB_VERT, 1)
;设置以上两项的目的是为了方便设计和计算
;3、得到该GUI上的滚动条当前高度位置(因为向上向下的箭头还要占1个单位,所以后面要减去1,所以减去1之后的值也就相当于代表了滚动条滚动了几次)
_GUIScrollBars_GetScrollPos(GUI句柄,$SB_VERT)
;4、得到被选中的Ctrl控件的坐标.必须注意可能返回的值不一定是当时创建的值
$CrtlPos=ControlGetPos(GUI句柄,"",Ctrl控件句柄)
;5、创建控件
GUICtrlCreateCheckbox("", 5,5+25*$addtimes, 15,20)
; 其中$addtimes为点击增加控件按钮的次数,这样是为了控件的间隔、大小统一,方便以后的计算。注意其中的数字25,与下面的引申的关系。
实验过程
; 创建多行控件
; 选中第一行其中某一个控件,不滚动滚动条, 利用MsgBox得到被选中控件的高度位置
; 滚动一次滚动条,利用MsgBox得到被选中控件的高度位置
; 滚动两次滚动条,利用MsgBox得到被选中控件的高度位置
; 滚动三次滚动条,利用MsgBox得到被选中控件的高度位置
; 滚动四次滚动条,利用MsgBox得到被选中控件的高度位置
; 滚动五次滚动条,利用MsgBox得到被选中控件的高度位置
; ...
; 选中第二行其中某一个控件,不滚动滚动条, 利用MsgBox得到被选中控件的高度位置
; 滚动一次滚动条,利用MsgBox得到被选中控件的高度位置
; 滚动两次滚动条,利用MsgBox得到被选中控件的高度位置
; 滚动三次滚动条,利用MsgBox得到被选中控件的高度位置
; 滚动四次滚动条,利用MsgBox得到被选中控件的高度位置
; 滚动五次滚动条,利用MsgBox得到被选中控件的高度位置
; ...
; 选中第三行其中某一个控件,不滚动滚动条, 利用MsgBox得到被选中控件的高度位置
; 滚动一次滚动条,利用MsgBox得到被选中控件的高度位置
; 滚动两次滚动条,利用MsgBox得到被选中控件的高度位置
; 滚动三次滚动条,利用MsgBox得到被选中控件的高度位置
; 滚动四次滚动条,利用MsgBox得到被选中控件的高度位置
; 滚动五次滚动条,利用MsgBox得到被选中控件的高度位置
; ...
; 对多行多次取样,以避免数据不准确
; 在这里,仅以第一行和第二行取样6次做例子
; 在win 7 32位中文版、server2008 R2中文版、server2003 32位中文版 得到的数据如下:
; -----------------------------------------------------------------------------------------------------------------------------
; 滚动条上端位置 滚动条滚动的次数 第一行选中的控件的上端位置 第二行选中的控件的上端位置
; _GUIScrollBars_GetScrollPos _GUIScrollBars_GetScrollPos-1 ControlGetPos ControlGetPos
; 1 0 11 36
; 2 1 -5 20
; 3 2 -21 4
; 4 3 -37 -12
; 5 4 -53 -28
; 6 5 -69 -44
; 注意不论滚动一次,两行之间相邻控件的间隔始终是25。
; 每滚动一次,同一控件的间隔就变动16,当然,这里可能只针对本例。在其他情况下,该值是有可能变化的。
;-----------------------------------------------------------------------------------------------------------------------------
; 在win xp 32位日文版、server2008 R2日文版、server2003 32位日文版 得到的数据如下:
; -----------------------------------------------------------------------------------------------------------------------------
; 滚动条上端位置 滚动条滚动的次数 第一行选中的控件的上端位置 第二行选中的控件的上端位置
; _GUIScrollBars_GetScrollPos _GUIScrollBars_GetScrollPos-1 ControlGetPos ControlGetPos
; 1 0 11 36
; 2 1 -9 16
; 3 2 -29 -4
; 4 3 -49 -24
; 5 4 -69 -44
; 6 5 -89 -64
; 注意不论滚动一次,两行之间相邻控件的间隔始终是25。
; 每滚动一次,同一控件的间隔就变动20,当然,这里可能只针对本例。在其他情况下,该值是有可能变化的。
; -----------------------------------------------------------------------------------------------------------------------------
结论
控件的实际位置与 1操作系统语言(不能非常确定,还需要继续在其他操作系统语言上测试)、2控件相对位置、3滚动条当前高度位置有直接关联。
由上面实验数据得到该控件实际位置公式如下:
If @OSLang="0804" Then
$ctrltruePOS=$CrtlPos[1]+16*(_GUIScrollBars_GetScrollPos(GUI句柄,$SB_VERT)-1)
ElseIf @OSLang="0411" Then
$ctrltruePOS=$CrtlPos[1]+20*(_GUIScrollBars_GetScrollPos(GUI句柄,$SB_VERT)-1)
EndIf
引申
然后就可以得到当时点击增加控件按钮的次数(使用的函数说明 5、创建控件 那一条)
$j=Int(($ctrltruePOS-5)/25)
注意
本文与afan版主的“_ControlGetPos() [获取指定控件的屏幕坐标及大小]”是有区别的。 |