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
Тоесть конечный вид должен быть приблизительно как на картинке. Внешний вид вроде и подходит, но фиксированный минимальный размер не получается.