Что нового

RSZ.au3 - Мини-UDF изменения размера эл-тов GUI, созданных с помощью UDF

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
AutoIt: 3.3.8.1
Версия: 4.5

Категория: Элементы GUI

Описание:
Первоначально задумывалось создание ф-ии _ControlSetResizing - аналога нативной ф-ии: GUICtrlSetResizing
для возможности задания характера поведения элементов GUI,созданных с помощью UDF , при изменении размеров окна GUI[/s].

В дальнейшем UDF дополнилась функцией _ControlResizing для изменения размеров элементов GUI с помощью Resize-линий
и несколькими сервисными функциями.

Возможности UDF:
* - задание характера поведения элементов GUI, созданных с помощью UDF , при изменении размеров окна GUI. (Ф-ия: _ControlSetResizing).
Примечание : По умолчанию задействован автоконтроль размеров элементов.
* - изменение размеров элементов GUI с помощью Resize-линий. (Ф-ия : _ControlResizing).
* - управление несколькими окнами.
Примечание : в случае создания дополнительных окон в процессе работы скрипта потребуется ф-ия : _InitGUI).
* - ограничения пределов изменения окон (Ф-ия : _SetGUI_MinSize).
* - использование автоограничения пределов изменения окон. (Опция : $i_Opt_Autodetect_MinSize=1 ).
Примечание : По умолчанию опция включена.Для отключения использовать установку : $i_Opt_Autodetect_MinSize=0.
продемонстрированы в демонстрационном примере Demo1:

Скриншот Demo 1:
Demo 1 RSZ.au3.gif


Demo 1:
Код:
#Include <WindowsConstants.au3>
	#Include <GuiConstantsEx.au3>
	#include <GuiRichEdit.au3>
	#include <GuiEdit.au3>
	#include <GuiTreeView.au3>
	#include <GuiTab.au3>
	#include <GuiToolbar.au3>
	#include <GuiListView.au3>
	#include <GuiListBox.au3>
	#include <GuiStatusBar.au3>
	#include "RSZ.au3"

	Global $a_Parts[3] = [175, 720, -1]
	Global $a_Text[3] = ["Левое выравнивание", @TAB & "Центр", @TAB & @TAB & "Правое выравнивание"]
	Global Enum $idNew = 1000, $idOpen, $idSave, $idHelp

	$h_Form = GUICreate("Demo 1", 1210, 655, -1, -1, $WS_OVERLAPPEDWINDOW)

	$h_Toolbar=_GUICtrlToolbar_Create($h_Form, 0x00000800 , $WS_EX_CLIENTEDGE)
	_GUICtrlToolbar_AddBitmap ($h_Toolbar, 1, -1, $IDB_STD_LARGE_COLOR)
	_GUICtrlToolbar_AddButton ($h_Toolbar, $idNew, $STD_FILENEW)
	_GUICtrlToolbar_AddButton ($h_Toolbar, $idOpen, $STD_FILEOPEN)
	_GUICtrlToolbar_AddButton ($h_Toolbar, $idSave, $STD_FILESAVE)
	_GUICtrlToolbar_AddButtonSep ($h_Toolbar)
	_GUICtrlToolbar_AddButton ($h_Toolbar, $idHelp, $STD_HELP)

	$h_TV1=_GUICtrlTreeView_Create($h_Form, 5, 40, 230, 290, $TVS_CHECKBOXES, $WS_EX_CLIENTEDGE)
	_ControlSetResizing(-1, $GUI_DOCKLeft+$GUI_DOCKWIDTH+$GUI_DOCKTop+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	_GUICtrlTreeView_SetBkColor($h_TV1, 0xCECEC2)
	_GUICtrlTreeView_Add($h_TV1, 0, "_TV (UDF)")

	GUICtrlCreateTreeView(5, 340, 230, 290, $TVS_CHECKBOXES, $WS_EX_CLIENTEDGE) 
	_ControlSetResizing(-1, $GUI_DOCKLeft+$GUI_DOCKSIZE+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	GUICtrlSetBkColor ( -1, 0xAECAE0 )
	_GUICtrlTreeView_Add(-1, 0, "TV (Native)") 

	$h_Tab = _GUICtrlTab_Create($h_Form, 245, 40, 642, 592)
	_ControlSetResizing(-1, $GUI_DOCKLeft+$GUI_DOCKRIGHT+$GUI_DOCKTop+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	_GUICtrlTab_InsertItem($h_Tab, 0, "Вкладка 1")
	_GUICtrlTab_InsertItem($h_Tab, 1, "Вкладка 2")

	$h_Rich=_GUICtrlRichEdit_Create($h_Form, '_RichEdit', 247, 62, 637, 270, -1, $WS_EX_CLIENTEDGE)
	_ControlSetResizing(-1, $GUI_DOCKLeft+$GUI_DOCKRIGHT+$GUI_DOCKTop+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	_GUICtrlRichEdit_SetBkColor($h_Rich, 0xC2CECE)

	_GUICtrlEdit_Create($h_Form, '_Edit (UDF)', 247, 340, 637, 200, -1, $WS_EX_CLIENTEDGE)
	_ControlSetResizing(-1, $GUI_DOCKLeft+$GUI_DOCKRIGHT+$GUI_DOCKHeighT+$GUI_DOCKBOTTOM); ===> RSZ.au3	

	GUICtrlCreateEdit('Edit (Native)',  247, 550, 637, 77, -1, $WS_EX_CLIENTEDGE)
	_ControlSetResizing(-1, $GUI_DOCKLeft+$GUI_DOCKRIGHT+$GUI_DOCKHeighT+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	GUICtrlSetBkColor ( -1, 0xAECAE0 )

	GUICtrlCreateListView("Колонка1|кол2|кол3  ", 895, 40, 310, 185, -1,$LVS_EX_GRIDLINES )
	_ControlSetResizing(-1, $GUI_DOCKRIGHT+$GUI_DOCKWIDTH+$GUI_DOCKTop+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	GUICtrlSetBkColor ( -1, 0xAECAE0 )
	_GUICtrlListView_AddItem(-1, "LV (Native)", 0)

	$h_ListView = _GUICtrlListView_Create($h_Form, "Колонка1|кол2|кол3  ", 895, 235, 310, 95)
	_ControlSetResizing(-1, $GUI_DOCKRIGHT+$GUI_DOCKSIZE+$GUI_DOCKBOTTOM)
	_GUICtrlListView_SetExtendedListViewStyle($h_ListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES )); ===> RSZ.au3	
	_GUICtrlListView_SetBkColor($h_ListView, 0xC2CECE)
	_GUICtrlListView_SetTextBkColor($h_ListView, 0xC2CECE)
	_GUICtrlListView_AddItem($h_ListView, "_LV (UDF)", 0)

	GUICtrlCreateList("List (Native)", 895, 340, 150, 295, $GUI_SS_DEFAULT_LIST)
	_ControlSetResizing(-1, $GUI_DOCKRIGHT+$GUI_DOCKSIZE+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	GUICtrlSetBkColor ( -1, 0xAECAE0 )

	_GUICtrlListBox_Create($h_Form, "ListBox (UDF)", 1055, 340, 150, 295)
	_ControlSetResizing(-1, $GUI_DOCKRIGHT+$GUI_DOCKSIZE+$GUI_DOCKBOTTOM)

	_GUICtrlStatusBar_Create ($h_Form, $a_Parts, $a_Text)

	$_ResLab_V1=GUICtrlCreateLabel("", 238, 40, 4, 592)
	_ControlSetResizing(-1, $GUI_DOCKLeft+$GUI_DOCKWIDTH+$GUI_DOCKTop+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	GUICtrlSetBkColor(-1, 0xCE00C0)
	GUICtrlSetCursor(-1, 13)
	$_ResLab_V2=GUICtrlCreateLabel("", 888, 40, 4, 592)
	_ControlSetResizing(-1, $GUI_DOCKRIGHT+$GUI_DOCKWIDTH+$GUI_DOCKTop+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	GUICtrlSetBkColor(-1, 0xCE00C0)
	GUICtrlSetCursor(-1, 13)
	$_ResLab_V3=GUICtrlCreateLabel("", 1047, 340, 4, 292)
	_ControlSetResizing(-1, $GUI_DOCKRIGHT+$GUI_DOCKSIZE+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	GUICtrlSetBkColor(-1, 0xCE00C0)
	GUICtrlSetCursor(-1, 13)
	$_ResLab_H1 = GUICtrlCreateLabel("", 5, 333, 230, 4)
	GUICtrlSetBkColor(-1, 0x0000C0)
	GUICtrlSetCursor(-1, 11)
	_ControlSetResizing(-1, $GUI_DOCKSIZE+$GUI_DOCKLeft+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	$_ResLab_H2 = GUICtrlCreateLabel("", 895, 227, 310, 4)
	GUICtrlSetBkColor(-1, 0x0000C0)
	GUICtrlSetCursor(-1, 11)
	_ControlSetResizing(-1, $GUI_DOCKSIZE+$GUI_DOCKRIGHT+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	$_ResLab_H3 = GUICtrlCreateLabel("", 895, 333, 310, 4)
	GUICtrlSetBkColor(-1, 0x0000C0)
	GUICtrlSetCursor(-1, 11)
	_ControlSetResizing(-1, $GUI_DOCKSIZE+$GUI_DOCKRIGHT+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	$_ResLab_H4 = GUICtrlCreateLabel("", 245, 333, 638, 4)
	GUICtrlSetBkColor(-1, 0x0000C0)
	GUICtrlSetCursor(-1, 11)
	_ControlSetResizing(-1, $GUI_DOCKLeft+$GUI_DOCKHeighT+$GUI_DOCKRIGHT+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	$_ResLab_H5 = GUICtrlCreateLabel("", 245, 543, 638, 4)
	GUICtrlSetBkColor(-1, 0x0000C0)
	GUICtrlSetCursor(-1, 11)
	_ControlSetResizing(-1, $GUI_DOCKLeft+$GUI_DOCKHeighT+$GUI_DOCKRIGHT+$GUI_DOCKBOTTOM); ===> RSZ.au3	

	_Register_WM_SIZE("Script_WM_SIZE"); ===> RSZ.au3	
	GUISetState()

	While 1
		$nMsg = GUIGetMsg()
		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				GUIDelete()
				Exit
			Case $_ResLab_V1 To $_ResLab_H5
				_ControlResizing($nMsg); ===> RSZ.au3	
		EndSwitch
	WEnd

	Func Script_WM_SIZE($hWnd, $nMsg, $wParam, $lParam)
		$aGUIPos=WinGetPos ($hWnd)
		Local $sText= _ 
			"Width = " & $aGUIPos[2]  & _
			"   Height = " & $aGUIPos[3] 
		WinSetTitle($hWnd, '',  $sText)
		Return $GUI_RUNDEFMSG
	EndFunc

При создании UDF основное внимание было уделено упрощению ее использования в скрипте.
Использование UDF в различных ситуациях показано на примерах :

Пример 1: Использование параметра по умолчанию($GUI_DOCKAUTO)
Код:
;Примечание :  Для изменения элементов только при изменении размеров окна GUI достаточно установление стиля окна($WS_SIZEBOX,$WS_OVERLAPPEDWINDOW и т.п.), 
	;              допускающего изменение размеров окна.Использования ф-й UDF не требуется.
	#Include <WindowsConstants.au3>
	#Include <GuiConstantsEx.au3>
	#include <GuiRichEdit.au3>
	#include <GuiEdit.au3>
	#include <GuiTreeView.au3>
	#include <GuiListView.au3>
	#include <GuiListBox.au3>
	#include "RSZ.au3"

	$h_Form = GUICreate("Example 1(Работа скрипта с параметрами по умолчанию)", 1010, 625, -1, -1, $WS_OVERLAPPEDWINDOW)

	$h_TV1=_GUICtrlTreeView_Create($h_Form, 5, 5, 235, 290, $TVS_CHECKBOXES, $WS_EX_CLIENTEDGE)
	_GUICtrlTreeView_SetBkColor($h_TV1, 0xCECEC2)
	_GUICtrlTreeView_Add($h_TV1, 0, "TV (UDF)")

	GUICtrlCreateTreeView(5, 300, 235, 320, $TVS_CHECKBOXES, $WS_EX_CLIENTEDGE) 
	GUICtrlSetBkColor ( -1, 0xAECAE0 )
	_GUICtrlTreeView_Add(-1, 0, "TV (Native)") 

	$h_Rich=_GUICtrlRichEdit_Create($h_Form, 'RichEdit', 247, 5, 434, 332, -1, $WS_EX_CLIENTEDGE)
	_GUICtrlRichEdit_SetBkColor($h_Rich, 0xC2CECE)

	_GUICtrlEdit_Create($h_Form, 'Edit (UDF)', 247, 340, 434, 205, -1, $WS_EX_CLIENTEDGE)

	GUICtrlCreateEdit('Edit (Native)',  247, 550, 434, 65, -1, $WS_EX_CLIENTEDGE)
	GUICtrlSetBkColor ( -1, 0xAECAE0 )

	GUICtrlCreateListView("Колонка1|кол2|кол3  ", 688, 5, 317, 190, -1,$LVS_EX_GRIDLINES )
	GUICtrlSetBkColor ( -1, 0xAECAE0 )
	_GUICtrlListView_AddItem(-1, "LV (Native)", 0)

	$h_ListView = _GUICtrlListView_Create($h_Form, "Колонка1|кол2|кол3  ", 688, 200, 315, 155)
	_GUICtrlListView_SetExtendedListViewStyle($h_ListView, $LVS_EX_GRIDLINES)
	_GUICtrlListView_SetBkColor($h_ListView, 0xC2CECE)
	_GUICtrlListView_SetTextBkColor($h_ListView, 0xC2CECE)
	_GUICtrlListView_AddItem($h_ListView, "LV (UDF)", 0)
	GUICtrlCreateList("List (Native)", 688, 360, 163, 260, $GUI_SS_DEFAULT_LIST)
	GUICtrlSetBkColor ( -1, 0xAECAE0 )
	$h_ListBox = _GUICtrlListBox_Create($h_Form, "ListBox (UDF)", 855, 360, 150, 265)

	GUISetState()

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

Пример 2. Использование ф- ии : _ControlSetResizing($hCtrl, $iResParameters)
Код:
; Примечание : Возмжно использование с параметром -1 : _ControlSetResizing(-1, $iResParameters)
	;              где $iResParameters - параметр нативной ф-ии : GUICtrlSetResizing
	#Include <WindowsConstants.au3>
	#Include <GuiConstantsEx.au3>
	#include <GuiRichEdit.au3>
	#include <GuiEdit.au3>
	#include <GuiTreeView.au3>
	#include <GuiTab.au3>
	#include <GuiListView.au3>
	#include "RSZ.au3"

	$h_Form = GUICreate("Example 2(_ControlSetResizing)", 1210, 625, -1, -1, $WS_OVERLAPPEDWINDOW)

	$h_TV1=_GUICtrlTreeView_Create($h_Form, 5, 5, 235, 615, $TVS_CHECKBOXES, $WS_EX_CLIENTEDGE)
	_ControlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKTOP+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	_GUICtrlTreeView_SetBkColor($h_TV1, 0xCECEC2)
	_GUICtrlTreeView_Add($h_TV1, 0, "TV (UDF)")

	$h_Tab = _GUICtrlTab_Create($h_Form, 245, 5, 640, 615 )
	_ControlSetResizing(-1, $GUI_DOCKBORDERS); ===> RSZ.au3	
	_GUICtrlTab_InsertItem($h_Tab, 0, "Вкладка 1")
	_GUICtrlTab_InsertItem($h_Tab, 1, "Вкладка 2")

	$h_Rich=_GUICtrlRichEdit_Create($h_Form, 'RichEdit', 247, 32, 634, 305, -1, $WS_EX_CLIENTEDGE)
	_ControlSetResizing(-1, $GUI_DOCKBORDERS); ===> RSZ.au3	
	_GUICtrlRichEdit_SetBkColor($h_Rich, 0xC2CECE)

	_GUICtrlEdit_Create($h_Form, 'Edit (UDF)', 247, 340, 634, 205, -1, $WS_EX_CLIENTEDGE)
	_ControlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM); ===> RSZ.au3	

	GUICtrlCreateEdit('Edit (Native)',  247, 550, 634, 65, -1, $WS_EX_CLIENTEDGE)
	_ControlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKRIGHT+$GUI_DOCKHEIGHT+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	GUICtrlSetBkColor ( -1, 0xAECAE0 )

	$h_ListView = _GUICtrlListView_Create($h_Form, "Колонка1|кол2|кол3  ", 890, 5, 315, 615)
	_ControlSetResizing(-1, $GUI_DOCKRIGHT+$GUI_DOCKWIDTH+$GUI_DOCKTOP+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	_GUICtrlListView_SetExtendedListViewStyle($h_ListView, $LVS_EX_GRIDLINES)
	_GUICtrlListView_SetBkColor($h_ListView, 0xC2CECE)
	_GUICtrlListView_SetTextBkColor($h_ListView, 0xC2CECE)
	_GUICtrlListView_AddItem($h_ListView, "LV (UDF)", 0)

	GUISetState()

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

Пример 3. Использование опции: Opt("GUIResizeMode", ...)
Код:
;Примечание : Использование опции аналогично использованию ее для нативных функций.
	#Include <WindowsConstants.au3>
	#Include <GuiConstantsEx.au3>
	#include <GuiEdit.au3>
	#include <GuiTreeView.au3>
	#include <GuiTab.au3>
	#include <GuiListView.au3>
	#include "RSZ.au3"

	Opt("GUIResizeMode",6)

	$h_Form = GUICreate("Example 3 (Set Option)", 950, 625, -1, -1, $WS_OVERLAPPEDWINDOW)

	$h_Tab = _GUICtrlTab_Create($h_Form, 5, 5, 640, 615 )
	_GUICtrlTab_InsertItem($h_Tab, 0, "Вкладка 1")
	_GUICtrlTab_InsertItem($h_Tab, 1, "Вкладка 2")

	$h_ListView = _GUICtrlListView_Create($h_Form, "Колонка1|кол2|кол3  ", 7, 32, 634, 305)
	_GUICtrlListView_SetExtendedListViewStyle($h_ListView, $LVS_EX_GRIDLINES)
	_GUICtrlListView_SetBkColor($h_ListView, 0xC2CECE)
	_GUICtrlListView_SetTextBkColor($h_ListView, 0xC2CECE)
	_GUICtrlListView_AddItem($h_ListView, "LV (UDF)", 0)

	_GUICtrlEdit_Create($h_Form, 'Edit (UDF)', 7, 340, 634, 205, -1, $WS_EX_CLIENTEDGE)

	GUICtrlCreateEdit('Edit (Native)',  7, 550, 634, 65, -1, $WS_EX_CLIENTEDGE)
	GUICtrlSetBkColor ( -1, 0xAECAE0 )

	$h_TV=_GUICtrlTreeView_Create($h_Form, 647, 5, 300, 615, $TVS_CHECKBOXES, $WS_EX_CLIENTEDGE)
	_ControlSetResizing(-1, $GUI_DOCKRIGHT+$GUI_DOCKWIDTH+$GUI_DOCKTOP+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	_GUICtrlTreeView_SetBkColor($h_TV, 0xCECEC2)
	_GUICtrlTreeView_Add($h_TV, 0, "TV (UDF)")

	GUISetState()

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

Пример 4. Использование ф- ии : _ControlResizing
Код:
; Примечание : При использовании формата :  _ControlResizing($Lab) задействуется автоконтроль размеров элементов
	; 					Для отключения автоконтроля следет использовать формат : _ControlResizing($Lab, False)
	#Include <GuiConstantsEx.au3>
	#Include <WindowsConstants.au3>
	#include <GuiRichEdit.au3>
	#include <GuiTreeView.au3>
	#include <GuiListView.au3>
	#include <GuiListBox.au3>
	#include "RSZ.au3"

	$h_Form = GUICreate("Example 4 (_ControlResizing)",  520, 455)

	$h_TV=_GUICtrlTreeView_Create($h_Form, 5, 5, 250, 210, $TVS_CHECKBOXES, $WS_EX_CLIENTEDGE)
	_GUICtrlTreeView_SetBkColor($h_TV, 0xCECEC2)
	_GUICtrlTreeView_Add($h_TV, 0, "TV (UDF)")

	$h_ListView = _GUICtrlListView_Create($h_Form, "Колонка1|кол2|кол3  ", 5, 225, 250, 225)
	_GUICtrlListView_SetExtendedListViewStyle($h_ListView, $LVS_EX_GRIDLINES)
	_GUICtrlListView_SetBkColor($h_ListView, 0xC2CECE)
	_GUICtrlListView_SetTextBkColor($h_ListView, 0xC2CECE)
	_GUICtrlListView_AddItem($h_ListView, "LV (UDF)", 0)

	$h_Rich=_GUICtrlRichEdit_Create($h_Form, 'RichEdit', 265, 5, 250, 210, -1, $WS_EX_CLIENTEDGE)
	_GUICtrlRichEdit_SetBkColor($h_Rich, 0xC2CECE)

	$h_ListBox = _GUICtrlListBox_Create($h_Form, "ListBox (UDF)", 265, 225, 250, 230)

	$_ResLab_V=GUICtrlCreateLabel("", 258, 5, 4, 445)
	GUICtrlSetBkColor(-1, 0xCE00C0)
	GUICtrlSetCursor(-1, 13)
	$_ResLab_H1 = GUICtrlCreateLabel("", 5, 218, 250, 4)
	GUICtrlSetBkColor(-1, 0x0000C0)
	GUICtrlSetCursor(-1, 11)
	$_ResLab_H2 = GUICtrlCreateLabel("", 265, 218, 250, 4)
	GUICtrlSetBkColor(-1, 0x0000C0)
	GUICtrlSetCursor(-1, 11)

	GUISetState()

	While 1
		$nMsg = GUIGetMsg()
		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				GUIDelete()
				Exit
			Case $_ResLab_V To $_ResLab_H2
				_ControlResizing($nMsg); ===> RSZ.au3
				;*** При необходимости можно разрешать выведение Resize-линий за пределы окна : ***
				;_ControlResizing($nMsg, False); ===> RSZ.au3	
		EndSwitch
	WEnd

Пример 5. Использование ф- ии : _SetGUI_MinSize
Код:
; Примечания : При включенной опции : $i_Opt_Autodetect_MinSize=1 (по умолчанию),некорректое ограничение минимальных параметров окна игнорируется.
	;              При установке опции : $i_Opt_Autodetect_MinSize=0  выполнится ограничение на любом уровне.
	#Include <WindowsConstants.au3>
	#Include <GuiConstantsEx.au3>
	#include <GuiRichEdit.au3>
	#include <GuiTreeView.au3>
	#include "RSZ.au3"

	$h_Form = GUICreate("Example 5 (_Set MinSize)",650, 425, -1, -1, $WS_OVERLAPPEDWINDOW)

	$id_Auto=GUICtrlCreateCheckbox("Автоограничение", 10, 0, 120)
	_ControlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKSize+$GUI_DOCKTOP); ===> RSZ.au3	
	GUICtrlSetState ( -1, $GUI_CHECKED)

	$h_TV=_GUICtrlTreeView_Create($h_Form, 5, 25, 250, 390, $TVS_CHECKBOXES, $WS_EX_CLIENTEDGE)
	_GUICtrlTreeView_SetBkColor($h_TV, 0xCECEC2)
	_GUICtrlTreeView_Add($h_TV, 0, "TV (UDF)")
	_ControlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWIDTH+$GUI_DOCKTOP+$GUI_DOCKBOTTOM); ===> RSZ.au3	

	$h_Rich=_GUICtrlRichEdit_Create($h_Form, 'RichEdit', 265, 5, 380, 410, -1, $WS_EX_CLIENTEDGE)
	_GUICtrlRichEdit_SetBkColor($h_Rich, 0xC2CECE)
	_ControlSetResizing(-1, $GUI_DOCKBORDERS); ===> RSZ.au3	

	_SetGUI_MinSize($h_Form, 200, 100); ===> RSZ.au3	

	GUISetState()

	While 1
		$nMsg = GUIGetMsg()
		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				GUIDelete()
				Exit
			Case $id_Auto
				If BitAND(GUICtrlRead($id_Auto), $GUI_CHECKED)=$GUI_CHECKED Then 
					$i_Opt_Autodetect_MinSize=1
				ElseIf BitAND(GUICtrlRead($id_Auto), $GUI_UNCHECKED)=$GUI_UNCHECKED Then 
					$i_Opt_Autodetect_MinSize=0
				EndIf
		EndSwitch
	WEnd

Пример 6. Использование в скрипте ф- ии : _Register_WM_SIZE("Script_WM_SIZE")
Код:
; Примечание : При необходимости выполнения дополнительных действий при изменениии размеров окна задействуется ф-ия, имя которой задается.
	#Include <WindowsConstants.au3>
	#Include <GuiConstantsEx.au3>
	#include <GuiListView.au3>
	#include "RSZ.au3"

	$h_Form = GUICreate("Example 6 (_Register WM_SIZE)", 550, 325, -1, -1, $WS_OVERLAPPEDWINDOW)

	$h_ListView = _GUICtrlListView_Create($h_Form, "Колонка1|кол2|кол3  ", 5, 5, 540, 315)
	_GUICtrlListView_SetExtendedListViewStyle($h_ListView, $LVS_EX_GRIDLINES)
	_GUICtrlListView_SetBkColor($h_ListView, 0xC2CECE)
	_GUICtrlListView_SetTextBkColor($h_ListView, 0xC2CECE)
	_GUICtrlListView_AddItem($h_ListView, "LV (UDF)", 0)

	_Register_WM_SIZE("Script_WM_SIZE"); ===> RSZ.au3	

	GUISetState()

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

	Func Script_WM_SIZE($hWnd, $nMsg, $wParam, $lParam)
		$aGUIPos=WinGetPos ($hWnd)
		Local $sText= _ 
			"Width = " & $aGUIPos[2]  & _
			"   Height = " & $aGUIPos[3] 
		WinSetTitle($hWnd, '',  $sText)
		Return $GUI_RUNDEFMSG
	EndFunc

Пример 7. Использование ф- ии _InitGUI : в многооконном скрипте
Код:
; Примечание : Первичная инициалицация элементов окон выполняется при первом наведении курсора мыши на главное окно.
	;              В случае создания в процессе работы скрипта дополнительных окон, требуется инициализация эл-тов дополнительного окна.
	#Include <WindowsConstants.au3>;~~~
	#Include <GuiConstantsEx.au3>;~~~
	#include <GuiRichEdit.au3>
	#include <GuiTreeView.au3>
	#include <GuiEdit.au3>
	#include "RSZ.au3"

	Global $h_GUI_2, $a_ResLab[1]

	$h_Form = GUICreate("Example 7 (n-Windows)", 550, 425, -1, -1, $WS_OVERLAPPEDWINDOW)

	$iFileMenu = GUICtrlCreateMenu("")
	$iViewMenu = GUICtrlCreateMenuItem("Win Create", -1)

	$h_Rich=_GUICtrlRichEdit_Create($h_Form, '_RichEdit', 5, 5, 340, 415, -1, $WS_EX_CLIENTEDGE)
	_GUICtrlRichEdit_SetBkColor($h_Rich, 0xC2CECE)
	_ControlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWidth+$GUI_DOCKTOP+$GUI_DOCKBOTTOM); ===> RSZ.au3	

	$h_TV1=_GUICtrlTreeView_Create($h_Form, 355, 5, 185, 415, $TVS_CHECKBOXES, $WS_EX_CLIENTEDGE)
	_ControlSetResizing(-1, $GUI_DOCKBorders); ===> RSZ.au3	
	_GUICtrlTreeView_SetBkColor($h_TV1, 0xCECEC2)
	_GUICtrlTreeView_Add($h_TV1, 0, "C:")

	$_ResLab_V=GUICtrlCreateLabel("", 348, 5, 4, 415)
	_ControlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWidth+$GUI_DOCKTOP+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	GUICtrlSetBkColor(-1, 0xCE00C0)
	GUICtrlSetCursor(-1, 13)

	$h_GUI_1 = GUICreate('1', 300, 400, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_SIZEBOX), $WS_EX_DLGMODALFRAME, $h_Form)

	$h_TV2= _GUICtrlTreeView_Create($h_GUI_1, 5, 5, 140, 370, -1, $WS_EX_CLIENTEDGE)
	_ControlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWidth+$GUI_DOCKTOP+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	_GUICtrlTreeView_SetBkColor($h_TV2, 0xCEC5C5)
	_GUICtrlTreeView_Add($h_TV2, 0, "C:")

	_GUICtrlEdit_Create($h_GUI_1, 'Edit (UDF)', 155, 5, 140, 370, -1, $WS_EX_CLIENTEDGE)
	_ControlSetResizing(-1, $GUI_DOCKBorders); ===> RSZ.au3

	GUICtrlCreateButton("Button 3",5, 380, 290, 20)
	_ControlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKRight++$GUI_DOCKBOTTOM++$GUI_DOCKHEIGHT); ===> RSZ.au3	

	$_ResLab_V2=GUICtrlCreateLabel("", 148, 5, 4, 370)
	_ControlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWidth+$GUI_DOCKTOP+$GUI_DOCKBOTTOM); ===> RSZ.au3	
	GUICtrlSetBkColor(-1, 0xCE00C0)
	GUICtrlSetCursor(-1, 13)

	_Register_WM_SIZE("Script_WM_SIZE"); ===> RSZ.au3	

	GUISetState(@SW_SHOW, $h_Form)
	GUISetState(@SW_SHOW, $h_GUI_1)

	While 1
		$aMsg = GUIGetMsg(1)
		Switch $aMsg[0]
			Case $GUI_EVENT_CLOSE
				If $aMsg[1]=$h_Form Then
					GUIDelete($h_Form )
					Exit
				Else
					GUISetState(@SW_HIDE, $aMsg[1])
				EndIf
			Case $_ResLab_V, $_ResLab_V2
				_ControlResizing($aMsg[0]); ===> RSZ.au3	
			Case $iViewMenu
				 _WinCreate()
		EndSwitch
		For $i = 1 To UBound($a_ResLab)-1
			If $a_ResLab[$i] =$aMsg[0] Then
				_ControlResizing($aMsg[0]); ===> RSZ.au3	
			EndIf
		Next
	WEnd

	Func Script_WM_SIZE($hWnd, $nMsg, $wParam, $lParam)
		$aGUIPos=WinGetPos ($hWnd)
		Local $sText= _ 
			"Width = " & $aGUIPos[2]  & _
			"   Height = " & $aGUIPos[3] 
		WinSetTitle($hWnd, '',  $sText)
		Return $GUI_RUNDEFMSG
	EndFunc

	Func _WinCreate()
		$h_GUI_2 = GUICreate('2', 300, 370,5, 5,  BitOR($WS_CAPTION, $WS_POPUP, $WS_SIZEBOX), $WS_EX_DLGMODALFRAME, $h_Form)
		
		Local $h_TV3= _GUICtrlTreeView_Create($h_GUI_2, 5, 5, 140, 340, -1, $WS_EX_CLIENTEDGE)
		_ControlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWidth+$GUI_DOCKTOP+$GUI_DOCKBOTTOM); ===> RSZ.au3	
		_GUICtrlTreeView_SetBkColor($h_TV3, 0xCEC5C5)
		_GUICtrlTreeView_Add($h_TV3, 0, "C:")
		
		_GUICtrlEdit_Create($h_GUI_2, 'Edit (UDF)', 155, 5, 140, 340, -1, $WS_EX_CLIENTEDGE)
		_ControlSetResizing(-1, $GUI_DOCKBorders); ===> RSZ.au3	
		
		GUICtrlCreateButton("Button 3",5, 350, 290, 20)
		_ControlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKRight++$GUI_DOCKBOTTOM++$GUI_DOCKHEIGHT); ===> RSZ.au3	
		
		Local $Lab=GUICtrlCreateLabel("", 148, 5, 4, 340)
		_ControlSetResizing(-1, $GUI_DOCKLEFT+$GUI_DOCKWidth+$GUI_DOCKTOP+$GUI_DOCKBOTTOM); ===> RSZ.au3	
		GUICtrlSetBkColor(-1, 0xCE00C0)
		GUICtrlSetCursor(-1, 13)
		
		_ArrayAdd($a_ResLab,$Lab)
		
		_InitGUI($h_GUI_2); ===> RSZ.au3	
		
		GUISetState(@SW_SHOW, $h_GUI_2)
	EndFunc

В архив также заложен тестовый пример на адекватность поведения элементов (Native & UDF).

Файл: RSZ v4.5.rar

История версий:
v1.0 - 01.09.2012
v2.0 - 03.09.2012
* Скорректирована работа при нескольких дочерних окнах
V2.1 - 04.09.2012
* Упрощено обращение к ф- ии :Теперь не надо указывать : Дескриптор окна ($hWnd) и необязателен : Дескриптор элемента ($hCtrl)
Достаточно :
_ControlSetResizing (-1, $iResParameters)
* В случае задания _ControlSetResizing() для элемента, созданного с помощью штатной ф-ии GUICreate
выполнится переадресация к штатной ф-ии :
GUICtrlSetResizing (-1, $iResParameters)
* Есть возможность задания минимальных параметров (для ф-ии WM_GETMINMAXINFO) окна для нескольких окон.
V3.0 - 10.09.2012
* Добавлена возможность перемещения изменения размеров элементов с помощью Resize-линий
Примечание : Перемещаемые элементы выявляются автоматически
V3.2 - ... .10.2012
* Увеличена скорость изменения размеров элементов с помощью Resize-линий за счет выведения автоопределения перемещаемых элементов
из функции перемещения (_ControlResize) в отдельную ф-ию ( _Init ) с однократным обращением к ней в начале работы скрипта и применением в автоопределении WinAPI.
* Добавлено автоопределение минимально допустимых размеров окна с сохранением возможности задания минимальных параметров (для ф-ии WM_GETMINMAXINFO)
(Примечание. Автоопределение контролирует только неравенство 0 размеров элементов и нестолкновение элементов с границами окна)
* Добавлена реакция элементов GUI, созданных с помощью UDF на установку Опции : Opt("GUIResizeMode")
V4.1 - 14 .11.2012 Файл: RSZ v4.1.rar
* Изменен принцип инициализации элементов. Теперь инициализация (и выявление перемещаемых элементов) выполняется и при свернутом состоянии окна.
V4.5 - 27 .06.2013
* Изменен принцип инициализации элементов. Теперь первичная инициализация выполняется при первом наведении курсора на главное окно скрипта.Дополнительная инициализация
может потребоваться только в случае создания новых окон в процессе работы скрипта (Пример 7).
* Упрощено встраивание UDF в скрипт. Теперь используются в основном 2 ф-ии (_ControlSetResizing и _ControlResize).
Остальные 3 ф-ии являются сервисными и используются по необходимости.
* Обеспечена возможность упрощенного использования UDF :
- Только в режиме изменения размера окон (Примеры 1-3).
- Только в режиме изменения с помощью Resize-линий (Пример 4).
- В комбинированном режиме.(Demo 1)
* Добавлена возможность включения режима выведения Resize-линий за пределы окна, игнорируя автоопределение размеров эл-тов (Пример 4).
* Добавлена возможность отключения режима автоограничения размеров окон.(Пример 5)
* Упрощено использование cкриптовой ф-ии WM_SIZE (Пример 6).

Источник: autoit-script.ru
Автор: gregaz
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Отлично, мне как раз это нужно...


P.S.
Я сам как то давно пытался такое сделать, но забросил идею.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
CreatoR [?]
сам как то давно пытался такое сделать, но забросил идею.
Я помню, были наброски , но не было алгоритма . http://autoit-script.ru/index.php/topic,4531.0.html
Кстати здесь я использовал некоторые идеи из тех набросков.
Ну а алгоритм вроде бы получился.



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

Кстати вопрос :
Как проще получить Handle последнего созданного контрола, чтобы задействовать -1 вместо Handle ?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
gregaz [?]
Как проще получить Handle последнего созданного контрола, чтобы задействовать -1 вместо Handle ?
GUICtrlGetHandle(-1)?
Хотя это не то, нужно получать для внешних элементов, но нужно учесть что не все элементы имеют ID.

Я обычно так делаю:

Код:
#include <GUIConstantsEx.au3>
#include <GUIEdit.au3>
#include <WinAPIEx.au3>

$hGUI = GUICreate("Test Script", 300, 200)

$iButton = GUICtrlCreateButton("Button", 20, 40, 60, 20)
$hEdit = _GUICtrlEdit_Create($hGUI, '', 20, 60, 100, 100)
MsgBox(64, 'Title', __GetLastCtrlID($hGUI))

GUISetState(@SW_SHOW, $hGUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iButton
			
	EndSwitch
WEnd

Func __GetLastCtrlID($hWnd = 0)
	Local $hID = GUICtrlGetHandle(-1)
	Local $aRet
	
	If HWnd($hWnd) Then
		Local $aChildWins = _WinAPI_EnumChildWindows($hWnd, False)
		
		If Not @error Then
			$aRet = DllCall('user32.dll', 'int', 'GetDlgCtrlID', 'hwnd', $aChildWins[$aChildWins[0][0]][0])
			
			If Not @error Then
				Return $aRet[0]
			EndIf
		Else
			$aRet = DllCall('user32.dll', 'int', 'GetDlgCtrlID', 'hwnd', $hID)
			
			If Not @error Then
				Return $aRet[0]
			EndIf
		EndIf
	EndIf
	
	Return SetError(1, 0, 0)
EndFunc
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Спасибо за помощь и идеи Creatorу
Обновил :
V2.1 - 04.09.2012
* Упрощено обращение к ф- ии :Теперь не надо указывать : Дескриптор окна ($hWnd) и необязателен : Дескриптор элемента ($hCtrl)
Достаточно :
_ControlSetResizing (-1, $iResParameters)
* В случае задания _ControlSetResizing() для элемента, созданного с помощью штатной ф-ии GUICreate
выполнится переадресация к штатной ф-ии :
GUICtrlSetResizing (-1, $iResParameters)
* Есть возможность задания минимальных параметров (для ф-ии WM_GETMINMAXINFO) окна для нескольких окон.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Обновление :
V3.0 - 10.09.2012
* Добавлена возможность перемещения изменения размеров элементов с помощью Resize-линий
Примечание : Перемещаемые элементы выявляются автоматически
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
gregaz,
3.3.6.1 ругается на строку
Код:
GUICtrlSetPos($ResLab, $iX_Lab)
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
madmasles [?]
3.3.6.1 ругается на строку
Для 3.3.8.1 - нормально
Проверить не могу.
Наверняка надо будет поменять :

Код:
GUICtrlSetPos($ResLab, $iX_Lab)

на :
Код:
GUICtrlSetPos($ResLab, $iX_Lab, Default)



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

Действительно в 3.3.6.1 (судя по справкам)
Этот( 2-й) параметр еще не был опциональным
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
gregaz [?]
Обновление :
* Увеличена скорость изменения размеров элементов с помощью Resize-линий за счет выведения автоопределения перемещаемых элементов
из функции перемещения (_ControlResize) в отдельную ф-ию ( _Init ) с однократным обращением к ней в начале работы скрипта и применением в автоопределении WinAPI.
* Добавлено автоопределение минимально допустимых размеров окна с сохранением возможности задания минимальных параметров (для ф-ии WM_GETMINMAXINFO)
(Примечание. Автоопределение контролирует только неравенство 0 размеров элементов и нестолкновение элементов с границами окна)
* Добавлена реакция элементов GUI, созданных с помощью UDF на установку Опции : Opt("GUIResizeMode")


* Изменен принцип инициализации элементов. Теперь инициализация (и выявление перемещаемых элементов) выполняется и при свернутом состоянии окна
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Обновил до версии 4.5
gregaz [?]
V4.5 - 27 .06.2013
* Изменен принцип инициализации элементов. Теперь первичная инициализация выполняется при первом наведении курсора на главное окно скрипта.Дополнительная инициализация
может потребоваться только в случае создания новых окон в процессе работы скрипта (Пример 7).
* Упрощено встраивание UDF в скрипт. Теперь используются в основном 2 ф-ии (_ControlSetResizing и _ControlResize).
Остальные 3 ф-ии являются сервисными и используются по необходимости.
* Обеспечена возможность упрощенного использования UDF :
- Только в режиме изменения размера окон (Примеры 1-3).
- Только в режиме изменения с помощью Resize-линий (Пример 4).
- В комбинированном режиме.(Demo 1)
* Добавлена возможность включения режима выведения Resize-линий за пределы окна, игнорируя автоопределение размеров эл-тов (Пример 4).
* Добавлена возможность отключения режима автоограничения размеров окон.(Пример 5)
* Упрощено использование cкриптовой ф-ии WM_SIZE (Пример 6).
 

mike2003

Новичок
Сообщения
10
Репутация
0
Как скачать? При клике на Файл: RSZ v4.5.rar просто кидает на главную страницу форума :aggressive:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Ссылки исправлены.
 
Верх