Что нового

Простейший способ заставить работать Toolbar

Pat4005

Новичок
Сообщения
85
Репутация
4
Покажите, пожалуйста, знающие люди, как должен выглядеть простейший gui, в котором есть Toolbar, а именно устройство работы кнопок этого Toolbar'а - нажатие кнопки - действие. Не могу понять принцип работы кнопок Тулбара только с помощью справочных примеров.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Pat4005
Смотри всегда функцию _GUICtrlToolbar_Create, потому что функция с приставкой "_Create" обычно содержит событийный движок. В данном случае WM_NOTIFY. Любое событие (наведение, нажатие и т.д.) вызывает функцию WM_NOTIFY, которая получает структуру. Из структуры извлекаются значения, которые определяются самой структурой, в данном случае дескриптор элемента и код события (например клик). В функциях Switch выстроено ветвление взависимости от того, какой Toolbar кликнут и какой код события. В примере указан $NM_LDOWN, вероятно L - левая кнопка мыши, DOWN - вниз. То есть нажатие левой кнопки мыши. А под ним блок операторов, который надо выполнить.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вот наглядный пример. Я специально выбрал не самый простой пример, чтобы показать основные принципы работы с Toolbar'ом (иконки, текст, всплывающие подсказки и т.д.). Небольшие комментарии вы можете прочитать в самом коде.

P.S.

Иконки для кнопок взяты из Windows 7. Если у вас другая ОС, то поменяйте индексы иконок в массиве на любые другие.

Код:
#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
 
Верх