找回密码
 加入
搜索
查看: 8280|回复: 3

[交流] 关于计算带滚动条控件(GUIScrollBars)的GUI窗体中的控件实际高度位置的问题

[复制链接]
发表于 2011-7-7 15:48:47 | 显示全部楼层 |阅读模式
本帖最后由 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() [获取指定控件的屏幕坐标及大小]”是有区别的。
 楼主| 发表于 2011-7-8 11:11:26 | 显示全部楼层
具体UDF函数,请参照
http://www.autoitx.com/thread-25955-1-1.html
发表于 2011-7-13 19:40:41 | 显示全部楼层
谢谢.学习学习
发表于 2011-11-19 00:59:42 | 显示全部楼层
啥都不说,仅仅单纯的顶一下而已广告联盟
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-17 04:58 , Processed in 0.070767 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表