Что нового

Грамотный ресайз форм (код приложен)

Suppir

Продвинутый
Сообщения
967
Репутация
62
Добрый день!

Вот код (фрагмент с GUI):

Код:
#Include <GuiEdit.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

Opt("ExpandVarStrings", 1)
AutoItSetOption("GUIResizeMode", 802)

$Form1 = GUICreate("NSR-авто", 737, 642, 303, 157, BitOR($WS_MAXIMIZEBOX,$WS_MINIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_SYSMENU,$WS_CAPTION,$WS_OVERLAPPEDWINDOW,$WS_TILEDWINDOW,$WS_POPUP,$WS_POPUPWINDOW,$WS_GROUP,$WS_TABSTOP,$WS_BORDER,$WS_CLIPSIBLINGS))


$font = "Arial"
GUISetFont(10, $font)
$Edit1 = GUICtrlCreateEdit("", 3, 65, 368, 576, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_WANTRETURN))
GUICtrlSetResizing(-1, 102)
GUICtrlSetLimit($Edit1, 99999999)
$Edit2 = GUICtrlCreateEdit("", 370, 65, 363, 576, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_WANTRETURN))
GUICtrlSetResizing(-1, 102)
GUICtrlSetLimit($Edit2, 99999999)
$Button1 = GUICtrlCreateButton("Создать NSR", 580, 15, 71, 41, BitOR($BS_MULTILINE, $WS_CLIPSIBLINGS))
$Input1 = GUICtrlCreateInput("", 395, 35, 96, 21, BitOR($ES_AUTOHSCROLL, $ES_NUMBER))
$Combo1 = GUICtrlCreateCombo("", 105, 35, 256, 25, $CBS_DROPDOWNLIST)
GUICtrlSetData(-1, "Управление ФНС, вопрос-ответ|Управление ФНС, разъяснение|Избирком края, постановление|Роснедвижимость, вопрос-ответ|Деп. здравоохранения, приказ|Краснодарстат, информация|Объектные топики")
$Button3 = GUICtrlCreateButton("Сохранить NSR", 655, 15, 71, 41, BitOR($BS_MULTILINE, $WS_CLIPSIBLINGS))
$Label1 = GUICtrlCreateLabel("Начать с топика", 393, 15, 100, 17)
$Label2 = GUICtrlCreateLabel("Использовать враппер", 170, 15, 172, 17)
$Button2 = GUICtrlCreateButton("?", 365, 35, 21, 21, 0)
GUICtrlSetState(-1, $GUI_DISABLE)
$Button5 = GUICtrlCreateButton("Пакетная замена", 10, 15, 86, 41, $BS_MULTILINE)
$Button4 = GUICtrlCreateButton("Проверить строки", 505, 15, 71, 41, $BS_MULTILINE)
GUICtrlSetState(-1, $GUI_DISABLE)
GUISetState(@SW_SHOW)

While 1
	$Msg = GUIGetMsg()
	Switch $Msg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			_Wrap()
		Case $Button3
			_SaveAs()
		Case $Button5
			_SearchAndChange()

	EndSwitch
WEnd


Подскажите, пожалуйта по вопросам (бьюсь уже второй день с этим GUI):

1. Я хочу, чтобы при изменении размеров $Form1 верхнее серое меню с кнопками оставалось как сейчас.
Два $Edit'а должны сохранять свое положение друг относительно друга (одинаковая высота, ширина). Однако они ведут себя неверно и перекрывают друг друга. Как это исправить?

2. Как установить минимальный размер $Form1 при ресайзе? Хочу выставить по ширине 737, по высоте 642 (как при создании). Т.е., чтобы форма могла только увеличиваться, но не уменьшаться (и кнопки не скрывались)

3. Как сделать так, чтобы при изменении горизонтального размера одного $Edit менялся размер другого $Edit? Т.е. хочу, чтобы при уменьшении ширины одного $Edit, ширина другого $Edit увеличивалась?




Добавлено:
Сообщение автоматически объединено:

По ширине получается нормально, когда для $Edit'ов установлен
GUICtrlSetResizing(-1, 128)

Однако при этом $Edit'ы отдаляются от верхнего меню (между меню и $Edit'ами должна быть фиксированная величина)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 156
Репутация
2 329
1. Верхние элементы у меня не смещаются в указанном примере.
2. См. пример ниже.
3. См. пример ниже :smile:
Код:
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Include <GUIEdit.au3>
;

Global $iMINGuiX = 737, $iMINGuiY = 642, $iMAXGuiX = @DesktopWidth, $iMAXGuiY = @DesktopHeight

Opt("ExpandVarStrings", 1)
Opt("GUIResizeMode", $GUI_DOCKALL)

$Form1 = GUICreate("NSR-авто", $iMINGuiX, $iMINGuiY, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_THICKFRAME, $WS_OVERLAPPEDWINDOW, $WS_TILEDWINDOW,$WS_POPUPWINDOW, $WS_GROUP, $WS_TABSTOP, $WS_BORDER, $WS_CLIPSIBLINGS))

$font = "Arial"
GUISetFont(10, $font)
$Edit1 = GUICtrlCreateEdit("", 3, 65, 368, 576, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_WANTRETURN))
GUICtrlSetResizing(-1, $GUI_DOCKTOP+$GUI_DOCKBOTTOM+$GUI_DOCKLEFT)
GUICtrlSetLimit($Edit1, 99999999)
$Edit2 = GUICtrlCreateEdit("", 370, 65, 363, 576, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_WANTRETURN))
GUICtrlSetResizing(-1, $GUI_DOCKTOP+$GUI_DOCKBOTTOM+$GUI_DOCKRIGHT)
GUICtrlSetLimit($Edit2, 99999999)
$Button1 = GUICtrlCreateButton("Создать NSR", 580, 15, 71, 41, BitOR($BS_MULTILINE, $WS_CLIPSIBLINGS))
$Input1 = GUICtrlCreateInput("", 395, 35, 96, 21, BitOR($ES_AUTOHSCROLL, $ES_NUMBER))
$Combo1 = GUICtrlCreateCombo("", 105, 35, 256, 25, $CBS_DROPDOWNLIST)
GUICtrlSetData(-1, "Управление ФНС, вопрос-ответ|Управление ФНС, разъяснение|Избирком края, постановление|Роснедвижимость, вопрос-ответ|Деп. здравоохранения, приказ|Краснодарстат, информация|Объектные топики")
$Button3 = GUICtrlCreateButton("Сохранить NSR", 655, 15, 71, 41, BitOR($BS_MULTILINE, $WS_CLIPSIBLINGS))
$Label1 = GUICtrlCreateLabel("Начать с топика", 393, 15, 100, 17)
$Label2 = GUICtrlCreateLabel("Использовать враппер", 170, 15, 172, 17)
$Button2 = GUICtrlCreateButton("?", 365, 35, 21, 21, 0)
GUICtrlSetState(-1, $GUI_DISABLE)
$Button5 = GUICtrlCreateButton("Пакетная замена", 10, 15, 86, 41, $BS_MULTILINE)
$Button4 = GUICtrlCreateButton("Проверить строки", 505, 15, 71, 41, $BS_MULTILINE)
GUICtrlSetState(-1, $GUI_DISABLE)

GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")
GUISetState(@SW_SHOW)

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            ;_Wrap()
        Case $Button3
            ;_SaveAs()
        Case $Button5
            ;_SearchAndChange()
    EndSwitch
WEnd

Func WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
	Local $stMinMaxInfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
	
	Local $aWinPos = WinGetPos($hWnd)
	Local $aWinClientSize = WinGetClientSize($hWnd)
	
	Local $iBorder_Width = $aWinPos[2] - $aWinClientSize[0]
	Local $iCaption_Height = $aWinPos[3] - $aWinClientSize[1]
	
	DllStructSetData($stMinMaxInfo, 7, $iMINGuiX+$iBorder_Width) ; min X
	DllStructSetData($stMinMaxInfo, 8, $iMINGuiY+$iCaption_Height) ; min Y
	DllStructSetData($stMinMaxInfo, 9, $iMAXGuiX) ; max X
	DllStructSetData($stMinMaxInfo, 10, $iMAXGuiY) ; max Y
	
	Return $GUI_RUNDEFMSG
EndFunc
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Ааа, заработало! Спасибо! :smile:


Добавлено:
Сообщение автоматически объединено:

Насчет третьего пункта - я имел в виду, чтобы перегородку между Edit'ами можно было двигать влево-вправо.
Ну да ладно, и так хорошо :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 156
Репутация
2 329
Suppir [?]
я имел в виду, чтобы перегородку между Edit'ами можно было двигать влево-вправо.
Типа разделитель? Тогда вот:
Код:
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Include <GUIEdit.au3>
;

Global $iMINGuiX = 737, $iMINGuiY = 642, $iMAXGuiX = @DesktopWidth, $iMAXGuiY = @DesktopHeight

Opt("ExpandVarStrings", 1)
Opt("GUIResizeMode", $GUI_DOCKALL)

$Form1 = GUICreate("NSR-авто", $iMINGuiX, $iMINGuiY, -1, -1, _
	BitOR($GUI_SS_DEFAULT_GUI, $WS_THICKFRAME, $WS_OVERLAPPEDWINDOW, $WS_TILEDWINDOW, $WS_TABSTOP))

$sFont = "Arial"
GUISetFont(10, $sFont)

$Edit1 = GUICtrlCreateEdit("", 3, 65, 361, 576, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_WANTRETURN))
GUICtrlSetResizing(-1, $GUI_DOCKTOP+$GUI_DOCKBOTTOM+$GUI_DOCKVCENTER)
;GUICtrlSetLimit($Edit1, 99999999)

$Edit2 = GUICtrlCreateEdit("", 370, 65, 363, 576, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_WANTRETURN))
GUICtrlSetResizing(-1, $GUI_DOCKTOP+$GUI_DOCKBOTTOM+$GUI_DOCKVCENTER)
;GUICtrlSetLimit($Edit2, 99999999)

$Button1 = GUICtrlCreateButton("Создать NSR", 580, 15, 71, 41, BitOR($BS_MULTILINE, $WS_CLIPSIBLINGS))
$Input1 = GUICtrlCreateInput("", 395, 35, 96, 21, BitOR($ES_AUTOHSCROLL, $ES_NUMBER))
$Combo1 = GUICtrlCreateCombo("", 105, 35, 256, 25, $CBS_DROPDOWNLIST)
GUICtrlSetData(-1, "Управление ФНС, вопрос-ответ|Управление ФНС, разъяснение|Избирком края, постановление|Роснедвижимость, вопрос-ответ|Деп. здравоохранения, приказ|Краснодарстат, информация|Объектные топики")

$Button3 = GUICtrlCreateButton("Сохранить NSR", 655, 15, 71, 41, BitOR($BS_MULTILINE, $WS_CLIPSIBLINGS))
$Label1 = GUICtrlCreateLabel("Начать с топика", 393, 15, 100, 17)
$Label2 = GUICtrlCreateLabel("Использовать враппер", 170, 15, 172, 17)
$Button2 = GUICtrlCreateButton("?", 365, 35, 21, 21, 0)
GUICtrlSetState(-1, $GUI_DISABLE)

$Button5 = GUICtrlCreateButton("Пакетная замена", 10, 15, 86, 41, $BS_MULTILINE)
$Button4 = GUICtrlCreateButton("Проверить строки", 505, 15, 71, 41, $BS_MULTILINE)
GUICtrlSetState(-1, $GUI_DISABLE)

$Resizer_Label = GUICtrlCreateLabel("", 365, 65, 4, 576)
GUICtrlSetCursor(-1, 13)

GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")

GUISetState(@SW_SHOW)

While 1
    $Msg = GUIGetMsg()
   
	Switch $Msg
		Case $GUI_EVENT_CLOSE
            Exit
		Case $GUI_EVENT_PRIMARYDOWN
			$aCur_Info = GUIGetCursorInfo($Form1)
			$aOrigin_ResLabel_Pos = ControlGetPos($Form1, "", $Resizer_Label)
			If $aCur_Info[4] <> $Resizer_Label Then ContinueLoop
			
			GUICtrlSetBkColor($Resizer_Label, 0xCCC0C0)
			
			While $aCur_Info[2] = 1
				$aCur_Info = GUIGetCursorInfo($Form1)
				GUICtrlSetPos($Resizer_Label, $aCur_Info[0]-2, 65)
			WEnd
			
			$aCur_Info[0] -= 5
			$iGUI_Pos = WinGetPos($Form1)
			
			GUICtrlSetBkColor($Resizer_Label, $GUI_BKCOLOR_TRANSPARENT)
			
			If $aCur_Info[0] < 10 Or $aCur_Info[0] > $iGUI_Pos[2]-30 Then
				GUICtrlSetPos($Resizer_Label, $aOrigin_ResLabel_Pos[0], 65)
				ContinueLoop
			EndIf
			
			GUICtrlSetPos($Resizer_Label, $aCur_Info[0]+5, 65)
			GUICtrlSetPos($Edit1, 3, 65, $aCur_Info[0])
			GUICtrlSetPos($Edit2, $aCur_Info[0]+10, 65, $iGUI_Pos[2]-$aCur_Info[0]-22)
        Case $GUI_EVENT_MAXIMIZE, $GUI_EVENT_RESTORE, $GUI_EVENT_RESIZED
			Local $aEdit1_Pos = ControlGetPos($Form1, "", $Edit1)
			
			$aEdit1_Pos[2] += 5
			If $Msg = $GUI_EVENT_MAXIMIZE Then $aEdit1_Pos[2] += 5
			
			GUICtrlSetPos($Resizer_Label, $aEdit1_Pos[2], $aEdit1_Pos[1], 4, $aEdit1_Pos[3])
		Case $Button1
            ;_Wrap()
        Case $Button3
            ;_SaveAs()
        Case $Button5
            ;_SearchAndChange()
    EndSwitch
WEnd

Func WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
	Local $stMinMaxInfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
	
	Local $aWinPos = WinGetPos($hWnd)
	Local $aWinClientSize = WinGetClientSize($hWnd)
	
	Local $iBorder_Width = $aWinPos[2] - $aWinClientSize[0]
	Local $iCaption_Height = $aWinPos[3] - $aWinClientSize[1]
	
	Local $aEdit1_Pos = ControlGetPos($Form1, "", $Edit1)
	GUICtrlSetPos($Resizer_Label, $aEdit1_Pos[2]+10, $aEdit1_Pos[1], 4, $aEdit1_Pos[3])
	
	DllStructSetData($stMinMaxInfo, 7, $iMINGuiX+$iBorder_Width) ; min X
	DllStructSetData($stMinMaxInfo, 8, $iMINGuiY+$iCaption_Height) ; min Y
	DllStructSetData($stMinMaxInfo, 9, $iMAXGuiX) ; max X
	DllStructSetData($stMinMaxInfo, 10, $iMAXGuiY) ; max Y
	
	Return $GUI_RUNDEFMSG
EndFunc
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Это просто Супер! :IL_AutoIt_1:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Автор темы Похожие темы Форум Ответы Дата
X EVE Online 9
Похожие темы
Теория ресайза...
Верх