Что нового

[Элементы GUI] динамический размер формы, но не менее, чем было

damien2008

Осваивающий
Сообщения
178
Репутация
34
всем привет.
перечитал форум. есть вопрос:
имеется форма, как сделать, что-бы элементы на форме при растягивании увеличивались,
а при уменьшении формы, меньше чем было исходное не уменьшались?

вот на такой самой простой форме:
Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("увеличить можно, а уменьшить - не менее чем было", 337, 417, -1, -1, BitOR($GUI_SS_DEFAULT_GUI,$WS_MAXIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_TABSTOP))
$Edit1 = GUICtrlCreateEdit("", 40, 24, 241, 337)
GUICtrlSetData(-1, "")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Элементы GUI] динамыческий размер формы, но не менее, чем было

damien2008,
Можно так попробовать сделать. Для точных размеров надо использовать _WinAPI_GetSystemMetrics().
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

;Opt('GUIResizeMode', $GUI_DOCKBORDERS)

Global $iXmin = 300, $iXmax = @DesktopWidth - 100, $iYmin = 300, $iYmax = @DesktopHeight - 100

$hGui = GUICreate('test', $iXmin, $iYmin, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP))
$nEdit = GUICtrlCreateInput('', 40, 40, 220, 220)
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
GUISetState()
GUIRegisterMsg($WM_GETMINMAXINFO, 'WM_GETMINMAXINFO')

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd

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', $iXmin) ; минимальные размеры окна
		DllStructSetData($tMINMAXINFO, 'MinTrackSizeY', $iYmin)
		DllStructSetData($tMINMAXINFO, 'MaxTrackSizeX', $iXmax) ; максимальные размеры окна
		DllStructSetData($tMINMAXINFO, 'MaxTrackSizeY', $iYmax)
	EndIf
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_GETMINMAXINFO
 
Автор
damien2008

damien2008

Осваивающий
Сообщения
178
Репутация
34
Re: [Элементы GUI] динамыческий размер формы, но не менее, чем было

madmasles, спасибо. подходит.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: [Элементы GUI] динамыческий размер формы, но не менее, чем было

damien2008,
Если не ошибаюсь, то с _WinAPI_GetSystemMetrics() так.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

Opt('GUIResizeMode', $GUI_DOCKBORDERS)

Global $iXmin = 300, $iXmax = @DesktopWidth - 100, $iYmin = 300, $iYmax = @DesktopHeight - 100, _
		$ix = _WinAPI_GetSystemMetrics($SM_CXFRAME) * 2, $iy = _WinAPI_GetSystemMetrics($SM_CYCAPTION) + $ix

$hGui = GUICreate('test', $iXmin, $iYmin, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX, $WS_THICKFRAME, $WS_TABSTOP))
$nEdit = GUICtrlCreateInput('', 40, 40, 220, 220)
;GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
GUISetState()
GUIRegisterMsg($WM_GETMINMAXINFO, 'WM_GETMINMAXINFO')

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd

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', $iXmin + $ix) ; минимальные размеры окна
		DllStructSetData($tMINMAXINFO, 'MinTrackSizeY', $iYmin + $iy)
		DllStructSetData($tMINMAXINFO, 'MaxTrackSizeX', $iXmax) ; максимальные размеры окна
		DllStructSetData($tMINMAXINFO, 'MaxTrackSizeY', $iYmax)
	EndIf
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_GETMINMAXINFO
 
Верх