#include <GuiReBar.au3>
#include <GuiToolbar.au3>
#include <GuiComboBox.au3>
#include <GuiDateTimePicker.au3>
#include <GuiEdit.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include <GUIConstantsEx.au3>

$Debug_RB = False

Global $hReBar

_Main()

Func _Main()
	Local $hgui, $hToolbar, $hCombo, $hDTP, $hInput
	Local Enum $idNew = 1000, $idOpen, $idSave, $idHelp

	$hgui = GUICreate(StringTrimRight(@ScriptName, 4), 400, 396, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_MAXIMIZEBOX))

	GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

	; Создаёт элемент ReBar
	$hReBar = _GUICtrlRebar_Create($hgui, BitOR($CCS_TOP, $WS_BORDER, $RBS_VARHEIGHT, $RBS_AUTOSIZE, $RBS_BANDBORDERS))


	; Создаёт элемент ToolBar, чтобы вставить его в ReBar
	$hToolbar = _GUICtrlToolBar_Create($hgui, BitOR($TBSTYLE_FLAT, $CCS_NORESIZE, $CCS_NOPARENTALIGN))

	; Добавляет стандартный системный bitmaps
	Switch _GUICtrlToolbar_GetBitmapFlags($hToolbar)
		Case 0
			_GUICtrlToolbar_AddBitmap($hToolbar, 1, -1, $IDB_STD_SMALL_COLOR)
		Case 2
			_GUICtrlToolbar_AddBitmap($hToolbar, 1, -1, $IDB_STD_LARGE_COLOR)
	EndSwitch

	; Добавляет кнопки
	_GUICtrlToolbar_AddButton($hToolbar, $idNew, $STD_FILENEW)
	_GUICtrlToolbar_AddButton($hToolbar, $idOpen, $STD_FILEOPEN)
	_GUICtrlToolbar_AddButton($hToolbar, $idSave, $STD_FILESAVE)
	_GUICtrlToolbar_AddButtonSep($hToolbar)
	_GUICtrlToolbar_AddButton($hToolbar, $idHelp, $STD_HELP)

	; Создаёт раскрывающийся список, чтобы вставить его в ReBar
	$hCombo = _GUICtrlComboBox_Create($hgui, "", 0, 0, 120)

	_GUICtrlComboBox_BeginUpdate($hCombo)
	_GUICtrlComboBox_AddDir($hCombo, @WindowsDir & "\*.exe")
	_GUICtrlComboBox_EndUpdate($hCombo)

	; Создаёт элемент выбора даты и времени, чтобы вставить его в ReBar
	$hDTP = _GUICtrlDTP_Create($hgui, 0, 0, 190)

	; Создаёт поле ввода, чтобы вставить его в ReBar
	; $hInput = GUICtrlCreateInput("Поле ввода", 0, 0, 120, 20)
	$hInput = _GUICtrlEdit_Create($hgui, "Поле ввода", 0, 0, 120, 20)

	; default for add is append

	; Добавляет ленту с элементом
	_GUICtrlRebar_AddBand($hReBar, $hCombo, 120, 200, "Dir *.exe")

	; Добавляет ленту с элементом выбора даты и времени
	_GUICtrlRebar_AddBand($hReBar, $hDTP, 120)

	; Добавляет ленту с элементом toolbar в начало ReBar
	_GUICtrlRebar_AddToolBarBand($hReBar, $hToolbar, "", 0)

	; Добавляет другой элемент
	; _GUICtrlRebar_AddBand($hReBar, GUICtrlGetHandle($hInput), 120, 200, "Заголовок:")
	_GUICtrlRebar_AddBand($hReBar, $hInput, 120, 200, "Заголовок:")

	GUISetState(@SW_SHOW)

	While 1
		Switch GUIGetMsg()
			Case $GUI_EVENT_CLOSE
				Exit
		EndSwitch
	WEnd
EndFunc   ;==>_Main

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	#forceref $hWnd, $iMsg, $iwParam
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
	Local $tAUTOBREAK, $tAUTOSIZE, $tNMREBAR, $tCHEVRON, $tCHILDSIZE, $tOBJECTNOTIFY

	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")
	Switch $hWndFrom
		Case $hReBar
			Switch $iCode
				Case $RBN_AUTOBREAK
					; Уведомляет родителя ReBar, что перенос на новую линию будет появляться в ReBar. Родитель определяет, делать ли перенос
					$tAUTOBREAK = DllStructCreate($tagNMREBARAUTOBREAK, $ilParam)
					_DebugPrint("$RBN_AUTOBREAK" & @LF & "--> hWndFrom:" & @TAB & DllStructGetData($tAUTOBREAK, "hWndFrom") & @LF & _
							"-->IDFrom:" & @TAB & DllStructGetData($tAUTOBREAK, "IDFrom") & @LF & _
							"-->Code:" & @TAB & DllStructGetData($tAUTOBREAK, "Code") & @LF & _
							"-->uBand:" & @TAB & DllStructGetData($tAUTOBREAK, "uBand") & @LF & _
							"-->wID:" & @TAB & DllStructGetData($tAUTOBREAK, "wID") & @LF & _
							"-->lParam:" & @TAB & DllStructGetData($tAUTOBREAK, "lParam") & @LF & _
							"-->uMsg:" & @TAB & DllStructGetData($tAUTOBREAK, "uMsg") & @LF & _
							"-->fStyleCurrent:" & @TAB & DllStructGetData($tAUTOBREAK, "fStyleCurrent") & @LF & _
							"-->fAutoBreak:" & @TAB & DllStructGetData($tAUTOBREAK, "fAutoBreak"))
					; Возвращаемое значение не используется
				Case $RBN_AUTOSIZE
					; Высылается ReBar'ом, созданным со стилем $RBS_AUTOSIZE, когда ReBar автоматически изменяет свои размеры
					$tAUTOSIZE = DllStructCreate($tagNMRBAUTOSIZE, $ilParam)
					_DebugPrint("$RBN_AUTOSIZE" & @LF & "--> hWndFrom:" & @TAB & DllStructGetData($tAUTOSIZE, "hWndFrom") & @LF & _
							"-->IDFrom:" & @TAB & DllStructGetData($tAUTOSIZE, "IDFrom") & @LF & _
							"-->Code:" & @TAB & DllStructGetData($tAUTOSIZE, "Code") & @LF & _
							"-->fChanged:" & @TAB & DllStructGetData($tAUTOSIZE, "fChanged") & @LF & _
							"-->TargetLeft:" & @TAB & DllStructGetData($tAUTOSIZE, "TargetLeft") & @LF & _
							"-->TargetTop:" & @TAB & DllStructGetData($tAUTOSIZE, "TargetTop") & @LF & _
							"-->TargetRight:" & @TAB & DllStructGetData($tAUTOSIZE, "TargetRight") & @LF & _
							"-->TargetBottom:" & @TAB & DllStructGetData($tAUTOSIZE, "TargetBottom") & @LF & _
							"-->ActualLeft:" & @TAB & DllStructGetData($tAUTOSIZE, "ActualLeft") & @LF & _
							"-->ActualTop:" & @TAB & DllStructGetData($tAUTOSIZE, "ActualTop") & @LF & _
							"-->ActualRight:" & @TAB & DllStructGetData($tAUTOSIZE, "ActualRight") & @LF & _
							"-->ActualBottom:" & @TAB & DllStructGetData($tAUTOSIZE, "ActualBottom"))
					; Возвращаемое значение не используется
				Case $RBN_BEGINDRAG
					; Высылается ReBar'ом, когда пользователь начал перетаскивание ленты 
					$tNMREBAR = DllStructCreate($tagNMREBAR, $ilParam)
					_DebugPrint("$RBN_BEGINDRAG" & @LF & "--> hWndFrom:" & @TAB & DllStructGetData($tNMREBAR, "hWndFrom") & @LF & _
							"-->IDFrom:" & @TAB & DllStructGetData($tNMREBAR, "IDFrom") & @LF & _
							"-->Code:" & @TAB & DllStructGetData($tNMREBAR, "Code") & @LF & _
							"-->dwMask:" & @TAB & DllStructGetData($tNMREBAR, "dwMask") & @LF & _
							"-->uBand:" & @TAB & DllStructGetData($tNMREBAR, "uBand") & @LF & _
							"-->fStyle:" & @TAB & DllStructGetData($tNMREBAR, "fStyle") & @LF & _
							"-->wID:" & @TAB & DllStructGetData($tNMREBAR, "wID") & @LF & _
							"-->lParam:" & @TAB & DllStructGetData($tNMREBAR, "lParam"))
					Return 0 ; Позволяет ReBar'у продолжить операцию перетаскивания
;~ 					Return 1 ; иное, кроме ноль, чтобы прервать операцию перетаскивания
				Case $RBN_CHEVRONPUSHED
					; Высылается ReBar'ом, при нажатии шеврона (двойная угловая скобка)
					; Когда приложение получает это уведомление, оно отвечает за отображение всплывающего меню с пунктами для каждой скрытой панели инструментов.
					; Используйте поле rc структуры $tagNMREBARCHEVRON, чтобы найти правильную позицию для всплывающего меню
					$tCHEVRON = DllStructCreate($tagNMREBARCHEVRON, $ilParam)
					_DebugPrint("$RBN_CHEVRONPUSHED" & @LF & "--> hWndFrom:" & @TAB & DllStructGetData($tCHEVRON, "hWndFrom") & @LF & _
							"-->IDFrom:" & @TAB & DllStructGetData($tCHEVRON, "IDFrom") & @LF & _
							"-->Code:" & @TAB & DllStructGetData($tCHEVRON, "Code") & @LF & _
							"-->uBand:" & @TAB & DllStructGetData($tCHEVRON, "uBand") & @LF & _
							"-->wID:" & @TAB & DllStructGetData($tCHEVRON, "wID") & @LF & _
							"-->lParam:" & @TAB & DllStructGetData($tCHEVRON, "lParam") & @LF & _
							"-->Left:" & @TAB & DllStructGetData($tCHEVRON, "Left") & @LF & _
							"-->Top:" & @TAB & DllStructGetData($tCHEVRON, "Top") & @LF & _
							"-->Right:" & @TAB & DllStructGetData($tCHEVRON, "Right") & @LF & _
							"-->lParamNM:" & @TAB & DllStructGetData($tCHEVRON, "lParamNM"))
					; Возвращаемое значение не используется
				Case $RBN_CHILDSIZE
					; Высылается ReBar'ом, когда дочернее окно ленты было изменено в размерах
					$tCHILDSIZE = DllStructCreate($tagNMREBARCHILDSIZE, $ilParam)
					_DebugPrint("$RBN_CHILDSIZE" & @LF & "--> hWndFrom:" & @TAB & DllStructGetData($tCHILDSIZE, "hWndFrom") & @LF & _
							"-->IDFrom:" & @TAB & DllStructGetData($tCHILDSIZE, "IDFrom") & @LF & _
							"-->Code:" & @TAB & DllStructGetData($tCHILDSIZE, "Code") & @LF & _
							"-->uBand:" & @TAB & DllStructGetData($tCHILDSIZE, "uBand") & @LF & _
							"-->wID:" & @TAB & DllStructGetData($tCHILDSIZE, "wID") & @LF & _
							"-->CLeft:" & @TAB & DllStructGetData($tCHILDSIZE, "CLeft") & @LF & _
							"-->CTop:" & @TAB & DllStructGetData($tCHILDSIZE, "CTop") & @LF & _
							"-->CRight:" & @TAB & DllStructGetData($tCHILDSIZE, "CRight") & @LF & _
							"-->CBottom:" & @TAB & DllStructGetData($tCHILDSIZE, "CBottom") & @LF & _
							"-->BLeft:" & @TAB & DllStructGetData($tCHILDSIZE, "BandLeft") & @LF & _
							"-->BTop:" & @TAB & DllStructGetData($tCHILDSIZE, "BTop") & @LF & _
							"-->BRight:" & @TAB & DllStructGetData($tCHILDSIZE, "BRight") & @LF & _
							"-->BBottom:" & @TAB & DllStructGetData($tCHILDSIZE, "BBottom"))
					; Возвращаемое значение не используется
				Case $RBN_DELETEDBAND
					; Высылается ReBar'ом после удаления ленты
					$tNMREBAR = DllStructCreate($tagNMREBAR, $ilParam)
					_DebugPrint("$RBN_DELETEDBAND" & @LF & "--> hWndFrom:" & @TAB & DllStructGetData($tNMREBAR, "hWndFrom") & @LF & _
							"-->IDFrom:" & @TAB & DllStructGetData($tNMREBAR, "IDFrom") & @LF & _
							"-->Code:" & @TAB & DllStructGetData($tNMREBAR, "Code") & @LF & _
							"-->dwMask:" & @TAB & DllStructGetData($tNMREBAR, "dwMask") & @LF & _
							"-->uBand:" & @TAB & DllStructGetData($tNMREBAR, "uBand") & @LF & _
							"-->fStyle:" & @TAB & DllStructGetData($tNMREBAR, "fStyle") & @LF & _
							"-->wID:" & @TAB & DllStructGetData($tNMREBAR, "wID") & @LF & _
							"-->lParam:" & @TAB & DllStructGetData($tNMREBAR, "lParam"))
					; Возвращаемое значение не используется
				Case $RBN_DELETINGBAND
					; Высылается ReBar'ом при удалении ленты
					$tNMREBAR = DllStructCreate($tagNMREBAR, $ilParam)
					_DebugPrint("$RBN_DELETINGBAND" & @LF & "--> hWndFrom:" & @TAB & DllStructGetData($tNMREBAR, "hWndFrom") & @LF & _
							"-->IDFrom:" & @TAB & DllStructGetData($tNMREBAR, "IDFrom") & @LF & _
							"-->Code:" & @TAB & DllStructGetData($tNMREBAR, "Code") & @LF & _
							"-->dwMask:" & @TAB & DllStructGetData($tNMREBAR, "dwMask") & @LF & _
							"-->uBand:" & @TAB & DllStructGetData($tNMREBAR, "uBand") & @LF & _
							"-->fStyle:" & @TAB & DllStructGetData($tNMREBAR, "fStyle") & @LF & _
							"-->wID:" & @TAB & DllStructGetData($tNMREBAR, "wID") & @LF & _
							"-->lParam:" & @TAB & DllStructGetData($tNMREBAR, "lParam"))
					; Возвращаемое значение не используется
				Case $RBN_ENDDRAG
					; Высылается ReBar'ом при завершении перетаскивания ленты пользователем
					$tNMREBAR = DllStructCreate($tagNMREBAR, $ilParam)
					_DebugPrint("$RBN_ENDDRAG" & @LF & "--> hWndFrom:" & @TAB & DllStructGetData($tNMREBAR, "hWndFrom") & @LF & _
							"-->IDFrom:" & @TAB & DllStructGetData($tNMREBAR, "IDFrom") & @LF & _
							"-->Code:" & @TAB & DllStructGetData($tNMREBAR, "Code") & @LF & _
							"-->dwMask:" & @TAB & DllStructGetData($tNMREBAR, "dwMask") & @LF & _
							"-->uBand:" & @TAB & DllStructGetData($tNMREBAR, "uBand") & @LF & _
							"-->fStyle:" & @TAB & DllStructGetData($tNMREBAR, "fStyle") & @LF & _
							"-->wID:" & @TAB & DllStructGetData($tNMREBAR, "wID") & @LF & _
							"-->lParam:" & @TAB & DllStructGetData($tNMREBAR, "lParam"))
					; Возвращаемое значение не используется
				Case $RBN_GETOBJECT
					; Высылается ReBar'ом, созданным со стилем $RBS_REGISTERDROP, когда объект перетаскивается над лентами ReBar
					$tOBJECTNOTIFY = DllStructCreate($tagNMOBJECTNOTIFY, $ilParam)
					_DebugPrint("$RBN_GETOBJECT" & @LF & "--> hWndFrom:" & @TAB & DllStructGetData($tOBJECTNOTIFY, "hWndFrom") & @LF & _
							"-->IDFrom:" & @TAB & DllStructGetData($tOBJECTNOTIFY, "IDFrom") & @LF & _
							"-->Code:" & @TAB & DllStructGetData($tOBJECTNOTIFY, "Code") & @LF & _
							"-->Item:" & @TAB & DllStructGetData($tOBJECTNOTIFY, "Item") & @LF & _
							"-->piid:" & @TAB & DllStructGetData($tOBJECTNOTIFY, "piid") & @LF & _
							"-->pObject:" & @TAB & DllStructGetData($tOBJECTNOTIFY, "pObject") & @LF & _
							"-->Result:" & @TAB & DllStructGetData($tOBJECTNOTIFY, "Result"))
					; Возвращаемое значение не используется
				Case $RBN_HEIGHTCHANGE
					; Высылается ReBar'ом, при изменении высоты
					; Rebar с использованием стиля $CCS_VERT высылает это уведомление, когда его ширина изменилась
					_DebugPrint("$RBN_HEIGHTCHANGE" & @LF & "--> hWndFrom:" & @TAB & $hWndFrom & @LF & _
							"-->IDFrom:" & @TAB & $iIDFrom & @LF & _
							"-->Code:" & @TAB & $iCode)
					; Возвращаемое значение не используется
				Case $RBN_LAYOUTCHANGED
					; Высылается ReBar'ом, когда пользователь изменяет расположение лент
					_DebugPrint("$RBN_LAYOUTCHANGED" & @LF & "--> hWndFrom:" & @TAB & $hWndFrom & @LF & _
							"-->IDFrom:" & @TAB & $iIDFrom & @LF & _
							"-->Code:" & @TAB & $iCode)
					; Возвращаемое значение не используется
				Case $RBN_MINMAX
					; Высылается ReBar'ом, перед достижением максимального или минимального размера ленты
					_DebugPrint("$RBN_MINMAX" & @LF & "--> hWndFrom:" & @TAB & $hWndFrom & @LF & _
							"-->IDFrom:" & @TAB & $iIDFrom & @LF & _
							"-->Code:" & @TAB & $iCode)
;~ 					Return 1 ; ненулевое значение, чтобы предотвратить операцию
					Return 0 ; 0 позволяет продолжить
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _DebugPrint($s_text, $line = @ScriptLineNumber)
	ConsoleWrite( _
			"!===========================================================" & @LF & _
			"+======================================================" & @LF & _
			"-->Строка(" & StringFormat("%04d", $line) & "):" & @TAB & $s_text & @LF & _
			"+======================================================" & @LF)
EndFunc   ;==>_DebugPrint