Что нового

[Элементы GUI] Симметричная расстановка элементов вне зависимости от их количества на форме

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Здравствуйте.
Использую AutoIt v3.3.8.1

Хочу реализовать следующее.
На появляющейся форме расставляются элементы:
Код:
GUICtrlCreateLabel
GUICtrlCreateCheckbox

Если элементов максимальное количество то расставляю так:
Код:
#include <GUIConstantsEx.au3>

	$hGUISINI = GUICreate("Создание файла настроек", 200, 200, -1, -1) ; Создаёт окно в центре экрана
	$nCh1 = GUICtrlCreateCheckbox("FlashPlayerActivX", 1, 1, 120, 20)
	$nCh2 = GUICtrlCreateCheckbox("FlashPlayerPlugin", -1, -1, 120, 20)
	$nCh3 = GUICtrlCreateCheckbox("ShockWaveFlash", 1, 41, 120, 20)
	$nCh4 = GUICtrlCreateCheckbox("AdobeAIR", 1, 61, 120, 20)
	$nCh5 = GUICtrlCreateCheckbox("Silverlight", 1, 81, 120, 20)
	$nCh6 = GUICtrlCreateCheckbox("JavaSE", 1, 101, 120, 20)
	$nCh7 = GUICtrlCreateCheckbox("QuickTime", 1, 121, 120, 20)
	$nCh8 = GUICtrlCreateCheckbox("RealPlayer", 1, 141, 120, 20)
	$hBatCheckINI = GUICtrlCreateButton("Создать файл настроек", 35, 161)
	GUISetState(@SW_SHOW, $hGUISINI)

    While 1
			Switch GUIGetMsg()
				Case -3
					Exit
					GUIDelete($hGUISINI)
				Case $hBatCheckINI
					If BitAND(GUICtrlRead($nCh1), $GUI_CHECKED) Then
						IniWrite(@ScriptDir&'\settings.ini', "SetCheckParam", "FlashPlayerActivX", "1")
					EndIf
					If BitAND(GUICtrlRead($nCh2), $GUI_CHECKED) Then
						IniWrite(@ScriptDir&'\settings.ini', "SetCheckParam", "FlashPlayerPlugin", "1")
					EndIf
					If BitAND(GUICtrlRead($nCh3), $GUI_CHECKED) Then
						IniWrite(@ScriptDir&'\settings.ini', "SetCheckParam", "ShockWaveFlash", "1")
					EndIf
					If BitAND(GUICtrlRead($nCh4), $GUI_CHECKED) Then
						IniWrite(@ScriptDir&'\settings.ini', "SetCheckParam", "AdobeAIR", "1")
					EndIf
					If BitAND(GUICtrlRead($nCh5), $GUI_CHECKED) Then
						IniWrite(@ScriptDir&'\settings.ini', "SetCheckParam", "Silverlight", "1")
					EndIf
					If BitAND(GUICtrlRead($nCh6), $GUI_CHECKED) Then
						IniWrite(@ScriptDir&'\settings.ini', "SetCheckParam", "JavaSE", "1")
					EndIf
					If BitAND(GUICtrlRead($nCh7), $GUI_CHECKED) Then
						IniWrite(@ScriptDir&'\settings.ini', "SetCheckParam", "QuickTime", "1")
					EndIf
					If BitAND(GUICtrlRead($nCh8), $GUI_CHECKED) Then
						IniWrite(@ScriptDir&'\settings.ini', "SetCheckParam", "RealPlayer", "1")
					EndIf
						Exit
						GUIDelete($hGUISINI)
			EndSwitch
	WEnd


Эта форма для задания настроек. Следующая форма будет считывать настройки и отрисовывать заданные элементы. Она так же рассчитана на максимальное количество элементов.
НО, это основной вопрос. Если в настройках задать меньшее количество элементов то получается не симметричное расположение элементов на основной форме.
Подскажите как реализовать идею. Может уже есть готовые решения.
Хотелось бы, что-бы при исключении элемента следующий элемент наследовал его координаты.
Надеюсь понятно изложил суть.
 

Athook

Новичок
Сообщения
5
Репутация
2
Зачем так?:
Код:
If BitAND(GUICtrlRead($nCh1), $GUI_CHECKED) Then


Не проще ли?:
Код:
If GUICtrlRead($nCh1, $GUI_CHECKED) Then

Или так не работает?

элементов максимальное количество
Это как?

на основной форме
Какая форма основная? Та которая для задания настроек, или та которая считывает настройки...?
 

AZJIO

Меценат
Меценат
Сообщения
2,892
Репутация
1,196
ivsatel
Высоту рабочей области разделить на количество элементов получим интервал между двумя элементами, остаётся либо в цикле наращивать интервал для каждого следующего элемента.
Из этого примера сделал это
Код:
$hGui = GUICreate('My Program', 450, 400)
GUICtrlCreateGroup("", 88, 20, 233, 273)

$iCount = 5 ; Количество пунктов
$iStep = 233 / $iCount ; вычисление шага взависимости от количества пунктов
$iRows = 10 ; Количество строк
Global $BoxConfig[$iCount + 1] = [$iCount], $a[10] = [0, 0, $iRows, 96, 36, $iStep, 70, -1, 1]
; a[0] - X-координата элемента
; a[1] - Y-координата элемента
; a[2] - Количество строк в блоке
; a[3] - X-координата блока
; a[4] - Y-координата блока
; a[5] - Вертикальный шаг в блоке
; a[6] - Горизонтальный шаг в блоке
; a[7] - Индекс текущей колонки
; a[8] - Индекс пункта следующей колонки
For $i = 1 To $iCount
	_NextItem($a, $i)
	$BoxConfig[$i] = GUICtrlCreateRadio("Check " & $i, $a[0], $a[1], 62, 17)
Next
$a = 0
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $BoxConfig[1] To $BoxConfig[$BoxConfig[0]]
			$j = $nMsg - $BoxConfig[1] + 1
			MsgBox(0, 'Check', $j, 0, $hGui)
		Case -3
			Exit
	EndSwitch
WEnd

Func _NextItem(ByRef $a, $i)
	If $i = $a[8] Then
		$a[8] += $a[2]
		$a[7] += 1
	EndIf
	$a[0] = $a[7] * $a[6] + $a[3] ; X
	$a[1] = $a[4] + Mod($i - 1, $a[2]) * $a[5] ; Y
EndFunc   ;==>_NextItem

; Func _NextItem2(ByRef $a, $i)
	; $a[0] = (Ceiling($i / $a[2]) - 1) * $a[6] + $a[3] ; X
	; $a[1] = $a[4] + Mod($i - 1, $a[2]) * $a[5] ; Y
; EndFunc   ;==>_NextItem2


Чекбоксы близко к краю GUI, я как раз написал статью позавчера
 
Автор
I

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Получился еще один вариант решения. Исходя из того, что известно общее(максимальное) число элементов, а величина отступа слева не меняется(постоянна). То получилось так:
Создал два массива
Код:
Dim $aHeightLabel[8], $aHeightCheckBox[10]
$aHeightLabel[0] = '10'
$aHeightLabel[1] = '50'
$aHeightLabel[2] = '100'
$aHeightLabel[3] = '150'
$aHeightLabel[4] = '200'
$aHeightLabel[5] = '250'
$aHeightLabel[6] = '300'
$aHeightLabel[7] = '350'

$aHeightCheckBox[0] = '400'
$aHeightCheckBox[1] = '420'
$aHeightCheckBox[2] = '440'
$aHeightCheckBox[3] = '460'
$aHeightCheckBox[4] = '480'
$aHeightCheckBox[5] = '500'
$aHeightCheckBox[6] = '520'
$aHeightCheckBox[7] = '540'
$aHeightCheckBox[8] = '560'
$aHeightCheckBox[9] = '580'

В которых значения это величина отступа сверху. Далее создаем элемент:
Код:
If $FPAX = 1 Then
$L1 = GUICtrlCreateLabel('Версия в системе FlashPlayer для IE', 10, $aHeightLabel[0], -1, -1, $SS_CENTER)
If $sResultverFP_IE = $Ots Or $sResultverFP_IE < $VersforIE Then
	$L2 = GUICtrlCreateLabel(' = ' & $sResultverFP_IE, 310, $aHeightLabel[0], -1, -1, $SS_CENTER + $SS_SUNKEN)
	GUICtrlSetBkColor($L2, 0xFF3366) ; Светло-красный
Else
	$L2 = GUICtrlCreateLabel(' = ' & $sResultverFP_IE, 310, $aHeightLabel[0], -1, -1, $SS_CENTER + $SS_SUNKEN)
	GUICtrlSetBkColor($L2, 0xCCFF99) ; Светло-зеленый
EndIf

$L5 = GUICtrlCreateLabel('Доступная версия для IE', 10, $aHeightLabel[0] + 20, -1, -1, $SS_CENTER)
$L6 = GUICtrlCreateLabel(' = ' & $VersforIE, 310, $aHeightLabel[0] + 20, -1, -1, $SS_CENTER + $SS_SUNKEN)

_ArrayDelete($aHeightLabel, 0)

EndIf

Задавая величину верхнего отступа значением из массива, в данном примере $aHeightLabel[0]
Удаляя после эту величину:
Код:
_ArrayDelete($aHeightLabel, 0)

При создании следующего элемента процедура повторяется.
AZJIO Еще раз спасибо за помощь!
 
Верх