#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>

$Debug_SB = False ; Проверяет ClassName передаваемый в функции. Установите True и используйте дескриптор от другого элемента, чтобы увидеть как это работает

Global $iMemo, $MainGUI, $hStatus

Example1()
Example2()
Example3()
Example4()
Example5()
Example6()

Func Example1()

	Local $hGUI
	Local $aParts[3] = [75, 150, -1]

	; Создаёт GUI
	$hGUI = GUICreate("(Пример 1) Создание StatusBar", 400, 300)

	;===============================================================================
	; по умолчанию одна часть, без текста
	$hStatus = _GUICtrlStatusBar_Create ($hGUI)
	;===============================================================================
	_GUICtrlStatusBar_SetParts ($hStatus, $aParts)

	; Создаёт элемент для заметок
	$iMemo = GUICtrlCreateEdit("", 2, 2, 396, 274, $WS_VSCROLL)
	GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
	GUICtrlSendMsg($iMemo, $EM_SETREADONLY, True, 0)
	GUICtrlSetBkColor($iMemo, 0xFFFFFF)
	MemoWrite("StatusBar Created with:" & @CRLF & _
			@TAB & "Handle to GUI window" & @CRLF)
	GUISetState()

	GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

	; Получает размер границ
	MemoWrite("Ширина горизонтальной границы: " & _GUICtrlStatusBar_GetBordersHorz ($hStatus))
	MemoWrite("Ширина вертикальной границы..: " & _GUICtrlStatusBar_GetBordersVert ($hStatus))
	MemoWrite("Ширина между прямоугольниками: " & _GUICtrlStatusBar_GetBordersRect ($hStatus))

	; Цикл выполняется, пока окно не будет закрыто
	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
	GUISetState(@SW_ENABLE, $MainGUI)
	GUIDelete($hGUI)
EndFunc   ;==>Example1

Func Example2()

	Local $hGUI
	Local $aParts[3] = [75, 150, -1]

	; Создаёт GUI
	$hGUI = GUICreate("(Пример 2) Создание StatusBar", 400, 300)

	;===============================================================================
	; Устанавливает части без текста
	$hStatus = _GUICtrlStatusBar_Create ($hGUI, $aParts)
	;===============================================================================

	; Создаёт элемент для заметок
	$iMemo = GUICtrlCreateEdit("", 2, 2, 396, 274, $WS_VSCROLL)
	GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
	GUICtrlSendMsg($iMemo, $EM_SETREADONLY, True, 0)
	GUICtrlSetBkColor($iMemo, 0xFFFFFF)
	MemoWrite("StatusBar Created with:" & @CRLF & _
			@TAB & "Handle to GUI window" & @CRLF & _
			@TAB & "ширина части массива из 3 элементов" & @CRLF)
	GUISetState()

	GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

	; Получает размер границ
	MemoWrite("Ширина горизонтальной границы: " & _GUICtrlStatusBar_GetBordersHorz ($hStatus))
	MemoWrite("Ширина вертикальной границы..: " & _GUICtrlStatusBar_GetBordersVert ($hStatus))
	MemoWrite("Ширина между прямоугольниками: " & _GUICtrlStatusBar_GetBordersRect ($hStatus))

	; Цикл выполняется, пока окно не будет закрыто
	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
	GUISetState(@SW_ENABLE, $MainGUI)
	GUIDelete($hGUI)
EndFunc   ;==>Example2

Func Example3()

	Local $hGUI
	Local $aText[3] = ["Левое выравнивание", @TAB & "Центр", @TAB & @TAB & "Правое выравнивание"]
	Local $aParts[3] = [100, 175, -1]

	; Создаёт GUI
	$hGUI = GUICreate("(Пример 3) Создание StatusBar", 400, 300)

	;===============================================================================
	; Устанавливает части и текст
	$hStatus = _GUICtrlStatusBar_Create ($hGUI, $aParts, $aText)
	;===============================================================================

	; Создаёт элемент для заметок
	$iMemo = GUICtrlCreateEdit("", 2, 2, 396, 274, $WS_VSCROLL)
	GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
	GUICtrlSendMsg($iMemo, $EM_SETREADONLY, True, 0)
	GUICtrlSetBkColor($iMemo, 0xFFFFFF)
	MemoWrite("StatusBar Created with:" & @CRLF & _
			@TAB & "только дескриптор," & @CRLF & _
			@TAB & "ширина части массива из 3 элементов" & @CRLF & _
			@TAB & "текст части массива из 3 элементов" & @CRLF)
	GUISetState()

	GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

	; Получает размер границ
	MemoWrite("Ширина горизонтальной границы: " & _GUICtrlStatusBar_GetBordersHorz ($hStatus))
	MemoWrite("Ширина вертикальной границы..: " & _GUICtrlStatusBar_GetBordersVert ($hStatus))
	MemoWrite("Ширина между прямоугольниками: " & _GUICtrlStatusBar_GetBordersRect ($hStatus))

	; Цикл выполняется, пока окно не будет закрыто
	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
	GUISetState(@SW_ENABLE, $MainGUI)
	GUIDelete($hGUI)
EndFunc   ;==>Example3

Func Example4()

	Local $hGUI
	Local $aText[3] = ["Левое выравнивание", @TAB & "Центр", @TAB & @TAB & "Правое выравнивание"]

	; Создаёт GUI
	$hGUI = GUICreate("(Пример 4) Создание StatusBar", 400, 300)

	;===============================================================================
	; создаёт ширину частей на основе переданного размера части
	$hStatus = _GUICtrlStatusBar_Create ($hGUI, 100, $aText)
	;===============================================================================

	; Создаёт элемент для заметок
	$iMemo = GUICtrlCreateEdit("", 2, 2, 396, 274, $WS_VSCROLL)
	GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
	GUICtrlSendMsg($iMemo, $EM_SETREADONLY, True, 0)
	GUICtrlSetBkColor($iMemo, 0xFFFFFF)
	MemoWrite("StatusBar Created with:" & @CRLF & _
			@TAB & "только дескриптор," & @CRLF & _
			@TAB & "part width number" & @CRLF & _
			@TAB & "текст части массива из 3 элементов" & @CRLF)
	GUISetState()

	GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

	; Получает размер границ
	MemoWrite("Ширина горизонтальной границы: " & _GUICtrlStatusBar_GetBordersHorz ($hStatus))
	MemoWrite("Ширина вертикальной границы..: " & _GUICtrlStatusBar_GetBordersVert ($hStatus))
	MemoWrite("Ширина между прямоугольниками: " & _GUICtrlStatusBar_GetBordersRect ($hStatus))

	; Цикл выполняется, пока окно не будет закрыто
	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
	GUISetState(@SW_ENABLE, $MainGUI)
	GUIDelete($hGUI)
EndFunc   ;==>Example4

Func Example5()

	Local $hGUI
	Local $aText[3] = ["Левое выравнивание", @TAB & "Центр", @TAB & @TAB & "Правое выравнивание"]
	Local $aParts[2] = [100, 175]

	; Создаёт GUI
	$hGUI = GUICreate("(Пример 5) Создание StatusBar", 400, 300)


	;===============================================================================
	; Приспосабливает массив к большему массиву (здесь массив с текстом больше)
	$hStatus = _GUICtrlStatusBar_Create ($hGUI, $aParts, $aText)
	;===============================================================================

	; Создаёт элемент для заметок
	$iMemo = GUICtrlCreateEdit("", 2, 2, 396, 274, $WS_VSCROLL)
	GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
	GUICtrlSendMsg($iMemo, $EM_SETREADONLY, True, 0)
	GUICtrlSetBkColor($iMemo, 0xFFFFFF)
	MemoWrite("StatusBar Created with:" & @CRLF & _
			@TAB & "только дескриптор," & @CRLF & _
			@TAB & "ширина части массива из 2 элементов" & @CRLF & _
			@TAB & "текст части массива из 3 элементов" & @CRLF)
	GUISetState()

	GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

	; Получает размер границ
	MemoWrite("Ширина горизонтальной границы: " & _GUICtrlStatusBar_GetBordersHorz ($hStatus))
	MemoWrite("Ширина вертикальной границы..: " & _GUICtrlStatusBar_GetBordersVert ($hStatus))
	MemoWrite("Ширина между прямоугольниками: " & _GUICtrlStatusBar_GetBordersRect ($hStatus))

	; Цикл выполняется, пока окно не будет закрыто
	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
	GUISetState(@SW_ENABLE, $MainGUI)
	GUIDelete($hGUI)
EndFunc   ;==>Example5

Func Example6()

	Local $hGUI
	Local $aText[2] = ["Левое выравнивание", @TAB & "Центр"]
	Local $aParts[3] = [100, 175, -1]

	; Создаёт GUI
	$hGUI = GUICreate("(Пример 6) Создание StatusBar", 400, 300)

	;===============================================================================
	; Приспосабливает массив к большему массиву (здесь массив с шириной частей больше)
	$hStatus = _GUICtrlStatusBar_Create ($hGUI, $aParts, $aText)
	;===============================================================================

	; Создаёт элемент для заметок
	$iMemo = GUICtrlCreateEdit("", 2, 2, 396, 274, $WS_VSCROLL)
	GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
	GUICtrlSendMsg($iMemo, $EM_SETREADONLY, True, 0)
	GUICtrlSetBkColor($iMemo, 0xFFFFFF)
	MemoWrite("StatusBar Created with:" & @CRLF & _
			@TAB & "только дескриптор," & @CRLF & _
			@TAB & "ширина части массива из 3 элементов" & @CRLF & _
			@TAB & "текст части массива из 2 элементов" & @CRLF)
	GUISetState()

	GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

	; Получает размер границ
	MemoWrite("Ширина горизонтальной границы: " & _GUICtrlStatusBar_GetBordersHorz ($hStatus))
	MemoWrite("Ширина вертикальной границы..: " & _GUICtrlStatusBar_GetBordersVert ($hStatus))
	MemoWrite("Ширина между прямоугольниками: " & _GUICtrlStatusBar_GetBordersRect ($hStatus))

	; Цикл выполняется, пока окно не будет закрыто
	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
	GUISetState(@SW_ENABLE, $MainGUI)
	GUIDelete($hGUI)
EndFunc   ;==>Example6

; Записывает строку в элемент для заметок
Func MemoWrite($sMessage = "")
	GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
EndFunc   ;==>MemoWrite

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
	#forceref $hWnd, $iMsg, $iwParam
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR

	$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")
	Local $tinfo
	Switch $hWndFrom
		Case $hStatus
			Switch $iCode
				Case $NM_CLICK  ; Пользователь кликает левую кнопку мыши на элементе
					$tinfo = DllStructCreate($tagNMMOUSE, $ilParam)
					$hWndFrom = HWnd(DllStructGetData($tinfo, "hWndFrom"))
					$iIDFrom = DllStructGetData($tinfo, "IDFrom")
					$iCode = DllStructGetData($tinfo, "Code")
					_DebugPrint("$NM_CLICK" & @LF & "--> hWndFrom:" & @TAB & $hWndFrom & @LF & _
							"-->IDFrom:" & @TAB & $iIDFrom & @LF & _
							"-->Code:" & @TAB & $iCode & @LF & _
							"-->ItemSpec:" & @TAB & DllStructGetData($tinfo, "ItemSpec") & @LF & _
							"-->ItemData:" & @TAB & DllStructGetData($tinfo, "ItemData") & @LF & _
							"-->X:" & @TAB & DllStructGetData($tinfo, "X") & @LF & _
							"-->Y:" & @TAB & DllStructGetData($tinfo, "Y") & @LF & _
							"-->HitInfo:" & @TAB & DllStructGetData($tinfo, "HitInfo"))
					Return TRUE ; указывает, что клик мыши был обработан и по умолчанию обработка в системе подавлена
;~ 					Return FALSE ; разрешает заданную по умолчанию обработку клика.
				Case $NM_DBLCLK  ; Пользователь сделал двойной клик левой кнопкой мыши на элементе
					$tinfo = DllStructCreate($tagNMMOUSE, $ilParam)
					$hWndFrom = HWnd(DllStructGetData($tinfo, "hWndFrom"))
					$iIDFrom = DllStructGetData($tinfo, "IDFrom")
					$iCode = DllStructGetData($tinfo, "Code")
					_DebugPrint("$NM_DBLCLK" & @LF & "--> hWndFrom:" & @TAB & $hWndFrom & @LF & _
							"-->IDFrom:" & @TAB & $iIDFrom & @LF & _
							"-->Code:" & @TAB & $iCode & @LF & _
							"-->ItemSpec:" & @TAB & DllStructGetData($tinfo, "ItemSpec") & @LF & _
							"-->ItemData:" & @TAB & DllStructGetData($tinfo, "ItemData") & @LF & _
							"-->X:" & @TAB & DllStructGetData($tinfo, "X") & @LF & _
							"-->Y:" & @TAB & DllStructGetData($tinfo, "Y") & @LF & _
							"-->HitInfo:" & @TAB & DllStructGetData($tinfo, "HitInfo"))
					Return TRUE ; указывает, что клик мыши был обработан и по умолчанию обработка в системе подавлена
;~ 					Return FALSE ; разрешает заданную по умолчанию обработку клика.
				Case $NM_RCLICK  ; Пользователь кликает правую кнопку мыши на элементе
					$tinfo = DllStructCreate($tagNMMOUSE, $ilParam)
					$hWndFrom = HWnd(DllStructGetData($tinfo, "hWndFrom"))
					$iIDFrom = DllStructGetData($tinfo, "IDFrom")
					$iCode = DllStructGetData($tinfo, "Code")
					_DebugPrint("$NM_RCLICK" & @LF & "--> hWndFrom:" & @TAB & $hWndFrom & @LF & _
							"-->IDFrom:" & @TAB & $iIDFrom & @LF & _
							"-->Code:" & @TAB & $iCode & @LF & _
							"-->ItemSpec:" & @TAB & DllStructGetData($tinfo, "ItemSpec") & @LF & _
							"-->ItemData:" & @TAB & DllStructGetData($tinfo, "ItemData") & @LF & _
							"-->X:" & @TAB & DllStructGetData($tinfo, "X") & @LF & _
							"-->Y:" & @TAB & DllStructGetData($tinfo, "Y") & @LF & _
							"-->HitInfo:" & @TAB & DllStructGetData($tinfo, "HitInfo"))
					Return TRUE ; указывает, что клик мыши был обработан и по умолчанию обработка в системе подавлена
;~ 					Return FALSE ; разрешает заданную по умолчанию обработку клика.
				Case $NM_RDBLCLK  ; Пользователь сделал двойной клик правой кнопкой мыши на элементе
					$tinfo = DllStructCreate($tagNMMOUSE, $ilParam)
					$hWndFrom = HWnd(DllStructGetData($tinfo, "hWndFrom"))
					$iIDFrom = DllStructGetData($tinfo, "IDFrom")
					$iCode = DllStructGetData($tinfo, "Code")
					_DebugPrint("$NM_RDBLCLK" & @LF & "--> hWndFrom:" & @TAB & $hWndFrom & @LF & _
							"-->IDFrom:" & @TAB & $iIDFrom & @LF & _
							"-->Code:" & @TAB & $iCode & @LF & _
							"-->ItemSpec:" & @TAB & DllStructGetData($tinfo, "ItemSpec") & @LF & _
							"-->ItemData:" & @TAB & DllStructGetData($tinfo, "ItemData") & @LF & _
							"-->X:" & @TAB & DllStructGetData($tinfo, "X") & @LF & _
							"-->Y:" & @TAB & DllStructGetData($tinfo, "Y") & @LF & _
							"-->HitInfo:" & @TAB & DllStructGetData($tinfo, "HitInfo"))
					Return TRUE ; указывает, что клик мыши был обработан и по умолчанию обработка в системе подавлена
;~ 					Return FALSE ; разрешает заданную по умолчанию обработку клика.
				Case $SBN_SIMPLEMODECHANGE  ; Simple mode changes 
					_DebugPrint("$SBN_SIMPLEMODECHANGE" & @LF & "--> hWndFrom:" & @TAB & $hWndFrom & @LF & _
							"-->IDFrom:" & @TAB & $iIDFrom & @LF & _
							"-->Code:" & @TAB & $iCode)
					; Нет возвращаемых значений
			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