#Include <GUIConstantsEx.au3>
#Include <GUIImageList.au3>
#Include <GUIToolbar.au3>
#Include <StaticConstants.au3>
#Include <ToolbarConstants.au3>
#Include <WindowsConstants.au3>
#Include <WinAPIEx.au3>
; Создаем основное окно программы
$hForm = GUICreate('MyGUI', 332, 332)
; Создаем дочернее окно, в котором будет располагаться Toolbar (это делать необязательно, но такой прием позволит расположить Toolbar в любом месте основного окна, если нужно)
$hTool = GUICreate('', 332, 64, 0, 0, $WS_CHILD, 0, $hForm)
; Создаем элемент Dummy, с помощью которого будем посылать ID нажатой кнопки в основной цикл программы (см. обработчик WM_COMMAND)
$Dummy = GUICtrlCreateDummy()
; Создаем Toolbar
$hToolbar = _GUICtrlToolbar_Create($hTool, BitOR($BTNS_BUTTON, $BTNS_SHOWTEXT, $TBSTYLE_FLAT, $TBSTYLE_TOOLTIPS), $TBSTYLE_EX_DOUBLEBUFFER)
; Создаем и заполняем ImageList иконками, которые будут отображаться на кнопках Toolbar'а (нумерация начинается с 0, т.е. первая иконка имеет индекс 0, вторая - 1 и т.д.)
$hImageList = _GUIImageList_Create(32, 32, 5, 1, 5)
Dim $Icon[5] = [19, 205, 298, 300, 304]
For $i = 0 To 4
$hIcon = _WinAPI_ShellExtractIcon(@SystemDir & '\shell32.dll', $Icon[$i], 32, 32)
_GUIImageList_ReplaceIcon($hImageList, -1, $hIcon)
_WinAPI_DestroyIcon($hIcon)
Next
; Привязываем ImageList к Toolbar
_GUICtrlToolbar_SetImageList($hToolbar, $hImageList)
; Добавляем последовательно строки в Toolbar, которые будут отображаться на кнопках (нумерация начинается с 0)
_GUICtrlToolbar_AddString($hToolbar, 'Button 1')
_GUICtrlToolbar_AddString($hToolbar, 'Button 2')
_GUICtrlToolbar_AddString($hToolbar, 'Button 3')
_GUICtrlToolbar_AddString($hToolbar, 'Button 4')
_GUICtrlToolbar_AddString($hToolbar, 'Button 5')
; Добавляем последовательно кнопки и разделители с учетом индексов иконок и строк, нумерация кнопок может быть произвольной, но желательно использовать значения больше 1000 для предотвращения конфликтов с элементами AutoIt (в данном случае нумерация начинается с 10000)
_GUICtrlToolbar_AddButton($hToolbar, 10000, 0, 0)
_GUICtrlToolbar_AddButton($hToolbar, 10001, 1, 1)
_GUICtrlToolbar_AddButtonSep($hToolbar, 5)
_GUICtrlToolbar_AddButton($hToolbar, 10002, 2, 2)
_GUICtrlToolbar_AddButton($hToolbar, 10003, 3, 3)
_GUICtrlToolbar_AddButton($hToolbar, 10004, 4, 4)
; Наводим марафет (размер кнопок, отступы и т.д.), это должно быть сделано после добавления всех кнопок
_GUICtrlToolbar_SetButtonSize($hToolbar, 64, 64)
_GUICtrlToolbar_SetMetrics($hToolbar, 0, 0, 1, 0)
_GUICtrlToolbar_SetIndent($hToolbar, 1)
; ВАЖНО! Необходимо послать сообщение TB_AUTOSIZE для того, чтобы новый размер кнопок вступил в силу
_SendMessage($hToolbar, $TB_AUTOSIZE)
; Переключаемся на основное окно программы
GUISwitch($hForm)
; Здесь создаем все остальные элементы GUI
GUICtrlCreateLabel('', 0, 64, 335, 2, $SS_ETCHEDHORZ)
; Регистрируем обработчики WM_COMMAND для отслеживания нажатий кнопок и WM_NOTIFY для вывода всплывающих подсказок (если нужно)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
; Активируем окно
GUISetState(@SW_SHOWNOACTIVATE, $hTool)
GUISetState(@SW_SHOW, $hForm)
While 1
Switch GUIGetMsg()
Case 0
ContinueLoop
Case $GUI_EVENT_CLOSE
ExitLoop
Case $Dummy
$ID = GUICtrlRead($Dummy)
Switch $ID
Case 10000 ; Button 1
MsgBox(64, 'Toolbar', 'Button 1 has been pressed!', 0, $hForm)
Case 10001 ; Button 2
MsgBox(64, 'Toolbar', 'Button 2 has been pressed!', 0, $hForm)
Case 10002 ; Button 3
MsgBox(64, 'Toolbar', 'Button 3 has been pressed!', 0, $hForm)
Case 10003 ; Button 4
MsgBox(64, 'Toolbar', 'Button 4 has been pressed!', 0, $hForm)
Case 10004 ; Button 5
MsgBox(64, 'Toolbar', 'Button 5 has been pressed!', 0, $hForm)
Case Else
EndSwitch
EndSwitch
WEnd
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
Local $ID = BitAND($wParam, 0xFFFF)
Switch $hWnd
Case $hTool
Switch $ID
Case 10000 To 10004 ; Button 1 - Button 5
GUICtrlSendToDummy($Dummy, $ID)
Case Else
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
Local $tNMIA = DllStructCreate($tagNMITEMACTIVATE, $lParam)
Local $hTarget = DllStructGetData($tNMIA, 'hWndFrom')
Local $ID = DllStructGetData($tNMIA, 'Code')
Switch $hWnd
Case $hTool
Switch $hTarget
Case $hToolbar
Switch $ID
Case $TBN_GETINFOTIPW
;~ Local $tNMTBGIT = DllStructCreate($tagNMTBGETINFOTIP, $lParam)
Local $tNMTBGIT = DllStructCreate($tagNMHDR & ';ptr Text;int TextMax;int Item;lparam lParam;', $lParam)
Local $Item = DllStructGetData($tNMTBGIT, 'Item')
Local $Text = ''
Switch $Item
Case 10000 ; Button 1
$Text = 'Tooltip 1'
Case 10001 ; Button 2
$Text = 'Tooltip 2'
Case 10002 ; Button 3
$Text = 'Tooltip 3'
Case 10003 ; Button 4
$Text = 'Tooltip 4'
Case 10004 ; Button 5
$Text = 'Tooltip 5'
Case Else
EndSwitch
If $Text Then
DllStructSetData(DllStructCreate('wchar[' & DllStructGetData($tNMTBGIT, 'TextMax') & ']', DllStructGetData($tNMTBGIT, 'Text')), 1, $Text)
EndIf
EndSwitch
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY