找回密码
 加入
搜索
查看: 1561|回复: 2

滚动条 最大滚动位置 这个参数具体是什么意思,跟屏幕坐标如何转换?

  [复制链接]
发表于 2017-3-1 01:07:42 | 显示全部楼层 |阅读模式
本帖最后由 fenhanxue 于 2017-3-1 01:08 编辑

_GUIScrollBars_SetScrollInfoMax
设置最大滚动位置

#Include <GuiScrollBars.au3>
_GUIScrollBars_SetScrollInfoMax($hWnd, $fnBar, $nMax)

$hWnd 窗口句柄
$fnBar 指定滚动控件的类型. 参数可以是以下值之一:
       $SB_CTL - 设置滚动控件参数. $hWnd 必须是滚动控件的窗口句柄
       $SB_HORZ - 设置窗口的标准水平滚动控件的参数.
       $SB_VERT - 设置窗口标准垂直滚动控件的参数.
$nMax 最大滚动位置


其中,第三个参数,$nMax 最大滚动位置    具体是什么意思,跟控件的坐标(位置?)好像不是1:1对应的关系,两者之间应该如何进行数字转换?
#Include <GuiScrollBars.au3>
#include <ScrollBarConstants.au3>
#Include <Excel.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

HotKeySet('q','quit')
HotKeySet('t','_test')
GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")


$Form1 = GUICreate("测试", 300, 300)
GUISetState(@SW_SHOW)


        
$Form2 = GUICreate('',200,200,50,50, $WS_CHILD, $WS_EX_CLIENTEDGE, $Form1)
_GUIScrollBars_Init($Form2)
_GUIScrollBars_SetScrollInfoMax($Form2, $SB_HORZ, 0)
GUISetState(@SW_SHOW,$Form2)


_GUIScrollBars_SetScrollInfoMax($Form2, $SB_VERT, 0)

#cs 研究这个函数的第三个参数
        _GUIScrollBars_SetScrollInfoMax($Form2, $SB_VERT, 0)
#ce 研究这个函数的第三个参数


While 1
        1
WEnd


Func quit()
        Exit
EndFunc

Func _test()
        ;随机创建  整数个Button
        
        $r = Random(1,10,1);
        Local $bt[$r]
        
        ;假设每个按钮的高度为20
        $bt_heigh = 60
        
        
        
        
        
        ;问题:如何确定这个参数?使得进度条能够刚好符合创建的button个数
                        ;这个参数似乎与控件坐标不是1:1对应的,看帮助文档也没有具体的说明,很迷惑                            $what_should_i_send_here
        Local $what_should_i_send_here = 60 * $r - 200         ;这样写的结果似乎是错误的
        
        
        
        
        MsgBox(0,'随机创建button个数为:',$r)
        
        
        _GUIScrollBars_SetScrollInfoMax($Form2,   $SB_VERT,    $what_should_i_send_here    )
        GUISwitch($Form2)
        For $i = 0 To $r-1
                GUICtrlCreateButton(($i+1),1,  $i * $bt_heigh , 100,$bt_heigh )
        Next
        
        

        
EndFunc

        

Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
    #forceref $Msg, $wParam, $lParam
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
    Local $index = -1, $yChar, $yPos
    Local $Min, $Max, $Page, $Pos, $TrackPos

    For $x = 0 To UBound($aSB_WindowInfo) - 1
        If $aSB_WindowInfo[$x][0] = $hWnd Then
            $index = $x
            $yChar = $aSB_WindowInfo[$index][3]
            ExitLoop
        EndIf
    Next
    If $index = -1 Then Return 0


    ; Get all the vertial scroll bar information
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    ; Save the position for comparison later on
    $yPos = DllStructGetData($tSCROLLINFO, "nPos")
    $Pos = $yPos
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")

    Switch $nScrollCode
        Case $SB_TOP ; user clicked the HOME keyboard key
            DllStructSetData($tSCROLLINFO, "nPos", $Min)

        Case $SB_BOTTOM ; user clicked the END keyboard key
            DllStructSetData($tSCROLLINFO, "nPos", $Max)

        Case $SB_LINEUP ; user clicked the top arrow
            DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)

        Case $SB_LINEDOWN ; user clicked the bottom arrow
            DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)

        Case $SB_PAGEUP ; user clicked the scroll bar shaft above the scroll box
            DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)

        Case $SB_PAGEDOWN ; user clicked the scroll bar shaft below the scroll box
            DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)

        Case $SB_THUMBTRACK ; user dragged the scroll box
            DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    EndSwitch

;~    // Set the position and then retrieve it.  Due to adjustments
;~    //   by Windows it may not be the same as the value set.

    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    ;// If the position has changed, scroll the window and update it
    $Pos = DllStructGetData($tSCROLLINFO, "nPos")

    If ($Pos <> $yPos) Then
        _GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))
        $yPos = $Pos
    EndIf

    Return $GUI_RUNDEFMSG

EndFunc   ;==>WM_VSCROLL
 楼主| 发表于 2017-3-1 22:25:31 | 显示全部楼层
本帖最后由 fenhanxue 于 2017-3-1 22:27 编辑

一直溯源的线索:

1.      _GUIScrollBars_SetScrollInfoMax  来源于   GuiScrollBars.au3

2.     根据GuiScrollBars.au3  发现  _GUIScrollBars_SetScrollInfoMax  的第三个参数 为   _GUIScrollBars_SetScrollRange($hWnd, $fnBar, $aRange[0], $nMax)   的第四个参数

3.     继续在 GuiScrollBars.au3  中追踪 _GUIScrollBars_SetScrollRange  的第四个参数,发现是   
       DllCall("user32.dll", "bool", "SetScrollRange", "hwnd", $hWnd, "int", $nBar, "int", $nMinPos, "int", $nMaxPos, "bool", True)

       即这个参数为  user32.dll  里面的  SetScrollRange

4.    继续追踪 user32.dll  里面的  SetScrollRange   ,msdn的解释为:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb787599(v=vs.85).aspx

5.至此,我找不到继续搜索的方向了,并且还是不理解如何确定这个参数跟实际坐标的对换比例
发表于 2023-8-7 10:34:47 | 显示全部楼层
我也看不明白。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-27 06:27 , Processed in 0.078548 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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