Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   Диалог и изображениями (http://forum.oszone.net/showthread.php?t=338299)

Malukov.Dmitry 18-12-2018 15:38 2846820

Диалог и изображениями
 
Вложений: 1
Всем доброго вечера !

Подскажите пожалуйста, как можно реализовать следующий сценарий:
Необходимо создать окно, в котором будут отображаться миниатюры изображений
из определенной папки (пример прилагаю). Окно фиксированного размера + скроллбар (если объектов больше определенного числа)
При нажатии на изображение - установка в качестве фона раб.стола + уведомление
При отсутствии объектов - уведомление
Файл 155545

Не получается никак, но пока еще только раскуриваю тему.

Creat0R 02-03-2019 01:46 2860836

Цитата:

Цитата Malukov.Dmitry
Необходимо создать окно, в котором будут отображаться миниатюры изображений »

Для начала см. пример к _GUIScrollBars_Init.

Creat0R 02-03-2019 02:39 2860840

Как то так:

Код:

#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 тут и положить в папку со скриптом.


Время: 00:37.

Время: 00:37.
© OSzone.net 2001-