Что нового

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

DyadyaGenya

Знающий
Сообщения
311
Репутация
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,571
Репутация
633
Код:
$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

Знающий
Сообщения
311
Репутация
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 растягивались ещё и по высоте.
 
Последнее редактирование:
Верх