Как то так:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIScrollBars.au3>
#include <ScrollBarConstants.au3>
#include 'GUIScrollbars_Size.au3'
Global $iGUI_W = 600
Global $iGUI_H = 600
Global $sImages_Path = @ScriptDir & '\Images'
$hGUI = GUICreate('Example', $iGUI_W, $iGUI_H)
$aImages = _Images_Load(200, 200)
GUIRegisterMsg($WM_VSCROLL, 'WM_VSCROLL')
GUISetState()
While 1
$iMsg = GUIGetMsg()
Switch $iMsg
Case $GUI_EVENT_CLOSE
Exit
Case $aImages[1][0] To $aImages[$aImages[0][0]][0]
For $i = 1 To $aImages[0][0]
If $iMsg = $aImages[$i][0] Then
MsgBox(0, @ScriptName, 'Image ckicked:' & @CRLF & $aImages[$i][1], 0, $hGUI)
ExitLoop
EndIf
Next
EndSwitch
WEnd
Func _Images_Load($iWidth, $iHeight)
If $iWidth > $iGUI_W Then
Return 0
EndIf
Local $hFind = FileFindFirstFile($sImages_Path & '\*.jpg')
Local $iTop = 0, $iLeft = 0
Local $aImages[1][2], $aSize
While 1
$sFile = FileFindNextFile($hFind)
If @error Then ExitLoop
$aImages[0][0] += 1
ReDim $aImages[$aImages[0][0] + 1][2]
$aImages[$aImages[0][0]][0] = GUICtrlCreatePic($sImages_Path & '\' & $sFile, $iLeft, $iTop, $iWidth, $iHeight)
$aImages[$aImages[0][0]][1] = $sImages_Path & '\' & $sFile
$iLeft += $iWidth
If $iLeft + $iWidth > $iGUI_W Then
$iLeft = 0
$iTop += $iHeight
EndIf
WEnd
If $iTop + $iHeight > $iGUI_H Then
_GUIScrollBars_Init($hGUI)
_GUIScrollBars_ShowScrollBar($hGUI, $SB_VERT, True)
_GUIScrollBars_ShowScrollBar($hGUI, $SB_HORZ, False)
$aSize = _GUIScrollbars_Size(0, $iTop + ($iHeight / 2), $iGUI_W, $iGUI_H)
If Not @error Then
_GUIScrollBars_SetScrollInfoPage($hGUI, $SB_VERT, $aSize[2])
_GUIScrollBars_SetScrollInfoMax($hGUI, $SB_VERT, $aSize[3])
EndIf
EndIf
FileClose($hFind)
Return $aImages
EndFunc
Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
#forceref $Msg, $wParam, $lParam
Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
Local $iIndex = -1, $yChar, $yPos
Local $Min, $Max, $Page, $Pos, $TrackPos
For $x = 0 To UBound($aSB_WindowInfo) - 1
If $aSB_WindowInfo[$x][0] = $hWnd Then
$iIndex = $x
$yChar = $aSB_WindowInfo[$iIndex][3]
ExitLoop
EndIf
Next
If $iIndex = -1 Then Return 0
Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
$Min = DllStructGetData($tSCROLLINFO, 'nMin')
$Max = DllStructGetData($tSCROLLINFO, 'nMax')
$Page = DllStructGetData($tSCROLLINFO, 'nPage')
$yPos = DllStructGetData($tSCROLLINFO, 'nPos')
$Pos = $yPos
$TrackPos = DllStructGetData($tSCROLLINFO, 'nTrackPos')
Switch $nScrollCode
Case $SB_TOP
DllStructSetData($tSCROLLINFO, 'nPos', $Min)
Case $SB_BOTTOM
DllStructSetData($tSCROLLINFO, 'nPos', $Max)
Case $SB_LINEUP
DllStructSetData($tSCROLLINFO, 'nPos', $Pos - 1)
Case $SB_LINEDOWN
DllStructSetData($tSCROLLINFO, 'nPos', $Pos + 1)
Case $SB_PAGEUP
DllStructSetData($tSCROLLINFO, 'nPos', $Pos - $Page)
Case $SB_PAGEDOWN
DllStructSetData($tSCROLLINFO, 'nPos', $Pos + $Page)
Case $SB_THUMBTRACK
DllStructSetData($tSCROLLINFO, 'nPos', $TrackPos)
EndSwitch
DllStructSetData($tSCROLLINFO, 'fMask', $SIF_POS)
_GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
_GUIScrollBars_GetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
$Pos = DllStructGetData($tSCROLLINFO, 'nPos')
If ($Pos <> $yPos) Then
_GUIScrollBars_ScrollWindow($hWnd, 0, $yChar * ($yPos - $Pos))
$yPos = $Pos
EndIf
Return $GUI_RUNDEFMSG
EndFunc
Нужно скачать GUIScrollbars_Size.au3 тут и положить в папку со скриптом.
|