Что нового

Элементы резинового окна перекрывают друг друга и не фиксируется минимальный размер окна

DyadyaGenya

Знающий
Сообщения
312
Репутация
10
Доброго времени суток. Всегда были самые большие проблемы с созданием интерфейса. Да и к autoit мало обращаюсь.
Надо бы резиновое окошко, чтобы был минимальный размер фиксированный, чтоб элементы не налазили друг на друга ни при растяжении окна, ни при сжатии. Вот что у меня получилось
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ComboConstants.au3>
#include <ListViewConstants.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <Math.au3>

Global $hGUI
Global $idLink, $idCheckBtn
Global $idPath, $idBrowseBtn
Global $idFilename
Global $idFormatLbl, $idFormatCmb
Global $idList, $idPic
Global $idDownloadBtn, $idCancelBtn
Global $idLogLabel, $idLogBox

; ---- параметры интерфейса ----
Global Const $Margin = 10, $Spacing = 8, $LabelH = 18, $CtrlH = 22, $BtnW = 80, $BtnH = 24

; координата "курсора" по Y
Global $gY = $Margin

; === ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ===
Func _AddLabeledInput($hGUI, $text, ByRef $inputCtrl, $withBtn = False, $btnText = "")
    Local $W = @DesktopWidth
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then $W = $guiPos[2]

    GUICtrlCreateLabel($text, $Margin, $gY, $W - 2 * $Margin, $LabelH)
    $gY += $LabelH + 2

    Local $inputW = $W - 2 * $Margin
    If $withBtn Then $inputW -= ($BtnW + $Spacing)

    $inputCtrl = GUICtrlCreateInput("", $Margin, $gY, $inputW, $CtrlH)

    Local $btnCtrl = -1
    If $withBtn Then
        $btnCtrl = GUICtrlCreateButton($btnText, $Margin + $inputW + $Spacing, $gY, $BtnW, $CtrlH)
    EndIf

    $gY += $CtrlH + $Spacing
    Return $btnCtrl
EndFunc

Func _AddLabeledCombo($hGUI, $text, ByRef $comboCtrl)
    Local $W = @DesktopWidth
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then $W = $guiPos[2]

    GUICtrlCreateLabel($text, $Margin, $gY, $W - 2 * $Margin, $LabelH)
    $gY += $LabelH + 2

    Local $formatW = _Min(420, $W - 2 * $Margin)
    $comboCtrl = GUICtrlCreateCombo("", $Margin, $gY, $formatW, $CtrlH, $CBS_DROPDOWNLIST)
    $gY += $CtrlH + $Spacing
EndFunc

Func _AddListAndBox($hGUI, ByRef $listCtrl, ByRef $boxCtrl)
    Local $W, $H
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then
        $W = $guiPos[2]
        $H = $guiPos[3]
    Else
        $W = 600
        $H = 400
    EndIf

    GUICtrlCreateLabel("Продвинутые", $Margin, $gY, $W - 2 * $Margin, $LabelH)
    $gY += $LabelH + 2

    Local $listW = $W - 3 * $Margin - 150
    $listCtrl = GUICtrlCreateListView("Selected|ID|EXT|RESOLUTION|FPS|CH|FILESIZE|TBR|PROT", $Margin, $gY, $listW, 100, _
        BitOR($LVS_REPORT, $LVS_SINGLESEL, $WS_BORDER))

    ; поле для картинки
    $boxCtrl = GUICtrlCreatePic("", $Margin + $listW + $Margin, $gY, 150, 100, $SS_CENTERIMAGE + $WS_BORDER)
    $gY += 100 + $Spacing
EndFunc

Func _AddButtons($hGUI, ByRef $btnDownload, ByRef $btnCancel)
    Local $W
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then $W = $guiPos[2]
    If $W = 0 Then $W = 600

    $btnDownload = GUICtrlCreateButton("скачать", $Margin, $gY, $BtnW, $BtnH)
    $btnCancel = GUICtrlCreateButton("ОТМЕНА", $W - $BtnW - $Margin, $gY, $BtnW, $BtnH)
    $gY += $BtnH + $Spacing
EndFunc

Func _AddLogBox()
    Global $idLogLabel = GUICtrlCreateLabel("Лог", $Margin, $gY, 100, $LabelH)
    $gY += $LabelH + 2

    Local $size = WinGetClientSize($hGUI)
    Local $initW = 600
    If Not @error Then $initW = $size[0]

    Global $idLogBox = GUICtrlCreateEdit("", $Margin, $gY, $initW - 2 * $Margin, 100, _
        BitOR($ES_READONLY, $WS_BORDER, $ES_MULTILINE, $ES_AUTOVSCROLL, $WS_VSCROLL))
    $gY += 100 + $Spacing
EndFunc

; Вызывается при изменении размеров окна
Func _ResizeLogBox($W, $H)
    Local $logH = $H - ($gY + $Margin)
    If $logH < 80 Then $logH = 80

    GUICtrlSetPos($idLogBox, $Margin, $gY, $W - 2 * $Margin, $logH)
    GUICtrlSetPos($idLogLabel, $Margin, $gY - ($LabelH + 2), 100, $LabelH)
EndFunc

; === ОСНОВНАЯ ЧАСТЬ ===
$hGUI = GUICreate("YouTube Downloader", 800, 600, -1, -1, _
    BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_MAXIMIZEBOX))
GUISetFont(9)

; строим элементы
$idCheckBtn   = _AddLabeledInput($hGUI, "Ссылка", $idLink, True, "проверить")
$idBrowseBtn  = _AddLabeledInput($hGUI, "Путь сохранения", $idPath, True, "Выбрать")
_AddLabeledInput($hGUI, "Имя файла", $idFilename, False)
_AddLabeledCombo($hGUI, "качество/формат", $idFormatCmb)
_AddListAndBox($hGUI, $idList, $idPic)
_AddButtons($hGUI, $idDownloadBtn, $idCancelBtn)
_AddLogBox()

GUISetState(@SW_SHOW, $hGUI)

; минимальные размеры окна
GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")
Func WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
    Local $tMINMAXINFO = DllStructCreate("int;int;int;int;int[4]", $lParam)
    DllStructSetData($tMINMAXINFO, 3, 600) ; min width
    DllStructSetData($tMINMAXINFO, 4, 500) ; min height
    Return 0
EndFunc

; цикл сообщений
While True
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $WM_SIZE
            Local $s = WinGetClientSize($hGUI)
            _ResizeLogBox($s[0], $s[1])
    EndSwitch
WEnd

Тоесть конечный вид должен быть приблизительно как на картинке. Внешний вид вроде и подходит, но фиксированный минимальный размер не получается.
 

Вложения

  • интерфейс для ютуба 3.jpg
    интерфейс для ютуба 3.jpg
    114.2 КБ · Просмотры: 0

joiner

Модератор
Локальный модератор
Сообщения
3,572
Репутация
634
Код:
$hGUI = GUICreate("YouTube Downloader", 800, 600, -1, -1, _
    BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_MAXIMIZEBOX))
GUISetFont(9)
Global $WGPG = WinGetPos($hGUI)


Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg, $wParam
    If $hWnd = $hGUI Then
        Local $tMINMAXINFO = DllStructCreate("int;int;" & _
                "int MaxSizeX; int MaxSizeY;" & _
                "int MaxPositionX;int MaxPositionY;" & _
                "int MinTrackSizeX; int MinTrackSizeY;" & _
                "int MaxTrackSizeX; int MaxTrackSizeY", _
                $lParam)
        DllStructSetData($tMINMAXINFO, "MinTrackSizeX", $WGPG[2]) ; минимальные размеры окна
        DllStructSetData($tMINMAXINFO, "MinTrackSizeY", $WGPG[3]);
; или просто подставьте свои размеры вместо $WGPG[...]
;посмотрите остальные параметры $tMINMAXINFO
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_GETMINMAXINFO


для более точного поведения элементов используйте
Код:
GUICtrlSetResizing


еще один момент: название темы должно отображать суть вопроса
 
Последнее редактирование:
Автор
D

DyadyaGenya

Знающий
Сообщения
312
Репутация
10
Код:
$hGUI = GUICreate("YouTube Downloader", 800, 600, -1, -1, _
    BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_MAXIMIZEBOX))
GUISetFont(9)
Global $WGPG = WinGetPos($hGUI)


Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg, $wParam
    If $hWnd = $hGUI Then
        Local $tMINMAXINFO = DllStructCreate("int;int;" & _
                "int MaxSizeX; int MaxSizeY;" & _
                "int MaxPositionX;int MaxPositionY;" & _
                "int MinTrackSizeX; int MinTrackSizeY;" & _
                "int MaxTrackSizeX; int MaxTrackSizeY", _
                $lParam)
        DllStructSetData($tMINMAXINFO, "MinTrackSizeX", $WGPG[2]) ; минимальные размеры окна
        DllStructSetData($tMINMAXINFO, "MinTrackSizeY", $WGPG[3]);
; или просто подставьте свои размеры вместо $WGPG[...]
;посмотрите остальные параметры $tMINMAXINFO
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_GETMINMAXINFO


для более точного поведения элементов используйте
Код:
GUICtrlSetResizing


еще один момент: название темы должно отображать суть вопроса
Всё равно не получается как хочется. Вот что у меня сейчас
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ComboConstants.au3>
#include <ListViewConstants.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <Math.au3>

Global $hGUI
Global $idLink, $idCheckBtn
Global $idPath, $idBrowseBtn
Global $idFilename
Global $idFormatLbl, $idFormatCmb
Global $idList, $idPic
Global $idDownloadBtn, $idGlueBtn
Global $idCancelBtn
Global $idProgress
Global $idLogLabel, $idLogBox
Global $idStatus
Global $WGPG

; ---- параметры интерфейса ----
Global Const $Margin = 10, $Spacing = 8, $LabelH = 18, $CtrlH = 22, $BtnW = 80, $BtnH = 24

; координата "курсора" по Y
Global $gY = $Margin

; === ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ===
Func _AddLabeledInput($hGUI, $text, ByRef $inputCtrl, $withBtn = False, $btnText = "")
    Local $W = @DesktopWidth
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then $W = $guiPos[2]

    Local $label = GUICtrlCreateLabel($text, $Margin, $gY, $W - 2 * $Margin, $LabelH)
    GUICtrlSetResizing($label, $GUI_DOCKLEFT + $GUI_DOCKWIDTH + $GUI_DOCKTOP)
    $gY += $LabelH + 2

    Local $inputW = $W - 2 * $Margin
    If $withBtn Then $inputW -= ($BtnW + $Spacing)

    $inputCtrl = GUICtrlCreateInput("", $Margin, $gY, $inputW, $CtrlH)
    GUICtrlSetResizing($inputCtrl, $GUI_DOCKLEFT + $GUI_DOCKWIDTH + $GUI_DOCKTOP)

    Local $btnCtrl = -1
    If $withBtn Then
        $btnCtrl = GUICtrlCreateButton($btnText, $Margin + $inputW + $Spacing, $gY, $BtnW, $CtrlH)
        GUICtrlSetResizing($btnCtrl, $GUI_DOCKRIGHT + $GUI_DOCKTOP)
    EndIf

    $gY += $CtrlH + $Spacing
    Return $btnCtrl
EndFunc

Func _AddLabeledCombo($hGUI, $text, ByRef $comboCtrl)
    Local $W = @DesktopWidth
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then $W = $guiPos[2]

    Local $label = GUICtrlCreateLabel($text, $Margin, $gY, $W - 2 * $Margin, $LabelH)
    GUICtrlSetResizing($label, $GUI_DOCKLEFT + $GUI_DOCKWIDTH + $GUI_DOCKTOP)
    $gY += $LabelH + 2

    Local $formatW = _Min(420, $W - 2 * $Margin)
    $comboCtrl = GUICtrlCreateCombo("", $Margin, $gY, $formatW, $CtrlH, $CBS_DROPDOWNLIST)
    GUICtrlSetResizing($comboCtrl, $GUI_DOCKLEFT + $GUI_DOCKWIDTH + $GUI_DOCKTOP)
    $gY += $CtrlH + $Spacing
EndFunc

Func _AddListAndBox($hGUI, ByRef $listCtrl, ByRef $boxCtrl)
    Local $W, $H
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then
        $W = $guiPos[2]
        $H = $guiPos[3]
    Else
        $W = 600
        $H = 400
    EndIf

    Local $label = GUICtrlCreateLabel("Продвинутые", $Margin, $gY, $W - 2 * $Margin, $LabelH)
    GUICtrlSetResizing($label, $GUI_DOCKLEFT + $GUI_DOCKWIDTH + $GUI_DOCKTOP)
    $gY += $LabelH + 2

    Local $listW = $W - 3 * $Margin - 150
    $listCtrl = GUICtrlCreateListView("Selected|ID|EXT|RESOLUTION|FPS|CH|FILESIZE|TBR|PROT", $Margin, $gY, $listW, 100, _
        BitOR($LVS_REPORT, $LVS_SINGLESEL, $WS_BORDER, $ES_AUTOVSCROLL, $WS_VSCROLL))
    GUICtrlSetResizing($listCtrl, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKHEIGHT)

    ; поле для картинки с синхронной высотой
    $boxCtrl = GUICtrlCreatePic("", $Margin + $listW + $Margin, $gY, 150, 100, $SS_CENTERIMAGE + $WS_BORDER)
    GUICtrlSetResizing($boxCtrl, $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKHEIGHT)
    $gY += 100
EndFunc

Func _AddButtons($hGUI, ByRef $btnDownload, ByRef $btnGlue)
    Local $W
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then $W = $guiPos[2]
    If $W = 0 Then $W = 600

    $btnDownload = GUICtrlCreateButton("Скачать", $Margin, $gY, $BtnW, $BtnH)
    GUICtrlSetResizing($btnDownload, $GUI_DOCKLEFT + $GUI_DOCKTOP)
    $btnGlue = GUICtrlCreateButton("Склеить", $Margin + $BtnW + $Spacing, $gY, $BtnW, $BtnH)
    GUICtrlSetResizing($btnGlue, $GUI_DOCKLEFT + $GUI_DOCKTOP)
EndFunc

Func _AddCancelButton($hGUI, ByRef $btnCancel)
    Local $W
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then $W = $guiPos[2]
    If $W = 0 Then $W = 600

    Local $picPos = ControlGetPos($hGUI, "", $idPic)
    If Not @error Then
        $btnCancel = GUICtrlCreateButton("Отмена", $Margin + $picPos[0], $picPos[1] + $picPos[3] + $Spacing, $BtnW, $BtnH)
        GUICtrlSetResizing($btnCancel, $GUI_DOCKRIGHT + $GUI_DOCKTOP)
    EndIf
    $gY = $picPos[1] + $picPos[3] + $Spacing + $BtnH + $Spacing
EndFunc

Func _AddProgress($hGUI, ByRef $progressCtrl)
    Local $W
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then $W = $guiPos[2]
    If $W = 0 Then $W = 600

    $progressCtrl = GUICtrlCreateProgress($Margin, $gY, $W - 2 * $Margin, $CtrlH, $PBS_SMOOTH)
    GUICtrlSetResizing($progressCtrl, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP)
    GUICtrlSetBkColor($progressCtrl, 0x00FF00) ; Зеленый цвет
    $gY += $CtrlH + $Spacing
EndFunc

Func _AddLogBox()
    Global $idLogLabel = GUICtrlCreateLabel("Лог", $Margin, $gY, 100, $LabelH)
    GUICtrlSetResizing($idLogLabel, $GUI_DOCKLEFT + $GUI_DOCKTOP)
    $gY += $LabelH + 2

    Local $size = WinGetClientSize($hGUI)
    Local $initW = 600
    If Not @error Then $initW = $size[0]

    Global $idLogBox = GUICtrlCreateEdit("", $Margin, $gY, $initW - 2 * $Margin, 100, _
        BitOR($ES_READONLY, $WS_BORDER, $ES_MULTILINE, $ES_AUTOVSCROLL, $WS_VSCROLL))
    GUICtrlSetResizing($idLogBox, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKHEIGHT)
    $gY += 100 + $Spacing
EndFunc

Func _AddStatus($hGUI, ByRef $statusCtrl)
    Local $W
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then $W = $guiPos[2]
    If $W = 0 Then $W = 600

    $statusCtrl = GUICtrlCreateLabel("Статус: Готов", $Margin, $gY, $W - 2 * $Margin, $LabelH)
    GUICtrlSetResizing($statusCtrl, $GUI_DOCKLEFT + $GUI_DOCKWIDTH + $GUI_DOCKBOTTOM)
EndFunc

; === ОСНОВНАЯ ЧАСТЬ ===
$hGUI = GUICreate("YouTube Downloader", 800, 600, -1, -1, _
    BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_MAXIMIZEBOX))
GUISetFont(9)
$WGPG = WinGetPos($hGUI)

; строим элементы
$idCheckBtn   = _AddLabeledInput($hGUI, "Ссылка", $idLink, True, "проверить")
$idBrowseBtn  = _AddLabeledInput($hGUI, "Путь сохранения", $idPath, True, "Выбрать")
_AddLabeledInput($hGUI, "Имя файла", $idFilename, False)
_AddLabeledCombo($hGUI, "По умолчанию", $idFormatCmb)
_AddListAndBox($hGUI, $idList, $idPic)
_AddButtons($hGUI, $idDownloadBtn, $idGlueBtn)
_AddCancelButton($hGUI, $idCancelBtn)
_AddProgress($hGUI, $idProgress)
_AddLogBox()
_AddStatus($hGUI, $idStatus)

GUISetState(@SW_SHOW, $hGUI)

; минимальные размеры окна
GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")
Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg, $wParam
    If $hWnd = $hGUI Then
        Local $tMINMAXINFO = DllStructCreate("int;int;" & _
                "int MaxSizeX; int MaxSizeY;" & _
                "int MaxPositionX;int MaxPositionY;" & _
                "int MinTrackSizeX; int MinTrackSizeY;" & _
                "int MaxTrackSizeX; int MaxTrackSizeY", _
                $lParam)
        DllStructSetData($tMINMAXINFO, "MinTrackSizeX", $WGPG[2]) ; минимальные размеры окна
        DllStructSetData($tMINMAXINFO, "MinTrackSizeY", $WGPG[3])
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_GETMINMAXINFO

; цикл сообщений
While True
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd
Но тут кнопки Скачать и Склеить слегка перекрывают друг друга при растяжении. Остальное более менее работает. Хотя хотелось бы, чтоб поля $idLogBox и $listCtrl растягивались ещё и по высоте.
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,572
Репутация
634
немного подправил.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ComboConstants.au3>
#include <ListViewConstants.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <Math.au3>

Global $hGUI
Global $idLink, $idCheckBtn
Global $idPath, $idBrowseBtn
Global $idFilename
Global $idFormatLbl, $idFormatCmb
Global $idList, $idPic
Global $idDownloadBtn, $idGlueBtn
Global $idCancelBtn
Global $idProgress
Global $idLogLabel, $idLogBox
Global $idStatus
Global $WGPG

; ---- параметры интерфейса ----
Global Const $Margin = 10, $Spacing = 8, $LabelH = 18, $CtrlH = 22, $BtnW = 80, $BtnH = 24

; координата "курсора" по Y
Global $gY = $Margin

; === ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ===
Func _AddLabeledInput($hGUI, $text, ByRef $inputCtrl, $withBtn = False, $btnText = "")
    Local $W = @DesktopWidth
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then $W = $guiPos[2]

    Local $label = GUICtrlCreateLabel($text, $Margin, $gY, $W - 2 * $Margin, $LabelH)
    GUICtrlSetResizing($label, $GUI_DOCKLEFT + $GUI_DOCKWIDTH + $GUI_DOCKTOP)
    $gY += $LabelH + 2

    Local $inputW = $W - 2 * $Margin
    If $withBtn Then $inputW -= ($BtnW + $Spacing)

    $inputCtrl = GUICtrlCreateInput("", $Margin, $gY, $inputW, $CtrlH)
    GUICtrlSetResizing($inputCtrl, BitOR($GUI_DOCKRIGHT, $GUI_DOCKLEFT, $GUI_DOCKTOP, $GUI_DOCKWIDTH, $GUI_DOCKHEIGHT))

    Local $btnCtrl = -1
    If $withBtn Then
        $btnCtrl = GUICtrlCreateButton($btnText, $Margin + $inputW + $Spacing, $gY, $BtnW, $CtrlH)
        GUICtrlSetResizing($btnCtrl, BitOR($GUI_DOCKRIGHT, $GUI_DOCKTOP, $GUI_DOCKWIDTH, $GUI_DOCKHEIGHT))
    EndIf

    $gY += $CtrlH + $Spacing
    Return $btnCtrl
EndFunc   ;==>_AddLabeledInput

Func _AddLabeledCombo($hGUI, $text, ByRef $comboCtrl)
    Local $W = @DesktopWidth
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then $W = $guiPos[2]

    Local $label = GUICtrlCreateLabel($text, $Margin, $gY, $W - 2 * $Margin, $LabelH)
    GUICtrlSetResizing($label, $GUI_DOCKLEFT + $GUI_DOCKWIDTH + $GUI_DOCKTOP)
    $gY += $LabelH + 2

    Local $formatW = _Min(420, $W - 2 * $Margin)
    $comboCtrl = GUICtrlCreateCombo("", $Margin, $gY, $formatW, $CtrlH, $CBS_DROPDOWNLIST)
    GUICtrlSetResizing($comboCtrl, $GUI_DOCKLEFT + $GUI_DOCKWIDTH + $GUI_DOCKTOP)
    $gY += $CtrlH + $Spacing
EndFunc   ;==>_AddLabeledCombo

Func _AddListAndBox($hGUI, ByRef $listCtrl, ByRef $boxCtrl)
    Local $W, $H
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then
        $W = $guiPos[2]
        $H = $guiPos[3]
    Else
        $W = 600
        $H = 400
    EndIf

    Local $label = GUICtrlCreateLabel("Продвинутые", $Margin, $gY, $W - 2 * $Margin, $LabelH)
    GUICtrlSetResizing($label, $GUI_DOCKLEFT + $GUI_DOCKWIDTH + $GUI_DOCKTOP)
    $gY += $LabelH + 2

    Local $listW = $W - 3 * $Margin - 150
    $listCtrl = GUICtrlCreateListView("Selected|ID|EXT|RESOLUTION|FPS|CH|FILESIZE|TBR|PROT", $Margin, $gY, $listW, 100, _
            BitOR($LVS_REPORT, $LVS_SINGLESEL, $WS_BORDER, $ES_AUTOVSCROLL, $WS_VSCROLL))
    GUICtrlSetResizing($listCtrl, $GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKHEIGHT + $GUI_DOCKBOTTOM)

    ; поле для картинки с синхронной высотой
    $boxCtrl = GUICtrlCreatePic("", $Margin + $listW + $Margin, $gY, 150, 100, $SS_CENTERIMAGE + $WS_BORDER)
    GUICtrlSetResizing($boxCtrl, BitOR($GUI_DOCKRIGHT, $GUI_DOCKTOP, $GUI_DOCKWIDTH, $GUI_DOCKHEIGHT + $GUI_DOCKBOTTOM))
    $gY += 100
EndFunc   ;==>_AddListAndBox

Func _AddButtons($hGUI, ByRef $btnDownload, ByRef $btnGlue)
    Local $W
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then $W = $guiPos[2]
    If $W = 0 Then $W = 600

    $btnDownload = GUICtrlCreateButton("Скачать", $Margin, $gY, $BtnW, $BtnH)
    GUICtrlSetResizing($btnDownload, BitOR($GUI_DOCKLEFT, $GUI_DOCKWIDTH, $GUI_DOCKHEIGHT, $GUI_DOCKBOTTOM))
    $btnGlue = GUICtrlCreateButton("Склеить", $Margin + $BtnW + $Spacing, $gY, $BtnW, $BtnH)
    GUICtrlSetResizing($btnGlue, BitOR($GUI_DOCKLEFT, $GUI_DOCKWIDTH, $GUI_DOCKHEIGHT, $GUI_DOCKBOTTOM))
EndFunc   ;==>_AddButtons

Func _AddCancelButton($hGUI, ByRef $btnCancel)
    Local $W
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then $W = $guiPos[2]
    If $W = 0 Then $W = 600

    Local $picPos = ControlGetPos($hGUI, "", $idPic)
    If Not @error Then
        $btnCancel = GUICtrlCreateButton("Отмена", $Margin + $picPos[0], $picPos[1] + $picPos[3] + $Spacing, $BtnW, $BtnH)
        GUICtrlSetResizing($btnCancel, BitOR($GUI_DOCKRIGHT,$GUI_DOCKWIDTH, $GUI_DOCKHEIGHT,$GUI_DOCKBOTTOM))
    EndIf
    $gY = $picPos[1] + $picPos[3] + $Spacing + $BtnH + $Spacing
EndFunc   ;==>_AddCancelButton

Func _AddProgress($hGUI, ByRef $progressCtrl)
    Local $W
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then $W = $guiPos[2]
    If $W = 0 Then $W = 600

    $progressCtrl = GUICtrlCreateProgress($Margin, $gY, $W - 2 * $Margin, $CtrlH, $PBS_SMOOTH)
    GUICtrlSetResizing($progressCtrl, BitOR($GUI_DOCKRIGHT, $GUI_DOCKLEFT,  $GUI_DOCKWIDTH, $GUI_DOCKHEIGHT, $GUI_DOCKBOTTOM))
    GUICtrlSetBkColor($progressCtrl, 0x00FF00) ; Зеленый цвет
    $gY += $CtrlH + $Spacing
EndFunc   ;==>_AddProgress

Func _AddLogBox()
    Global $idLogLabel = GUICtrlCreateLabel("Лог", $Margin, $gY, 100, $LabelH)
    GUICtrlSetResizing($idLogLabel, BitOR($GUI_DOCKRIGHT, $GUI_DOCKLEFT,$GUI_DOCKHEIGHT, $GUI_DOCKBOTTOM))
    $gY += $LabelH + 2

    Local $size = WinGetClientSize($hGUI)
    Local $initW = 600
    If Not @error Then $initW = $size[0]

    Global $idLogBox = GUICtrlCreateEdit("", $Margin, $gY, $initW - 2 * $Margin, 100, _
            BitOR($ES_READONLY, $WS_BORDER, $ES_MULTILINE, $ES_AUTOVSCROLL, $WS_VSCROLL))
    GUICtrlSetResizing($idLogBox, BitOR($GUI_DOCKRIGHT, $GUI_DOCKLEFT, $GUI_DOCKHEIGHT, $GUI_DOCKBOTTOM))
    $gY += 100 + $Spacing
EndFunc   ;==>_AddLogBox

Func _AddStatus($hGUI, ByRef $statusCtrl)
    Local $W
    Local $guiPos = WinGetPos($hGUI)
    If Not @error Then $W = $guiPos[2]
    If $W = 0 Then $W = 600

    $statusCtrl = GUICtrlCreateLabel("Статус: Готов", $Margin, $gY, $W - 2 * $Margin, $LabelH)
    GUICtrlSetResizing($statusCtrl, BitOR($GUI_DOCKLEFT, $GUI_DOCKHEIGHT, $GUI_DOCKBOTTOM))
EndFunc   ;==>_AddStatus

; === ОСНОВНАЯ ЧАСТЬ ===
$hGUI = GUICreate("YouTube Downloader", 800, 600, -1, -1, _
        BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_MAXIMIZEBOX))
GUISetFont(9)
$WGPG = WinGetPos($hGUI)

; строим элементы
$idCheckBtn = _AddLabeledInput($hGUI, "Ссылка", $idLink, True, "проверить")
$idBrowseBtn = _AddLabeledInput($hGUI, "Путь сохранения", $idPath, True, "Выбрать")
_AddLabeledInput($hGUI, "Имя файла", $idFilename, False)
_AddLabeledCombo($hGUI, "По умолчанию", $idFormatCmb)
_AddListAndBox($hGUI, $idList, $idPic)
_AddButtons($hGUI, $idDownloadBtn, $idGlueBtn)
_AddCancelButton($hGUI, $idCancelBtn)
_AddProgress($hGUI, $idProgress)
_AddLogBox()
_AddStatus($hGUI, $idStatus)

GUISetState(@SW_SHOW, $hGUI)

; минимальные размеры окна
GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")
Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg, $wParam
    If $hWnd = $hGUI Then
        Local $tMINMAXINFO = DllStructCreate("int;int;" & _
                "int MaxSizeX; int MaxSizeY;" & _
                "int MaxPositionX;int MaxPositionY;" & _
                "int MinTrackSizeX; int MinTrackSizeY;" & _
                "int MaxTrackSizeX; int MaxTrackSizeY", _
                $lParam)
        DllStructSetData($tMINMAXINFO, "MinTrackSizeX", $WGPG[2]) ; минимальные размеры окна
        DllStructSetData($tMINMAXINFO, "MinTrackSizeY", $WGPG[3])
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_GETMINMAXINFO

; цикл сообщений
While True
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd
остальное продумайте сами. не все элементы одинаково себя ведут при растягивании и наоборот. Придумайте свою обработку для изменения размера этих элементов. Или расположите так, чтобы не пересекались с другими элементами. Можно создать окно в окне, которое будет менять ся
согласно родительскому. Вариантов много
 
Последнее редактирование:
Автор
D

DyadyaGenya

Знающий
Сообщения
312
Репутация
10
немного подправил.
Да, так почти идеально.
Вариантов много
К сожалению Autoit занимаюсь очень редко. Написание интерфейса для меня - одна из наиболее сложных задач. Вроде и стараюсь разобраться, но очень тяжело идет. Вот даже ваш последний вариант не могу довести до ума. Там поле картинки меняется только по высоте, и у меня не получается сделать, чтобы менялось и по ширине пропорционально высоте этого поля. Все варианты, которые пробовал сделать сбивают это поле. Голова кипит, и если за день-другой не разберусь, плюну и оставлю как есть. Всё остальное работает давно.
Вообще, как я понимаю, для таких вещей правильнее плюсы или си шарп использовать, но на них тем более нет времени. Я их практически не знаю. А Autoit хотя бы другие вещи более менее получаются.
 
Верх