Что нового

[Элементы GUI] Выполнить корректный Resize элементов

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Просьба помочь выполнить сложный ресайз GUI-элементов.
Несколько дней бьюсь , но так и не смог его грамотно выполнить вместе.

Необходимо обеспечить ресайз элементов при :
1. Перемещении линий между элементами
2. При изменении размеров самого окна
3. При максимизации окна(восстановлении)

При изменении высоты окна должна изменяться только высота верхних элементов
При изменении ширины окна должна изменяться только ширина крайних левых элементов

Необходима возможность ресайза элементов (с помощью линий) и в режиме $GUI_EVENT_MAXIMIZE,
с сохранением изменений после $GUI_EVENT_RESTORE

Тестовый вариант формы приложен :

Код:
#include-once
#include <GuiRichEdit.au3>
#include <WindowsConstants.au3>
#include <GuiConstants.au3>
#include <GuiConstantsEx.au3>
#include <StaticConstants.au3>
#Include <GUITreeView.au3>
#Include <TreeViewConstants.au3>
#Include <GuiListView.au3>
#Include <ListViewConstants.au3>
#Include <IE.au3>

$hForm = GUICreate('Test', 1200, 800, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_THICKFRAME, $WS_OVERLAPPEDWINDOW, $WS_TILEDWINDOW, $WS_TABSTOP))
GUISetBkColor(0xECE9D8 )

GUICtrlCreateLabel("", 0, 2, 1200, 2,0x1000)
GUICtrlCreateLabel("", 0, 33, 1200 ,2,0x1000)
GUICtrlCreateLabel("", 0, 770, 1200 ,2,0x1000)

$Resizer_Label1a=GUICtrlCreateLabel("", 5,536,594,2)
GUICtrlSetBkColor(-1, 0xC0c000)
GUICtrlSetCursor(-1, 13)
$Resizer_Label1b=GUICtrlCreateLabel("", 604,536,314,2)
GUICtrlSetBkColor(-1, 0xC0c000)
GUICtrlSetCursor(-1, 13)
$Resizer_Label1c=GUICtrlCreateLabel("", 925,536,270,2)
GUICtrlSetBkColor(-1, 0xC0c000)
GUICtrlSetCursor(-1, 13)

$Resizer_Label2=GUICtrlCreateLabel("", 600,35,2,734)
GUICtrlSetBkColor(-1, 0xC0c000)
GUICtrlSetCursor(-1, 13)

$Resizer_Label3=GUICtrlCreateLabel("", 920,35,2,734)
GUICtrlSetBkColor(-1, 0xC0c000)
GUICtrlSetCursor(-1, 13)

$hR_Edit1 = _GUICtrlRichEdit_Create($hForm,'Edit1', 5, 35, 594, 500)
_GUICtrlRichEdit_SetBkColor($hR_Edit1,0xffffC0)
$hR_Edit2 = _GUICtrlRichEdit_Create($hForm,'Edit2',5, 540, 594, 230)
_GUICtrlRichEdit_SetBkColor($hR_Edit2,0xffffC0)

$oIE1 = _IECreateEmbedded ()
$GUIActiveX1 = GUICtrlCreateObj($oIE1, 604, 35, 314, 500)
_IENavigate ($oIE1, "C:\WINDOWS\Web\Wallpaper\Chip_Wallpapers (32).jpg")
$oIE2 = _IECreateEmbedded ()
$GUIActiveX2 = GUICtrlCreateObj($oIE2, 604, 540, 314, 230)
_IENavigate ($oIE2, "http://autoit-script.ru/index.php")
$hTreeView=_GUICtrlTreeView_Create($hForm,925, 35, 270, 500,-1,$WS_EX_CLIENTEDGE)
_GUICtrlTreeView_SetBkColor($hTreeView, 0xC0ffff)
$hListView=_GUICtrlListView_Create($hForm," FileName | Path ",925, 540, 270, 230,-1,$WS_EX_CLIENTEDGE)
_GUICtrlListView_SetBkColor($hListView, 0xffffC0)
_GUICtrlListView_SetTextBkColor($hListView, 0xffffC0)

GUISetState()

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Элементы GUI] Выполнить корректный ресайз элементов

{LangWarn.Admin}

Я про “ресайз”.

Что касается темы. Для изменения размера элементов разделителями, можно использовать GUIFrame, а остальное думаю не сложно настроить через GUICtrlSetResizing.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: [Элементы GUI] Выполнить корректный ресайз элементов

gregaz, посмотри пример для TVExplorer UDF.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
CreatoR [?]
а остальное думаю не сложно настроить через GUICtrlSetResizing.
Видите ли (как я уже сказал), по отдельности
Resize с помощью линий я делал - работает (с использованием GUICtrlSetResizing)
Однако после изменения размеров окна вторичная попытка изменить размер Объекта $GUIActiveX1 приводит к зависанию (или как, говорят радиолюбители : к возбуждению системы), которое устраняется следующим изменением размеров окна.
Приходится давать небольшой WinMove (хоть на 1 пиксель).
Возможно причина в том,что 4- элемента из 6 при изменении размеров окна не перемещеются (для их перемещения требуется ControlMove)
Два оставшиеся (именно $GUIActiveX ) сами премещаются . Для их перемещения достаточно GUICtrlSetResizing

Ну и при перемещении линии в максисмизированном состоянии окна , после $GUI_EVENT_RESTORE не могу сохранить пропорции.
Попытка использовать $WS_EX_COMPOSITED для устранения мельканий в процессе также не удается
Может кто-нибудь покажет полную организацию
хотя бы для двух элементов (из которых 1-перемещающися с помощью только ControlMove, другой - $GUIActiveX)
Уж больно достал этот ресайз.








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

Yashied [?]
gregaz, посмотри пример для TVExplorer UDF.
Я не только смотрел, но и использовал (,но там только TReeView)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AZJIO [?]
сначала нужно найти способ изменения размера RichEdit.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>

$hForm = GUICreate('Test', 333, 333, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_THICKFRAME, $WS_OVERLAPPEDWINDOW, $WS_TILEDWINDOW, $WS_TABSTOP), $WS_EX_COMPOSITED)
$hR_Edit1 = _GUICtrlRichEdit_Create($hForm, 'Edit1', 5, 35, 222, 222)

GUICtrlCreateButton('Button', 233, 35, 70, 25)
GUICtrlSetResizing(-1, BitOR($GUI_DOCKRIGHT, $GUI_DOCKTOP, $GUI_DOCKSIZE))

GUISetState()
GUIRegisterMsg($WM_SIZE, "WM_SIZE")

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

Func WM_SIZE($hWnd, $Msg, $wParam, $lParam)
	Local $aRichEdit_Pos = ControlGetPos($hForm, "", $hR_Edit1)
	
	Local $iWidth = _WinAPI_LoWord($lParam)
    Local $iHeight = _WinAPI_HiWord($lParam)
	
	_WinAPI_MoveWindow($hR_Edit1, $aRichEdit_Pos[0], $aRichEdit_Pos[1], $iWidth - 110, $iHeight - 110)
    
	Return $GUI_RUNDEFMSG
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Еще так поменять можно размер RichEdit
Код:
#include <GuiRichEdit.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>
#include <Constants.au3>

OnAutoItExitRegister('Error')

$fChange = True
$iX_1 = 5
$iY_1 = 35
$iW_1 = 222
$iH_1 = 222

$iX_2 = 10
$iY_2 = 10
$iW_2 = 50
$iH_2 = 50

$hForm = GUICreate('Test', 333, 333, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_THICKFRAME, $WS_OVERLAPPEDWINDOW, $WS_TILEDWINDOW, $WS_TABSTOP))
$hRichEdit = _GUICtrlRichEdit_Create($hForm, 'Edit1', $iX_1, $iY_1, $iW_1, $iH_1)
GUICtrlSetResizing(-1, 1)
$nButton = GUICtrlCreateButton('Button', 233, 30, 70, 25)
GUISetState()

While 1
	$Msg = GUIGetMsg()
	Switch $Msg
		Case $nButton
			$fChange = Not $fChange
			If $fChange Then
				ConsoleWrite(_WinAPI_SetWindowPos($hRichEdit, $HWND_BOTTOM, $iX_1, $iY_1, $iW_1, $iH_1, $SWP_FRAMECHANGED) & @CR)
			Else
				ConsoleWrite(_WinAPI_SetWindowPos($hRichEdit, $HWND_BOTTOM, $iX_2, $iY_2, $iW_2, $iH_2, $SWP_FRAMECHANGED) & @CR)
			EndIf
		Case $GUI_EVENT_CLOSE
			_GUICtrlRichEdit_Destroy($hRichEdit)
			Exit
	EndSwitch
WEnd

Func Error()
	_GUICtrlRichEdit_Destroy($hRichEdit)
	Exit
EndFunc   ;==>Error
Не знаю, насколько это правильно, но у меня работает.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles
Речь про Resizing, т.е изменение размера RichEdit при изменений размера главного окна.
Кстати, на основе моего примера выше, можно построить функцию _GUICtrlSetResizingEx, чтобы работать с элементами созданными _GUICtrl*_Create.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
[?]
на основе моего примера выше, можно построить функцию _GUICtrlSetResizingEx, чтобы работать с элементами созданными _GUICtrl*_Create.
Примерно так, правда мне пока не удалось придумать алгоритм изменения размера элементов в зависимости от установленных параметров ($GUI_DOCK*):

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

Global $aGCSREx_Ctrls[1][1]
Global $iGCSREx_LastWidth
Global $iGCSREx_LastHeight

$hForm = GUICreate('_GUICtrlSetResizingEx', 350, 350, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_THICKFRAME, $WS_OVERLAPPEDWINDOW, $WS_TILEDWINDOW, $WS_TABSTOP), $WS_EX_COMPOSITED)
$hRichEdit = _GUICtrlRichEdit_Create($hForm, 'Edit1', 5, 5, 250, 250)
_GUICtrlSetResizingEx($hForm, $hRichEdit, $GUI_DOCKALL)

GUICtrlCreateButton('Button', 270, 5, 70, 25)
_GUICtrlSetResizingEx(0, -1, BitOR($GUI_DOCKRIGHT, $GUI_DOCKTOP, $GUI_DOCKSIZE))

GUISetState()

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

Func _GUICtrlSetResizingEx($hGUI, $hCtrl, $iResizing)
	If Not IsHWnd($hCtrl) Then
		Return GUICtrlSetResizing($hCtrl, $iResizing)
	EndIf
	
	If $aGCSREx_Ctrls[0][0] = 0 Then
		GUIRegisterMsg($WM_SIZE, "__GCSREx_WM_SIZE")
	EndIf
	
	$aGCSREx_Ctrls[0][0] += 1
	ReDim $aGCSREx_Ctrls[$aGCSREx_Ctrls[0][0]+1][3]
	$aGCSREx_Ctrls[$aGCSREx_Ctrls[0][0]][0] = $hGUI
	$aGCSREx_Ctrls[$aGCSREx_Ctrls[0][0]][1] = $hCtrl
	$aGCSREx_Ctrls[$aGCSREx_Ctrls[0][0]][2] = $iResizing
EndFunc

Func __GCSREx_WM_SIZE($hWnd, $nMsg, $wParam, $lParam)
	Local $iGUI_Width = _WinAPI_LoWord($lParam)
	Local $iGUI_Height = _WinAPI_HiWord($lParam)
	Local $hGUI, $hCtrl, $iResizing
	Local $aCtrl_Pos, $iX, $iY, $iW, $iH
	
	For $i = 1 To $aGCSREx_Ctrls[0][0]
		$hGUI = $aGCSREx_Ctrls[$i][0]
		$hCtrl = $aGCSREx_Ctrls[$i][1]
		$iResizing = $aGCSREx_Ctrls[$i][2]
		
		$aCtrl_Pos = ControlGetPos($hGUI, "", $hCtrl)
		
		;Default = $GUI_DOCKALL
		$iX = -1
		$iY = -1
		$iW = -1
		$iH = -1
		
		;resize and reposition according to new window size
		If BitAND($iResizing, $GUI_DOCKAUTO) Then
			
		EndIf
		
		;Left side 
		If BitAND($iResizing, $GUI_DOCKLEFT) Then
			
		EndIf
		
		;Right side 
		If BitAND($iResizing, $GUI_DOCKRIGHT) Then
			
		EndIf
		
		;Position will not move relative to horizontal center 
		If BitAND($iResizing, $GUI_DOCKHCENTER) Then
			
		EndIf
		
		;Top side 
		If BitAND($iResizing, $GUI_DOCKTOP) Then
			
		EndIf
		
		;Bottom side 
		If BitAND($iResizing, $GUI_DOCKBOTTOM) Then
			
		EndIf
		
		;Position will not move relative to vertical center 
		If BitAND($iResizing, $GUI_DOCKVCENTER) Then
			
		EndIf
		
		;Width will not change 
		If BitAND($iResizing, $GUI_DOCKWIDTH) Then
			
		EndIf
		
		;Height will not change 
		If BitAND($iResizing, $GUI_DOCKHEIGHT) Then
			
		EndIf
		
		;Composite resizing 
		
		;($GUI_DOCKWIDTH + $GUI_DOCKHEIGHT) Size will not change 
		If BitAND($iResizing, $GUI_DOCKSIZE) Then
			
		EndIf
		
		;($GUI_DOCKHEIGHT + $GUI_DOCKTOP) so the control will stay at the top of window with no change in Height
		If BitAND($iResizing, $GUI_DOCKMENUBAR) Then
			
		EndIf
		
		;($GUI_DOCKHEIGHT + $GUI_DOCKBOTTOM) so the control stay at the bottom of the window with no change in Height
		If BitAND($iResizing, $GUI_DOCKSTATEBAR) Then
			
		EndIf
		
		;($GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT) so the control will not move during resizing 
		If BitAND($iResizing, $GUI_DOCKALL) Then
			
		EndIf
		
		;($GUI_DOCKLEFT + $GUI_DOCKRIGHT + $GUI_DOCKTOP + $GUI_DOCKBOTTOM) so the control will grow as the window
		If BitAND($iResizing, $GUI_DOCKBORDERS) Then
			
		EndIf
		
		If $iX = -1 Then $iX = $aCtrl_Pos[0]
		If $iY = -1 Then $iY = $aCtrl_Pos[1]
		If $iW = -1 Then $iW = $aCtrl_Pos[2]
		If $iH = -1 Then $iH = $aCtrl_Pos[3]
		
		_WinAPI_MoveWindow($hCtrl, $iX, $iY, $iW, $iH)
	Next
	
	$iGCSREx_LastWidth = $iGUI_Width
	$iGCSREx_LastHeight = $iGUI_Height
	
	Return $GUI_RUNDEFMSG
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz
Сделал с двумя фреймами.

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>
OnAutoItExitRegister("Error")
Global $iWidth=500, $iHeight=130

$hForm = GUICreate('Test', $iWidth, $iHeight+20, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_THICKFRAME, $WS_OVERLAPPEDWINDOW, $WS_TILEDWINDOW, $WS_TABSTOP), $WS_EX_COMPOSITED)
$hR_Edit1 = _GUICtrlRichEdit_Create($hForm, 'Edit1', 10, 10, 290, 130)
$hR_Edit2 = _GUICtrlRichEdit_Create($hForm, 'Edit2', 310, 10, 180, 130)
$Label = GUICtrlCreateLabel('', 300, 10, 10, 130)
; GUICtrlSetBkColor(-1, 0xffd7d7)
GUICtrlSetCursor(-1, 13)
$dd=300/$iWidth

GUISetState()
GUIRegisterMsg($WM_SIZE, "WM_SIZE")

While 1
    $nMsg = GUIGetMsg()
   
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            GUIDelete()
            Exit
        Case -7
            $aCur_Info = GUIGetCursorInfo($hForm)
            If $aCur_Info[4]=$Label Then
				$aID_Pos = ControlGetPos($hForm, '', $Label)
				; высчитываем разницу координат
				$dX= $aID_Pos[0]-$aCur_Info[0]
				While 1
					Sleep(10)
					$aCur_Info = GUIGetCursorInfo($hForm) ; получаем новую инфу
					$aCur_Info[0]+=$dX
					
					If Not($aCur_Info[0]-10<40 Or $iWidth-$aCur_Info[0]-20<40) Then
						GUICtrlSetPos($Label, $aCur_Info[0], 10) ; устанавливаем новые координаты
						_WinAPI_MoveWindow($hR_Edit1, 10, 10, $aCur_Info[0]-10, $iHeight)
						_WinAPI_MoveWindow($hR_Edit2, $aCur_Info[0]+10, 10, $iWidth-$aCur_Info[0]-20, $iHeight)
						If Not $aCur_Info[2] Then ExitLoop ; выход если курсор отпущен
					EndIf
				WEnd
				$dd=$aCur_Info[0]/$iWidth
			EndIf
    EndSwitch
WEnd

Func WM_SIZE($hWnd, $Msg, $wParam, $lParam)
    $iWidth = _WinAPI_LoWord($lParam)
    $iHeight = _WinAPI_HiWord($lParam)-20
	Local $w=Int($iWidth*$dd)
    _WinAPI_MoveWindow($hR_Edit1, 10, 10, $w-10, $iHeight)
    _WinAPI_MoveWindow($hR_Edit2, $w+10, 10, $iWidth-$w-20, $iHeight)
	GUICtrlSetPos($Label, $w+2, 10, 10,  $iHeight-20)
    Return $GUI_RUNDEFMSG
EndFunc


Func Error()
    GUIDelete()
EndFunc

Остальные элементы (ListView, TreeView, GUICtrlCreateObj) проверил, изменяются с помощью _WinAPI_MoveWindow, либо GUICtrlSetPos. Остаётся - создать правило вычисления фреймов.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
CreatoR,madmasles,AZJIO
Спасибо !.
Не могу понять. Ведь я все вроде делал также, кроме того,что использовал банальное :
Код:
ControlMove

вместо
Код:
_WinAPI_MoveWindow


Могу только предположить,что координаты элементов у меня - глобальные переменные и
где-то возникал конфликт (возможно при неточном их расчете)

На 2-х элементах все работает.
Попробую на 6 , отпишусь.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
AZJIO [?]
Сделал с двумя фреймами.

И все же корректной работы даже на 2-х фреймах не получается :
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>
#Include <IE.au3>
OnAutoItExitRegister("Error")
Global $iWidth=500, $iHeight=130

$hForm = GUICreate('Test', $iWidth, $iHeight+20, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_THICKFRAME, $WS_OVERLAPPEDWINDOW, $WS_TILEDWINDOW, $WS_TABSTOP), $WS_EX_COMPOSITED)
$hR_Edit1 = _GUICtrlRichEdit_Create($hForm, 'Edit1', 10, 10, 290, 130)
;$hR_Edit2 = _GUICtrlRichEdit_Create($hForm, 'Edit2', 310, 10, 180, 130)

$oIE1 = _IECreateEmbedded ()
$GUIActiveX1 = GUICtrlCreateObj($oIE1, 310, 10, 180, 130)
_IENavigate ($oIE1, "C:\WINDOWS\Web\Wallpaper\Chip_Wallpapers (32).jpg")

$Label = GUICtrlCreateLabel('', 300, 10, 10, 130)
; GUICtrlSetBkColor(-1, 0xffd7d7)
GUICtrlSetCursor(-1, 13)
$dd=300/$iWidth

GUISetState()
GUIRegisterMsg($WM_SIZE, "WM_SIZE")

While 1
    $nMsg = GUIGetMsg()
   
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            GUIDelete()
            Exit
        Case -7
            $aCur_Info = GUIGetCursorInfo($hForm)
            If $aCur_Info[4]=$Label Then
                $aID_Pos = ControlGetPos($hForm, '', $Label)
                ; высчитываем разницу координат
                $dX= $aID_Pos[0]-$aCur_Info[0]
                While 1
                    Sleep(10)
                    $aCur_Info = GUIGetCursorInfo($hForm) ; получаем новую инфу
                    $aCur_Info[0]+=$dX
                    
                    If Not($aCur_Info[0]-10<40 Or $iWidth-$aCur_Info[0]-20<40) Then
                        GUICtrlSetPos($Label, $aCur_Info[0], 10) ; устанавливаем новые координаты
                        _WinAPI_MoveWindow($hR_Edit1, 10, 10, $aCur_Info[0]-10, $iHeight)
								; _WinAPI_MoveWindow($hR_Edit2, $aCur_Info[0]+10, 10, $iWidth-$aCur_Info[0]-20, $iHeight)
								;_WinAPI_MoveWindow($GUIActiveX1, $aCur_Info[0]+10, 10, $iWidth-$aCur_Info[0]-20, $iHeight)
								GUICtrlSetPos($GUIActiveX1, $aCur_Info[0]+10, 10, $iWidth-$aCur_Info[0]-20, $iHeight)
								If Not $aCur_Info[2] Then ExitLoop ; выход если курсор отпущен
                    EndIf
                WEnd
                $dd=$aCur_Info[0]/$iWidth
            EndIf
    EndSwitch
WEnd

Func WM_SIZE($hWnd, $Msg, $wParam, $lParam)
    $iWidth = _WinAPI_LoWord($lParam)
    $iHeight = _WinAPI_HiWord($lParam)-20
    Local $w=Int($iWidth*$dd)
    _WinAPI_MoveWindow($hR_Edit1, 10, 10, $w-10, $iHeight)
	;_WinAPI_MoveWindow($hR_Edit2, $w+10, 10, $iWidth-$w-20, $iHeight)
    ; _WinAPI_MoveWindow($GUIActiveX1, $w+10, 10, $iWidth-$w-20, $iHeight)
	 GUICtrlSetPos($GUIActiveX1, $w+10, 10, $iWidth-$w-20, $iHeight)
	 GUICtrlSetPos($Label, $w+2, 10, 10,  $iHeight-20)
    Return $GUI_RUNDEFMSG
EndFunc

Func Error()
    GUIDelete()
EndFunc
Работает только на Resize линиями
При попытке растянуть работает до какого-то предела-затем скачок $GUIActiveX1
При попытке максимизировать окно Resize $GUIActiveX1 не работает вовсе

Похоже эта задача - это изврат. Корректно простыми средствами не выполнить.
Жалко только затраченного времени мной и вами.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
gregaz сказал(а):
Похоже эта задача - это изврат. Корректно простыми средствами не выполнить. Жалко только затраченного времени мной и вами.

Почему изврат? Это все делается в несколько строк в функции WM_SIZE. Самое сложное здесь - это просчитать новые координаты для всех элементов, просто математика и корректное округление значений. Перемещать любые элементы AutoIt GUI нужно только с помощью GUICtrlSetPos() (!), в противном случае будут проблемы... Посмотри еще раз пример для TVExplorer'а, там это все легко делается.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
gregaz
Ещё раз попробуй, я добавил GUICtrlSetResizing для ActiveX (исправил на Return 0), чтоб левого края держался... у меня работает и во всех вариантах (максимизированно и до какого-то предела). Для шести элементов это не сложно, создается условие для перетягивания лейблов, в каждом из которых происходит рассчёт определённых сторон. Хотя ActiveX там посредине, возможно левое выравнивание не сработает, но думаю опять какая нибудь нестандартная фича поможет.

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GUIRichEdit.au3>
#Include <IE.au3>
OnAutoItExitRegister("Error")
Global $iWidth=500, $iHeight=130

$hForm = GUICreate('Test', $iWidth, $iHeight+20, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_THICKFRAME, $WS_OVERLAPPEDWINDOW, $WS_TILEDWINDOW, $WS_TABSTOP), $WS_EX_COMPOSITED)
$hR_Edit1 = _GUICtrlRichEdit_Create($hForm, 'Edit1', 10, 10, 290, 130)
; $hR_Edit2 = _GUICtrlRichEdit_Create($hForm, 'Edit2', 310, 10, 180, 130)

$oIE1 = _IECreateEmbedded ()
$hR_Edit2 = GUICtrlCreateObj($oIE1, 310, 10, 180, 130)
;GUICtrlSetResizing(-1, 4)
_IENavigate ($oIE1, "C:\WINDOWS\Web\Wallpaper\Wallpaper.jpg")

$Label = GUICtrlCreateLabel('', 300, 10, 5, 130)
; GUICtrlSetBkColor(-1, 0xffd7d7)
GUICtrlSetCursor(-1, 13)
$dd=300/$iWidth

GUISetState()
GUIRegisterMsg($WM_SIZE, "WM_SIZE")

While 1
    $nMsg = GUIGetMsg()
   
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            GUIDelete()
            Exit
        Case -7
            $aCur_Info = GUIGetCursorInfo($hForm)
            If $aCur_Info[4]=$Label Then
				$aID_Pos = ControlGetPos($hForm, '', $Label)
				; высчитываем разницу координат
				$dX= $aID_Pos[0]-$aCur_Info[0]
				While 1
					Sleep(10)
					$aCur_Info = GUIGetCursorInfo($hForm) ; получаем новую инфу
					$aCur_Info[0]+=$dX
					
					If Not($aCur_Info[0]-10<40 Or $iWidth-$aCur_Info[0]-20<40) Then
						GUICtrlSetPos($Label, $aCur_Info[0], 10) ; устанавливаем новые координаты
						_WinAPI_MoveWindow($hR_Edit1, 10, 10, $aCur_Info[0]-10, $iHeight)
						; _WinAPI_MoveWindow($hR_Edit2, $aCur_Info[0]+10, 10, $iWidth-$aCur_Info[0]-20, $iHeight)
						GUICtrlSetPos($hR_Edit2, $aCur_Info[0]+10, 10, $iWidth-$aCur_Info[0]-20, $iHeight)
						If Not $aCur_Info[2] Then ExitLoop ; выход если курсор отпущен
					EndIf
				WEnd
				$dd=$aCur_Info[0]/$iWidth
			EndIf
    EndSwitch
WEnd

Func WM_SIZE($hWnd, $Msg, $wParam, $lParam)
    $iWidth = _WinAPI_LoWord($lParam)
    $iHeight = _WinAPI_HiWord($lParam)-20
	Local $w=Int($iWidth*$dd)
    _WinAPI_MoveWindow($hR_Edit1, 10, 10, $w-10, $iHeight)
    ; _WinAPI_MoveWindow($hR_Edit2, $w+10, 10, $iWidth-$w-20, $iHeight)
	GUICtrlSetPos($hR_Edit2, $w+10, 10, $iWidth-$w-20, $iHeight)
	GUICtrlSetPos($Label, $w+2, 10, 10,  $iHeight-20)
    Return 0
EndFunc


Func Error()
    GUIDelete()
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Функция WM_SIZE должна возвращать 0, а не $GUI_RUNDEFMSG, в противном случае, AutoIt сам будет изменять размеры.
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
<font color="#0000FF">Yashied</font> [?]
Перемещать любые элементы AutoIt GUI нужно только с помощью GUICtrlSetPos() (!), в противном случае будут проблемы...
Посмотри еще раз пример для TVExplorer'а, там это все легко делается.
Там действительно просто : только штатные TreeView

Для этого надо переходить на обычный Edit и штатные TreeView и ListView,что меня не устраивает.
[?]
Функция WM_SIZE должна возвращать 0, а не $GUI_RUNDEFMSG, в противном случае, AutoIt сам будет изменять размеры.
Теперь многое становится понятно, жаль что не все :(
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
gregaz сказал(а):
Теперь многое становится понятно, жаль что не все

Что именно не понятно? И зачем использовать ListView из UDF?
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Yashied [?]
И зачем использовать ListView из UDF?

Один ListView дела не меняет , если все равно присутствуют элементы, не позволяющие сделать GUICtrlSetPos

OffTopic:
что-то с цитированием происходит
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#Include <EditConstants.au3>
#Include <GUIListView.au3>
#Include <GUIRichEdit.au3>
#Include <WinAPI.au3>
#Include <WindowsConstants.au3>

$hForm = GUICreate('MyGUI', 530, 530, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
$LV1 = GUICtrlCreateListView('Property|Value', 10, 10, 250, 250)
$LV2 = _GUICtrlListView_Create($hForm, 'Property|Value', 10, 270, 250, 250, $LVS_REPORT, $WS_EX_CLIENTEDGE)
$Edit1 = GUICtrlCreateEdit('', 270, 10, 250, 250)
$Edit2 = _GUICtrlRichEdit_Create($hForm, '', 270, 270, 250, 250, BitOR($ES_MULTILINE, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $WS_VSCROLL, $WS_HSCROLL))
GUIRegisterMsg($WM_SIZE, 'WM_SIZE')
GUISetState()

Do
Until GUIGetMsg() = -3

GUIDelete()

Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam)

	Local $WC, $HC, $WT, $HT

	Switch $hWnd
		Case $hForm
			$WC = _WinAPI_LoWord($lParam)
			$HC = _WinAPI_HiWord($lParam)
			$WT = Floor(($WC - 30) / 2)
			$HT = Floor(($HC - 30) / 2)
			GUICtrlSetPos($LV1, 10, 10, $WT, $HT)
			WinMove($LV2, '', 10, 20 + $HT, $WT, $HC - $HT - 30)
			GUICtrlSetPos($Edit1, 20 + $WT, 10, $WC - $WT - 30, $HT)
			WinMove($Edit2, '', 20 + $WT, 20 + $HT, $WC - $WT - 30, $HC - $HT - 30)
			Return 0
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZE
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Или если для 6, то где-то так ?
Код:
#include-once
#Include <GUIListView.au3>
#Include <GUIRichEdit.au3>
#Include <WindowsConstants.au3>
#include <GuiConstants.au3>
#Include <IE.au3>

$hForm = GUICreate('MyGUI', 800, 530, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_MAXIMIZEBOX, $WS_SIZEBOX))
$LV1 = GUICtrlCreateListView('Property|Value', 10, 10, 250, 250)
$LV2 = _GUICtrlListView_Create($hForm, 'Property|Value', 10, 270, 250, 250, $LVS_REPORT, $WS_EX_CLIENTEDGE)
$Edit1 = GUICtrlCreateEdit('', 270, 10, 250, 250)
$Edit2 = _GUICtrlRichEdit_Create($hForm, '', 270, 270, 250, 250, BitOR($ES_MULTILINE, $ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $WS_VSCROLL, $WS_HSCROLL))

$oIE1 = ObjCreate("Shell.Explorer.2")
$GUIActiveX1 = GUICtrlCreateObj($oIE1,  530, 10, 250, 250)
$oIE1.navigate("file://"&@ProgramFilesDir&"\")

$oIE2 = _IECreateEmbedded ()
$GUIActiveX2 = GUICtrlCreateObj($oIE2,  530, 270, 250, 250)
_IENavigate ($oIE2, "C:\WINDOWS\Web\Wallpaper\Chip_Wallpapers (32).jpg")



GUIRegisterMsg($WM_SIZE, 'WM_SIZE')
GUISetState()

;BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL)
Do
Until GUIGetMsg() = -3

GUIDelete()

Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam)

    Local $WC, $HC, $WT, $HT

    Switch $hWnd
        Case $hForm
            $WC = _WinAPI_LoWord($lParam)
            $HC = _WinAPI_HiWord($lParam)
            $WT = Floor(($WC - 30) / 3)
            $HT = Floor(($HC - 30) / 2)
				
				GUICtrlSetPos($LV1, 10, 10, $WT-10, $HT)
				WinMove($LV2, '', 10,20 + $HT, $WT-10,  $HC - $HT - 30)
				
				GUICtrlSetPos($Edit1,  $WT+10, 10, $WT -10 , $HT)
            WinMove($Edit2, '',  $WT+10, 20 + $HT, $WT-10 , $HC - $HT - 30)
		
				GUICtrlSetPos($GUIActiveX1, 2*$WT+10, 10, $WT-10, $HT)
				GUICtrlSetPos($GUIActiveX2,  2*$WT+10, 20 + $HT, $WT-10,$HC - $HT - 30)
				
				Return 0
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZE

Похоже основные проблемы создавала $GUI_RUNDEFMSG
Попробую увязать с внутренним ресайзом


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

Это при одинаковых размерах так просто
 
Автор
G

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
; Вот что я смог сделать :
Код:
#include-once
#include <GuiRichEdit.au3>
#include <WindowsConstants.au3>
#include <GuiConstants.au3>
#include <GuiConstantsEx.au3>
#include <StaticConstants.au3>
#Include <GUITreeView.au3>
#Include <TreeViewConstants.au3>
#Include <GuiListView.au3>
#Include <ListViewConstants.au3>
#Include <IE.au3>

OnAutoItExitRegister("Error")
_IEErrorHandlerRegister ()

Global $iWidth=1200, $iHeight=800
$hForm = GUICreate('Test', $iWidth, $iHeight+20, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_THICKFRAME, $WS_OVERLAPPEDWINDOW, $WS_TILEDWINDOW, $WS_TABSTOP), $WS_EX_COMPOSITED)
GUISetBkColor(0xECE9D8 )

;GUICtrlCreateLabel("", 0, 2, 1200, 2,0x1000)
;GUICtrlCreateLabel("", 0, 33, 1200 ,2,0x1000)
;GUICtrlCreateLabel("", 0, 770, 1200 ,2,0x1000)

Global $i_X2=$iWidth-700, $i_Y2=35  , $i_W2=2                  , $i_H2=($iHeight-31)-$i_Y2
Global $i_X3=$iWidth-300, $i_Y3=35  , $i_W3=2                  , $i_H3=($iHeight-31)-$i_Y3
Global $i_X1a=2         , $i_Y1a=500, $i_W1a=($i_X2-1)-$i_X1a  , $i_H1a=2
Global $i_X1b=$i_X2+3   , $i_Y1b=600, $i_W1b=($i_X3-1)-$i_X1b  , $i_H1b=2
Global $i_X1c=$i_X3+3   , $i_Y1c=500, $i_W1c=($iWidth-2)-$i_X1c, $i_H1c=2

Global $X_Edit1=$i_X1a, $Y_Edit1=$i_Y2   , $W_Edit1=$i_W1a, $H_Edit1=($i_Y1a-1)-$Y_Edit1  
Global $X_Edit2=$i_X1a, $Y_Edit2=$i_Y1a+3, $W_Edit2=$i_W1a, $H_Edit2=($i_Y2+$i_H2)-$Y_Edit2
Global $X_oIE1=$i_X1b , $Y_oIE1=$i_Y2    , $W_oIE1=$i_W1b , $H_oIE1=($i_Y1b-3)-$Y_oIE1 
Global $X_oIE2=$i_X1b , $Y_oIE2=$i_Y1b+3 , $W_oIE2=$i_W1b , $H_oIE2=($i_Y2+$i_H2)-$Y_oIE2
Global $X_TV=$i_X1c   , $Y_TV=$i_Y2      , $W_TV=$i_W1c   , $H_TV=($i_Y1c-1)-$Y_TV
Global $X_LV=$i_X1c   , $Y_LV=$i_Y1c+3   , $W_LV=$i_W1c   , $H_LV=$i_Y2+$i_H2-$Y_LV

$Resizer_Label1a=GUICtrlCreateLabel("", $i_X1a, $i_Y1a, $i_W1a, $i_H1a)
GUICtrlSetBkColor(-1, 0xC0c000)
GUICtrlSetCursor(-1, 11)
$Resizer_Label1b=GUICtrlCreateLabel("", $i_X1b, $i_Y1b, $i_W1b, $i_H1b)
GUICtrlSetBkColor(-1, 0xC0c000)
GUICtrlSetCursor(-1, 11)
$Resizer_Label1c=GUICtrlCreateLabel("", $i_X1c, $i_Y1c, $i_W1c, $i_H1c)
GUICtrlSetBkColor(-1, 0xC0c000)
GUICtrlSetCursor(-1, 11)
$Resizer_Label2=GUICtrlCreateLabel("", $i_X2, $i_Y2, $i_W2, $i_H2)
GUICtrlSetBkColor(-1, 0xC0c000)
GUICtrlSetCursor(-1, 13)
$Resizer_Label3=GUICtrlCreateLabel("", $i_X3,$i_Y3,$i_W3,$i_H3)
GUICtrlSetBkColor(-1, 0xC0c000)
GUICtrlSetCursor(-1, 13)

$hEdit1 = _GUICtrlRichEdit_Create($hForm,'Edit1', $X_Edit1, $Y_Edit1, $W_Edit1, $H_Edit1)
_GUICtrlRichEdit_SetBkColor($hEdit1,0xffffC0)
;ControlHide ( "", "",$hEdit1 )
$hEdit2 = _GUICtrlRichEdit_Create($hForm,'Edit2',$X_Edit2, $Y_Edit2, $W_Edit2, $H_Edit2)
_GUICtrlRichEdit_SetBkColor($hEdit2,0xffffC0)
;ControlHide ( "", "",$hEdit2 )
$oIE1 = ObjCreate("Shell.Explorer.2")
$GUIActiveX1 = GUICtrlCreateObj($oIE1,   $X_oIE1, $Y_oIE1, $W_oIE1, $H_oIE1)
$oIE1.navigate("file://"&@ProgramFilesDir&"\")
;_IENavigate ($oIE1, "C:\WINDOWS\Web\Wallpaper\Chip_Wallpapers (32).jpg")
;GUICtrlSetState ( -1, $GUI_HIDE )
$oIE2 = _IECreateEmbedded ()
$GUIActiveX2 = GUICtrlCreateObj($oIE2,   $X_oIE2, $Y_oIE2, $W_oIE2, $H_oIE2)
_IENavigate ($oIE2, "C:\WINDOWS\Web\Wallpaper\Chip_Wallpapers (32).jpg")
;GUICtrlSetState ( -1, $GUI_HIDE )
$hTreeView=_GUICtrlTreeView_Create($hForm,$X_TV, $Y_TV, $W_TV, $H_TV,-1,$WS_EX_CLIENTEDGE)
_GUICtrlTreeView_SetBkColor($hTreeView, 0xC0ffff)
;ControlHide ( "", "",$hTreeView )
$hListView=_GUICtrlListView_Create($hForm," FileName | Path ",$X_LV, $Y_LV, $W_LV, $H_LV,-1,$WS_EX_CLIENTEDGE)
_GUICtrlListView_SetBkColor($hListView, 0xffffC0)
_GUICtrlListView_SetTextBkColor($hListView, 0xffffC0)
ControlHide ( "", "",$hListView )
;$hListView=_GUICtrlTreeView_Create($hForm,$X_LV, $Y_LV, $W_LV, $H_LV,-1,$WS_EX_CLIENTEDGE); ****Для проверки **
;_GUICtrlTreeView_SetBkColor($hListView, 0xC0ffff)

GUIRegisterMsg($WM_SIZE, "WM_SIZE")
GUISetState()

While 1
    $nMsg = GUIGetMsg()
   
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            GUIDelete()
            Exit
        Case $Resizer_Label1a To $Resizer_Label3
            MoveControls($nMsg);===>   
        ;Case $GUI_EVENT_PRIMARYDOWN
           ; $aCur_Info = GUIGetCursorInfo($hForm)
           ; If $aCur_Info[4]=$Resizer_Label1a Or $Resizer_Label1b  Or $Resizer_Label1c Or $Resizer_Label2 Or $Resizer_Label3 Then
					;MoveControls($aCur_Info[4]);===>   
           ; EndIf
    EndSwitch
WEnd

Func MoveControls($Label)
    GUICtrlSetBkColor($Label, 0x0000C0)
    $aCur_Info = GUIGetCursorInfo($hForm)
    $aID_Pos = ControlGetPos($hForm, '', $Label)
    $dd= $aID_Pos[0]-$aCur_Info[0]
    While $aCur_Info[2]=1
        Sleep(10)
        $aCur_Info = GUIGetCursorInfo($hForm) 
        $aCur_Info[0]+=$dd
        Switch $Label
            Case $Resizer_Label1a
                $i_Y1a=$aCur_Info[1];-2
                GUICtrlSetPos($Resizer_Label1a, $i_X1a, $i_Y1a, $i_W1a, $i_H1a)
                $H_Edit1=($i_Y1a-1)-$Y_Edit1
                $Y_Edit2=$i_Y1a+3
                $H_Edit2=($iHeight-30)- $Y_Edit2
                WinMove($hEdit1, '', $X_Edit1, $Y_Edit1, $W_Edit1, $H_Edit1)
                WinMove($hEdit2, '', $X_Edit2, $Y_Edit2, $W_Edit2, $H_Edit2)
            Case $Resizer_Label1b
                $i_Y1b=$aCur_Info[1];-2
                GUICtrlSetPos($Resizer_Label1b, $i_X1b, $i_Y1b, $i_W1b, $i_H1b)
                $H_oIE1=($i_Y1b-1)-$Y_oIE1
                $Y_oIE2=$i_Y1b+3
                $H_oIE2=($iHeight-30)-$Y_oIE2
                GUICtrlSetPos($GUIActiveX1, $X_oIE1, $Y_oIE1, $W_oIE1, $H_oIE1)
                GUICtrlSetPos($GUIActiveX2, $X_oIE2, $Y_oIE2, $W_oIE2, $H_oIE2) 
            Case $Resizer_Label1c
                $i_Y1c=$aCur_Info[1];-2
                GUICtrlSetPos($Resizer_Label1c, $i_X1c, $i_Y1c, $i_W1c, $i_H1c)
                $H_TV=($i_Y1c-1)-$Y_TV
                $Y_LV=$i_Y1c+3
                $H_LV=($iHeight-30)-$Y_LV
                WinMove($hTreeView, '', $X_TV, $Y_TV, $W_TV, $H_TV)
                WinMove($hListView, '', $X_LV, $Y_LV, $W_LV, $H_LV)
            Case $Resizer_Label2
                $i_X2=$aCur_Info[0];-2
                $i_W1a=($i_X2-1)-$i_X1a
                $i_X1b=($i_X2+3)
                $i_W1b=($i_X3-1)-($i_X2+3)
                GUICtrlSetPos($Resizer_Label2,$i_X2  , $i_Y2,$i_W2,$i_H2)
                GUICtrlSetPos($Resizer_Label1a,$i_X1a, $i_Y1a,$i_W1a,$i_H1a)
                GUICtrlSetPos($Resizer_Label1b,$i_X1b, $i_Y1b,$i_W1b,$i_H1b)
                $W_Edit1=($i_X2-1)-$X_Edit1
                $X_oIE1=($i_X2+3)
                $W_oIE1=($i_X3-1)-$X_oIE1
                $W_Edit2=($i_X2-1)-$X_Edit2
                $X_oIE2=($i_X2+3)
                $W_oIE2=($i_X3-1)-$X_oIE2
                WinMove($hEdit1, '', $X_Edit1, $Y_Edit1, $W_Edit1, $H_Edit1)
                WinMove($hEdit2, '', $X_Edit2, $Y_Edit2, $W_Edit2, $H_Edit2)
                GUICtrlSetPos($GUIActiveX1, $X_oIE1, $Y_oIE1, $W_oIE1, $H_oIE1)
                GUICtrlSetPos($GUIActiveX2, $X_oIE2, $Y_oIE2, $W_oIE2, $H_oIE2)
            Case $Resizer_Label3
                $i_X3=$aCur_Info[0];-2
                $i_W1b=($i_X3-1)-($i_X2+3)
                $i_X1c=($i_X3+3)
                $i_W1c=($iWidth-0)-($i_X3+3)
                GUICtrlSetPos($Resizer_Label3,$i_X3  , $i_Y3,$i_W3,$i_H3)
                GUICtrlSetPos($Resizer_Label1b,$i_X1b, $i_Y1b,$i_W1b,$i_H1b)
                GUICtrlSetPos($Resizer_Label1c,$i_X1c, $i_Y1c,$i_W1c,$i_H1c)
                $W_oIE1=($i_X3-1)-$X_oIE1
                $W_oIE2=($i_X3-1)- $X_oIE2
                $X_TV=($i_X3+3)
                $X_LV=($i_X3+3)
                $W_TV=($iWidth-2)-$X_TV
                $W_LV=($iWidth-2)-$X_LV
                GUICtrlSetPos($GUIActiveX1, $X_oIE1, $Y_oIE1, $W_oIE1, $H_oIE1)
                GUICtrlSetPos($GUIActiveX2, $X_oIE2, $Y_oIE2, $W_oIE2, $H_oIE2)
                WinMove($hTreeView, '', $X_TV, $Y_TV, $W_TV, $H_TV)
                WinMove($hListView, '', $X_LV, $Y_LV, $W_LV, $H_LV)
        EndSwitch
       ; If Not $aCur_Info[2] Then ExitLoop ; выход если курсор отпущен
    WEnd 
	;WinMove ( $hForm, "",$aGUI_Pos[0],$aGUI_Pos[1],$aGUI_Pos[2]+1,$aGUI_Pos[3])
	GUICtrlSetBkColor($Label, 0xC00000)
EndFunc

Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam) ; *** Неудачный вариант .  Заменить на (см.  Func WM_SIZE в конце поста  )
    Local $WC, $HC, $WT, $HT

    Switch $hWnd
        Case $hForm
            $WC = _WinAPI_LoWord($lParam)
            $HC = _WinAPI_HiWord($lParam)
           ; $WT = Floor(($WC - 30) / 2)
           ; $HT = Floor(($HC - 30) / 2)
            $i__X2=($WC-$iWidth)+$i_X2 
            $i__X3=($WC-$iWidth)+$i_X3 
            $i__H2=($HC-20-$iHeight)+$i_H2
            $i__H3=($HC-20-$iHeight)+$i_H3
            
            $i__Y1a=($HC-20-$iHeight)+$i_Y1a
            $i__W1a=($WC-$iWidth)+ $i_W1a
            $i__X1b=($WC-$iWidth)+$i_X1b
            $i__Y1b=($HC-20-$iHeight)+$i_Y1b
            $i__X1c=($WC-$iWidth)+$i_X1c
            $i__Y1c=($HC-20-$iHeight)+$i_Y1c

            GUICtrlSetPos($Resizer_Label2 , $i__X2 , $i_Y2  , $i_W2 , $i__H2)
            GUICtrlSetPos($Resizer_Label3 , $i__X3 , $i_Y3  , $i_W3 , $i__H3)
            GUICtrlSetPos($Resizer_Label1a, $i_X1a, $i__Y1a, $i__W1a, $i_H1a)
            GUICtrlSetPos($Resizer_Label1b, $i__X1b, $i__Y1b, $i_W1b, $i_H1b)
            GUICtrlSetPos($Resizer_Label1c, $i__X1c, $i__Y1c, $i_W1c, $i_H1c)

            Dim $X_Edit1=$i_X1a, $Y_Edit1=$i_Y2   , $W_Edit1=$i__W1a, $H_Edit1=($i__Y1a-1)-$Y_Edit1  
            Dim $X_Edit2=$i_X1a, $Y_Edit2=$i__Y1a+3, $W_Edit2=$i__W1a, $H_Edit2=($i_Y2+$i__H2)-$Y_Edit2
            Dim $X_oIE1=$i__X1b , $Y_oIE1=$i_Y2    , $W_oIE1=$i_W1b , $H_oIE1=($i__Y1b-3)-$Y_oIE1 
            Dim $X_oIE2=$i__X1b , $Y_oIE2=$i__Y1b+3 , $W_oIE2=$i_W1b , $H_oIE2=($i_Y2+$i__H2)-$Y_oIE2
            Dim $X_TV=$i__X1c   , $Y_TV=$i_Y2      , $W_TV=$i_W1c   , $H_TV=($i__Y1c-1)-$Y_TV
            Dim $X_LV=$i__X1c   , $Y_LV=$i__Y1c+3   , $W_LV=$i_W1c   , $H_LV=$i_Y2+$i__H2-$Y_LV
    
            WinMove($hEdit1, '', $X_Edit1, $Y_Edit1, $W_Edit1, $H_Edit1)
            WinMove($hEdit2, '', $X_Edit2, $Y_Edit2, $W_Edit2, $H_Edit2)
            GUICtrlSetPos($GUIActiveX1, $X_oIE1, $Y_oIE1, $W_oIE1, $H_oIE1)
            GUICtrlSetPos($GUIActiveX2, $X_oIE2, $Y_oIE2, $W_oIE2, $H_oIE2)
            WinMove($hTreeView, '', $X_TV, $Y_TV, $W_TV, $H_TV)
            WinMove($hListView, '', $X_LV, $Y_LV, $W_LV, $H_LV)       

            Return 0
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZE

Func Error()
    GUIDelete()
EndFunc
; Работает более-менее корректно в 2-х режимах, но только раздельно :
; После изменения размеров окна, ресайз линиями уже не корректен
; По-моему это должно устраниться просто, но у меня уже мозги кипят. Подскажите (поправьте).

; В процессе выявилась любопытная деталь :
; При наличии ListView и при стиле $WS_EX_COMPOSITED , запуск скрипта приводит к зависанию и показом пустого окна GUI.
; Использование нативного ListView проблемы не устраняет.
; При запуске с ControlHide ( "", "",$hListView )- Пуск нормальный.
; Для проверки ставил на его место TreeView с теми же размерами и параметрами - все нормально
; Если убрать стиль $WS_EX_COMPOSITED , то запуск скрипта нормальный,
; но попытка внутреннего ресайза после изменения размеров окна приводит к возбуждению объектов ActiveX.
; Правда это устраняется повторным изменением размера окна (даже незначительным)
; Я даже использовал для этого: WinMove ( $hForm, "",$aGUI_Pos[0],$aGUI_Pos[1],$aGUI_Pos[2]+1,$aGUI_Pos[3]) после внутреннего ресайза,
; но это уже лишнее телодвижение.

; Вот она еще одна причина моих бесплодных мучений (1-я была : $GUI_RUNDEFMSG )


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

Вроде допер ресайз . Изменил концепцию в WM_SIZE
Код:
Func WM_SIZE($hWnd, $iMsg, $wParam, $lParam) 
    Local $WC, $HC, $WT, $HT

    Switch $hWnd
        Case $hForm
            $WC = _WinAPI_LoWord($lParam)
            $HC = _WinAPI_HiWord($lParam)
				$i_X3=($WC-2)- ($i_W1c+4)
				GUICtrlSetPos($Resizer_Label3 , $i_X3 , $i_Y3  , $i_W3 , $i_H3)
				$i_X2=($i_X3-1)-($i_W1b+4)
				GUICtrlSetPos($Resizer_Label2 , $i_X2 , $i_Y2  , $i_W2 , $i_H2)
				$i_Y1a=($HC-53)-($H_Edit2+1)
				$i_W1a=$i_X2-1
				GUICtrlSetPos($Resizer_Label1a, $i_X1a, $i_Y1a, $i_W1a, $i_H1a)
				$i_X1b=$i_X2+3
				$i_Y1b=($HC-53)-($H_oIE2+1)
				GUICtrlSetPos($Resizer_Label1b, $i_X1b, $i_Y1b, $i_W1b, $i_H1b)
				$i_X1c=$i_X3+3
				$i_Y1c=($HC-53)-($H_LV+1)
				GUICtrlSetPos($Resizer_Label1c, $i_X1c, $i_Y1c, $i_W1c, $i_H1c)
        MoveControls1()   
			  Return 0
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZE


Func MoveControls1()
	Dim $X_Edit1=$i_X1a, $Y_Edit1=$i_Y2   , $W_Edit1=$i_W1a, $H_Edit1=($i_Y1a-1)-$Y_Edit1  
	Dim $X_Edit2=$i_X1a, $Y_Edit2=$i_Y1a+3, $W_Edit2=$i_W1a, $H_Edit2=($i_Y2+$i_H2)-$Y_Edit2
	Dim $X_oIE1=$i_X1b , $Y_oIE1=$i_Y2    , $W_oIE1=$i_W1b , $H_oIE1=($i_Y1b-3)-$Y_oIE1 
	Dim $X_oIE2=$i_X1b , $Y_oIE2=$i_Y1b+3 , $W_oIE2=$i_W1b , $H_oIE2=($i_Y2+$i_H2)-$Y_oIE2
	Dim $X_TV=$i_X1c   , $Y_TV=$i_Y2      , $W_TV=$i_W1c   , $H_TV=($i_Y1c-1)-$Y_TV
	Dim $X_LV=$i_X1c   , $Y_LV=$i_Y1c+3   , $W_LV=$i_W1c   , $H_LV=$i_Y2+$i_H2-$Y_LV
	
	_WinAPI_MoveWindow($hEdit1   , $X_Edit1, $Y_Edit1, $W_Edit1, $H_Edit1)
	_WinAPI_MoveWindow($hEdit2   , $X_Edit2, $Y_Edit2, $W_Edit2, $H_Edit2)
	GUICtrlSetPos($GUIActiveX1   , $X_oIE1 , $Y_oIE1 , $W_oIE1 , $H_oIE1)  
	GUICtrlSetPos($GUIActiveX2   , $X_oIE2 , $Y_oIE2 , $W_oIE2 , $H_oIE2)  
	_WinAPI_MoveWindow($hTreeView, $X_TV   , $Y_TV   , $W_TV   , $H_TV)
	_WinAPI_MoveWindow($hListView, $X_LV   , $Y_LV   , $W_LV   , $H_LV)
EndFunc
 
Верх