fenhanxue 发表于 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] = $hWnd Then
            $index = $x
            $yChar = $aSB_WindowInfo[$index]
            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

fenhanxue 发表于 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, $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.至此,我找不到继续搜索的方向了,并且还是不理解如何确定这个参数跟实际坐标的对换比例

wllx 发表于 2023-8-7 10:34:47

我也看不明白。
页: [1]
查看完整版本: 滚动条 最大滚动位置 这个参数具体是什么意思,跟屏幕坐标如何转换?