Что нового

[Элементы GUI] Кнопочная панель со спойлерами(Spoilers)

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Подсмотрел идею в одной программе и решил реализовать на :IL_AutoIt_1:
Код:
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <ButtonConstants.au3>

$hGUI = GUICreate('Test', 640, 480, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))
$iLeft = 5 ; отступ слева
$iTop = 5 ; сверху
$iWidth = 150 ; общая ширина панели
$iHeight = 470 ; общаяя высота панели
$iButtonHeight = 25 ; высота кнопок групп
$iNumOfButtons = 6 ; количество групп
$sButtons = 'Files|Options|Media|Tools|Docs|Other' ; названия групп
$aButtonsNames = StringSplit($sButtons, '|', 2) ; перевод названия групп из строки в массив
If UBound($aButtonsNames) <> $iNumOfButtons Then ; проверка на равное количество индексов массивов
	SetError(1)
	Exit
EndIf
GUICtrlCreateGroup('', $iLeft, $iTop, $iWidth, $iHeight) ; рамка панели
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKWIDTH) ; прилепить к левому краю, и запретить менять ширину панели
Dim $b1, $b2, $b3, $b4, $b5, $b6, $b7, $b8, $b9, $b10, $b11, $b12, $b13, $b14, $b15, $b16, $b17, $b18, $b19, $b20, $b21 ; кнопки для наполнения панели
For $n = 1 To 21
	Assign('b' & $n, GUICtrlCreateButton($n, $iLeft, $iTop))
	GUICtrlSetState(Eval('b' & $n), $GUI_HIDE) ; прячем кнопки до их вызова через пункт на панели
	GUICtrlSetResizing(Eval('b' & $n), $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE) ; прилепить к левому и верхнему краям, запретить менять размер
Next
Dim $aSpoiler0[3] = [$b1, $b2, $b3] ; формирование кнопок по группам
Dim $aSpoiler1[3] = [$b4, $b5, $b6]
Dim $aSpoiler2[3] = [$b7, $b8, $b9]
Dim $aSpoiler3[3] = [$b10, $b11, $b12]
Dim $aSpoiler4[3] = [$b13, $b14, $b15]
Dim $aSpoiler5[6] = [$b16, $b17, $b18, $b19, $b20, $b21]

Dim $aButtons[$iNumOfButtons]
For $i = 0 To UBound($aButtons) - 1  ; создание кнопок групп на панели
	If $i = 0 Then ; для первой группы
		$aButtons[$i] = GUICtrlCreateButton($aButtonsNames[$i], $iLeft, $iTop, $iWidth, $iButtonHeight, $BS_FLAT)
		GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE) ; прилепить к левому и верхнему краям, запретить менять размер
		For $m = 0 To UBound($aSpoiler0) - 1 ; расстановка кнопок группы под ней
			GUICtrlSetPos($aSpoiler0[$m], $iLeft + 5, $iTop + $iButtonHeight + 5 + $m*25, $iWidth - 10, $iButtonHeight - 4)
			GUICtrlSetState($aSpoiler0[$m], $GUI_SHOW) ; отображаем
		Next
	Else  ; остальные кнопки групп размещаем внизу панели и прикрепляем к левому и нижнему краям + заперт на изменение размеров
		$aButtons[$i] = GUICtrlCreateButton($aButtonsNames[$i], $iLeft, $iHeight + $iTop - (UBound($aButtons) - $i)*$iButtonHeight, $iWidth, $iButtonHeight, $BS_FLAT)
		GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE)
	EndIf
Next

$aPos = WinGetPos($hGUI)
$iBottom = $aPos[3] - $iTop - $iHeight ; получение отступа между дном панели и нижним краем окна
GUISetState()

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case -3
			Exit
	EndSwitch
	For $j = 0 To UBound($aButtons) - 1 ; нажатие кнопок группы
		If $msg = $aButtons[$j] Then
			$aPos = WinGetPos($hGUI) ; замеряем окное - на случай если его растягивали или сжимали
			For $u = 0 To $j ; все кнопки групп которые находятся выше нажатой и её саму ...
				GUICtrlSetPos($aButtons[$u], $iLeft, $iTop + $u*$iButtonHeight) ; перемещаем вверх панели
				GUICtrlSetResizing($aButtons[$u], $GUI_DOCKLEFT + $GUI_DOCKTOP + $GUI_DOCKSIZE) ; прикрепляем к левому и верхнему краям + запрет изменений размера
				For $n = 1 To 21 ; прячем все кнопки вложений
					GUICtrlSetState(Eval('b' & $n), $GUI_HIDE)
				Next
				If $u = $j Then ; отображаем только кнопки, вложенные в нажатую группу, и перемещаем
					For $q = 0 To UBound(Eval('aSpoiler' & $j)) - 1
						GUICtrlSetPos(Execute('$aSpoiler' & $j & '[' & $q & ']'), $iLeft + 5, $iTop + $iButtonHeight*$j + $iButtonHeight + 5 + $q*25, $iWidth - 10, $iButtonHeight - 4)
						GUICtrlSetState(Execute('$aSpoiler' & $j & '[' & $q & ']'), $GUI_SHOW)
					Next
				EndIf
			Next
			For $y = $j + 1 To UBound($aButtons) - 1 ; все кнопки групп, находящиеся ниже - опускаем вниз к границе панели
				GUICtrlSetPos($aButtons[$y], $iLeft, $aPos[3] - $iBottom - (UBound($aButtons) - $y)*$iButtonHeight)
				GUICtrlSetResizing($aButtons[$y], $GUI_DOCKLEFT + $GUI_DOCKBOTTOM + $GUI_DOCKSIZE) ; прикрепляем к левому и нижнему краям, фиксируем размер
			Next
			ExitLoop
		EndIf
	Next
	For $l = 1 To 21 ; нажатие кнопок вложений
		If $msg = Eval('b' & $l) Then MsgBox(0, '', 'You a push the button # ' & GUICtrlRead(Eval('b' & $l)), 2)
	Next
WEnd
 
Верх