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