Что нового

Резиновое окно и фиксированный регион

DyadyaGenya

Знающий
Сообщения
305
Репутация
10
Доброго времени суток. Очень давно не делал ничего на автоите, почти всё забыл. Не могу вспомнить, как сделать чтобы само окно было резиновым, в нём несколько регионов и группа регионов была с фиксированным размером. Вот примерный код окошка:
Код:
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

; Создание главного окна
GUICreate("Таблица элементов питания", 1000, 800, -1, -1, $WS_SIZEBOX)

; Первый регион для выбора (фиксированный размер, уменьшенная высота)
GUICtrlCreateGroup("", 10, 10, 300, 250) ; Фиксированная ширина 300, высота 250
Local $cboState = GUICtrlCreateCombo("Выберите состояние", 20, 30, 200, 25)
Local $cboType = GUICtrlCreateCombo("Выберите типоразмер", 20, 80, 200, 25)
Local $cboManufacturer = GUICtrlCreateCombo("Выберите производителя", 20, 130, 200, 25)
Local $cboModel = GUICtrlCreateCombo("Выберите модель", 20, 180, 200, 25)

GUICtrlSetState($cboType, $GUI_DISABLE)
GUICtrlSetState($cboManufacturer, $GUI_DISABLE)
GUICtrlSetState($cboModel, $GUI_DISABLE)
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Третий регион для дополнительных меню (под первым регионом)
GUICtrlCreateGroup("", 10, 270, 300, 150) ; Фиксированная ширина 300, высота 150
Local $cboExtra1 = GUICtrlCreateCombo("Выберите параметр 1", 20, 30, 200, 25)
Local $cboExtra2 = GUICtrlCreateCombo("Выберите параметр 2", 20, 80, 200, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Второй регион для вывода - таблица
GUICtrlCreateGroup("", 320, 10, 670, 410) ; Увеличенная высота
Local $headerLabel1 = GUICtrlCreateListView("", 330, 30, 650, 380, $LVS_REPORT)
GUICtrlSetState($headerLabel1, $GUI_SHOW)
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Четвертый регион для вывода - таблица
GUICtrlCreateGroup("", 10, 430, 980, 300) ; Скорректированные размеры
Local $headerLabel2 = GUICtrlCreateListView("", 20, 450, 960, 270, $LVS_REPORT)
GUICtrlSetState($headerLabel2, $GUI_SHOW)
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Кнопки "Очистить" и "Выход" вне регионов
Local $btnClear = GUICtrlCreateButton("Очистить", 750, 740, 100, 30) ; Исправлено размещение
Local $btnExit = GUICtrlCreateButton("Выход", 870, 740, 100, 30) ; Исправлено размещение

GUISetState(@SW_SHOW)

; Основной цикл
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $btnExit
            Exit
        Case $btnClear
            ; Обработка нажатия кнопки "Очистить"
            GUICtrlSetData($headerLabel1, "")
            GUICtrlSetData($headerLabel2, "")
    EndSwitch
WEnd
И прикрепляю скрин, как хотелось бы
 

Вложения

  • Резиновое окно 1.jpg
    Резиновое окно 1.jpg
    96.2 КБ · Просмотры: 3

Sln

Знающий
Сообщения
49
Репутация
7
GUICtrlSetResizing

Код:
#include <GUIConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

; Создание главного окна
GUICreate("Таблица элементов питания", 1000, 800, -1, -1, $WS_SIZEBOX)

; Первый регион для выбора (фиксированный размер, уменьшенная высота)
GUICtrlCreateGroup("", 10, 10, 300, 250) ; Фиксированная ширина 300, высота 250
GUICtrlSetResizing(-1, $GUI_DOCKALL)

Local $cboState = GUICtrlCreateCombo("Выберите состояние", 20, 20, 200, 25)
                  GUICtrlSetResizing(-1, $GUI_DOCKALL)
Local $cboType = GUICtrlCreateCombo("Выберите типоразмер", 20, 80, 200, 25)
                 GUICtrlSetResizing(-1, $GUI_DOCKALL)
Local $cboManufacturer = GUICtrlCreateCombo("Выберите производителя", 20, 130, 200, 25)
                         GUICtrlSetResizing(-1, $GUI_DOCKALL)
Local $cboModel = GUICtrlCreateCombo("Выберите модель", 20, 180, 200, 25)
                  GUICtrlSetResizing(-1, $GUI_DOCKALL)

GUICtrlSetState($cboType, $GUI_DISABLE)
GUICtrlSetState($cboManufacturer, $GUI_DISABLE)
GUICtrlSetState($cboModel, $GUI_DISABLE)
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Третий регион для дополнительных меню (под первым регионом)
GUICtrlCreateGroup("1", 10, 270, 300, 150) ; Фиксированная ширина 300, высота 150
GUICtrlSetResizing(-1, $GUI_DOCKALL)

Local $cboExtra1 = GUICtrlCreateCombo("Выберите параметр 1", 20, 50, 200, 25)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
Local $cboExtra2 = GUICtrlCreateCombo("Выберите параметр 2", 20, 80, 200, 25)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Второй регион для вывода - таблица
GUICtrlCreateGroup("", 320, 10, 670, 410) ; Увеличенная высота
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)

Local $headerLabel1 = GUICtrlCreateListView("", 330, 30, 650, 380, $LVS_REPORT)
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
GUICtrlSetState($headerLabel1, $GUI_SHOW)
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Четвертый регион для вывода - таблица
GUICtrlCreateGroup("", 10, 430, 980, 300) ; Скорректированные размеры
GUICtrlSetResizing(-1, 2+4+64+512)
Local $headerLabel2 = GUICtrlCreateListView("", 20, 450, 960, 270, $LVS_REPORT)
GUICtrlSetResizing(-1, 2+4+64+512)
GUICtrlSetState($headerLabel2, $GUI_SHOW)
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Кнопки "Очистить" и "Выход" вне регионов
Local $btnClear = GUICtrlCreateButton("Очистить", 750, 740, 100, 30) ; Исправлено размещение
GUICtrlSetResizing(-1, 4+64+256+512)
Local $btnExit = GUICtrlCreateButton("Выход", 870, 740, 100, 30) ; Исправлено размещение
GUICtrlSetResizing(-1, 4+64+256+512)

GUISetState(@SW_SHOW)

; Основной цикл
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $btnExit
            Exit
        Case $btnClear
            ; Обработка нажатия кнопки "Очистить"
            GUICtrlSetData($headerLabel1, "")
            GUICtrlSetData($headerLabel2, "")
    EndSwitch
WEnd
 
Автор
D

DyadyaGenya

Знающий
Сообщения
305
Репутация
10
Спасибо, ещё чуток поуточняю. А если такое окно:
Код:
#include <GUIConstantsEx.au3>
#include <GuiEdit.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

; Создание главного окна
GUICreate("Окно с 7 регионами", 1200, 840, -1, -1, $WS_SIZEBOX)

; --- ЛЕВАЯ ЧАСТЬ ---

; Первый регион для выпадающего меню (слева сверху)
GUICtrlCreateGroup("", 10, 10, 300, 150)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
Local $cboLeftTop = GUICtrlCreateCombo("Выберите 1", 20, 30, 260, 25)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Второй регион для выпадающего меню (слева в центре)
GUICtrlCreateGroup("", 10, 170, 300, 150)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
Local $cboLeftMiddle = GUICtrlCreateCombo("Выберите 2", 20, 190, 260, 25)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Третий регион для выпадающего меню (слева снизу)
GUICtrlCreateGroup("", 10, 330, 300, 150)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
Local $cboLeftBottom = GUICtrlCreateCombo("Выберите 3", 20, 350, 260, 25)
GUICtrlSetResizing(-1, $GUI_DOCKALL)
GUICtrlCreateGroup("", -99, -99, 1, 1)

; --- ПРАВАЯ ЧАСТЬ ---

; Первый регион с ListView (справа сверху)
GUICtrlCreateGroup("", 320, 10, 870, 150)
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
Local $lstRightTop = GUICtrlCreateListView("Колонка 1|Колонка 2|Колонка 3", 330, 30, 850, 110, $LVS_REPORT)
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
GUICtrlSetState($lstRightTop, $GUI_SHOW)
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Второй регион с ListView (справа в центре)
GUICtrlCreateGroup("", 320, 170, 870, 150)
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
Local $lstRightMiddle = GUICtrlCreateListView("Колонка 1|Колонка 2|Колонка 3", 330, 190, 850, 110, $LVS_REPORT)
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
GUICtrlSetState($lstRightMiddle, $GUI_SHOW)
GUICtrlCreateGroup("", -99, -99, 1, 1)

; Третий регион с ListView (справа снизу)
GUICtrlCreateGroup("", 320, 330, 870, 150)
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
Local $lstRightBottom = GUICtrlCreateListView("Колонка 1|Колонка 2|Колонка 3", 330, 350, 850, 110, $LVS_REPORT)
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
GUICtrlSetState($lstRightBottom, $GUI_SHOW)
GUICtrlCreateGroup("", -99, -99, 1, 1)

; --- НИЖНЯЯ ЧАСТЬ ---

; Седьмой регион с ListView (снизу на всю ширину окна)
GUICtrlCreateGroup("", 10, 490, 1180, 250)
GUICtrlSetResizing(-1, 2+4+64+512)
Local $lstBottom = GUICtrlCreateListView("Колонка 1|Колонка 2|Колонка 3", 20, 510, 1150, 210, $LVS_REPORT)
GUICtrlSetResizing(-1, 2+4+64+512)
GUICtrlSetState($lstBottom, $GUI_SHOW)
GUICtrlCreateGroup("", -99, -99, 1, 1)

; --- КНОПКИ ---

; Кнопка "Очистить"
Local $btnClear = GUICtrlCreateButton("Очистить", 950, 760, 100, 30)
GUICtrlSetResizing(-1, 4+64+256+512)

; Кнопка "Выход"
Local $btnExit = GUICtrlCreateButton("Выход", 1070, 760, 100, 30)
GUICtrlSetResizing(-1, 4+64+256+512)

GUISetState(@SW_SHOW)

; Основной цикл обработки событий
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE, $btnExit
            Exit
        Case $btnClear
            ; Очистка всех ListView
            _GUICtrlListView_DeleteAllItems($lstRightTop)
            _GUICtrlListView_DeleteAllItems($lstRightMiddle)
            _GUICtrlListView_DeleteAllItems($lstRightBottom)
            _GUICtrlListView_DeleteAllItems($lstBottom)
    EndSwitch
WEnd
В такой ситуации в правой части окна регионы с их ListView как бы налазят друг на друга, а хотелось бы, чтоб не перекрывали. Возможно смещались ниже. Тоесть чтобы расстояние между регионами в правой части было фиксированными. Я попробовал в правой части подставить
GUICtrlSetResizing(-1, 4+64+256+512) Но тогда регионы тянутся вправо и их позиция плавает. А хотелось бы чтоб регионы тянулись во все стороны . И разве что верхний на месте
Пробовал и так: GUICtrlSetResizing(-1, 2+4+32+64), но тоже не то что нужно
 

Sln

Знающий
Сообщения
49
Репутация
7
GUICtrlSetResizing тут не поможет.

делать через:
REG_MSG_WMSZ
REG_MSG_WSZ

там считать точные координаты элементов.

иногда проще не углубляться, а переделать интерфейс на то, что умеет GUICtrlSetResizing )
 
Последнее редактирование:
Автор
D

DyadyaGenya

Знающий
Сообщения
305
Репутация
10
Даже не нашел, что это за зверь такой. Только догадываюсь, что это с реестром связано. А потому не совсем понимаю, как это можно сделать с помощью реестра
иногда проще не углубляться, а переделать интерфейс на то, что умеет GUICtrlSetResizing )
можно, конечно, через скролы сделать, чтобы по вертикали скролить, а в ширину резиновыми оставить, но не совсем то, что хотелось. Я вот сделал почти как хотелось, через GUICtrlSetResizing(-1, 2+128) в правой и нижней части, но не хватает, чтобы упиралось при минимальном размере. Тоесть, чтобы не сжималось меньше какого-то размера, например, изначального. Или чтобы само окошко можно было сделать меньше изначального, а элементы нет.
Да и честно говоря, в моем варианте хоть и меняется размер, но как-то не пропорционально. Получается много свободного места.
 

Sln

Знающий
Сообщения
49
Репутация
7
Код:
#include <GUIConstantsEx.au3>
#include <GuiEdit.au3>
#include <WindowsConstants.au3>

; Создание главного окна
Global $my_gui = GUICreate("Окно", 600, 400, -1, -1, $WS_SIZEBOX)


Global $a = GUICtrlCreateGroup('', 5,  5, 200, 100)
GUICtrlSetResizing(-1, 2+32+256+512)
Global $b = GUICtrlCreateEdit('', 220, 12, 194,  90, $ES_AUTOVSCROLL+$ES_AUTOHSCROLL)
GUICtrlSetResizing(-1, 2+32+256+512)


GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_GETMINMAXINFO, 'REG_MSG_WMSZ')
GUIRegisterMsg($WM_SIZE         , 'REG_MSG_WSZ' )


; Основной цикл обработки событий
While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd








; Set min and max GUI sizes
Func REG_MSG_WMSZ($hWnd, $iMsg, $wParam, $lParam)
    Local $tMinMaxInfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)

    Local $lim[4] = [0, 0, 0, 0]

    Switch $hWnd
        Case $my_gui
            $_ = WinGetPos($my_gui)
            Local $lim[4] = [600, 400, 1000, 600]

            GUICtrlSetData($a, 'Win: ' & $_[0] & '/' & $_[1] & '/' & $_[2] & '/' & $_[3])
    EndSwitch

    DllStructSetData($tMinMaxInfo,  7, $lim[0])
    DllStructSetData($tMinMaxInfo,  8, $lim[1])
    DllStructSetData($tMinMaxInfo,  9, $lim[2])
    DllStructSetData($tMinMaxInfo, 10, $lim[3])

    Return 0
EndFunc




Func REG_MSG_WSZ ($hWnd, $iMsg, $wParam, $lParam)
    Local $W = _WinAPI_LoWord($lParam)
    Local $H = _WinAPI_HiWord($lParam)

    Switch $hWnd
        Case $my_gui
            Local $_ = WinGetPos($my_gui)
            GUICtrlSetData($b, 'Win: ' & $_[0] & '/' & $_[1] & '/' & $_[2] & '/' & $_[3])

            ; pos 1/3   тут точные координаты посчитать
            GUICtrlSetPos($b, 220, $_[3]/3, $_[2]-250, $_[3]/3)
    EndSwitch

EndFunc

такое решение, если без GUICtrlSetResizing
 
Автор
D

DyadyaGenya

Знающий
Сообщения
305
Репутация
10
такое решение, если без GUICtrlSetResizing
Очень интересный вариант. С dll я раньше так и не разобрался. Но у него есть проблемы. В таком виде при любом изменении размера окна поле для ввода сразу перемещается на горизонтальную линию окна. И нельзя увеличить до беспредела размер окна. Это я правда понял как изменить. Сделал вот так:
Код:
Func REG_MSG_WMSZ($hWnd, $iMsg, $wParam, $lParam)
    Local $tMinMaxInfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)

    Local $lim[4] = [0, 0]

    Switch $hWnd
        Case $my_gui
            $_ = WinGetPos($my_gui)
            Local $lim[4] = [100, 100]

            GUICtrlSetData($a, 'Win: ' & $_[0] & '/' & $_[1])
    EndSwitch

    DllStructSetData($tMinMaxInfo,  7, $lim[0])
    DllStructSetData($tMinMaxInfo,  8, $lim[1])

    Return 0
EndFunc

Ещё бы понять, как избежать перескакивания поля Эдит в горизонталь окна. Так понимаю, что это происходит в Func REG_MSG_WSZ? Но как?
 
Верх