#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

; Opt('MustDeclareVars', 1) ; принуждает объявлять все переменные

Example1()
Example2()


; Пример 1

Func Example1()
	Local $contextmenu, $button, $buttoncontext, $buttonitem, $msg
	Local $newsubmenu, $textitem, $fileitem, $saveitem, $infoitem

	; правый клик на gui выводит контекстное меню.
	; правый клик на кнопке "ok" выводит контекстное меню кнопки.

	GUICreate("Моё контекстное меню в GUI", 300, 200)

	$contextmenu = GUICtrlCreateContextMenu()

	$button = GUICtrlCreateButton("OK", 100, 100, 70, 20)
	$buttoncontext = GUICtrlCreateContextMenu($button)
	$buttonitem = GUICtrlCreateMenuItem("О кнопке", $buttoncontext)

	$newsubmenu = GUICtrlCreateMenu("Новое", $contextmenu)
	$textitem = GUICtrlCreateMenuItem("Текст", $newsubmenu)

	$fileitem = GUICtrlCreateMenuItem("Открыть", $contextmenu)
	$saveitem = GUICtrlCreateMenuItem("Сохранить", $contextmenu)
	GUICtrlCreateMenuItem("", $contextmenu) ; разделитель

	$infoitem = GUICtrlCreateMenuItem("Информация", $contextmenu)

	GUISetState()

	; Запускается цикл опроса GUI до тех пор пока окно не будет закрыто
	While 1
		$msg = GUIGetMsg()

		If $msg = $GUI_EVENT_CLOSE Then ExitLoop
	WEnd
	GUIDelete()
EndFunc


; Пример2

Func Example2()
	Local $hGui, $OptionsBtn, $OptionsDummy, $OptionsContext, $OptionsCommon, $OptionsFile, $msg
	Local $OptionsExit, $HelpBtn, $HelpDummy, $HelpContext, $HelpWWW, $HelpAbout
	$hGui = GUICreate("Мой GUI", 170, 40)

	$OptionsBtn = GUICtrlCreateButton("&Опции", 10, 10, 70, 20, $BS_FLAT)

	; Сначала создан элемент - пустышка (Dummy) и контекстное меню для него, которое будет пристроено к кнопке "Опции"
	$OptionsDummy = GUICtrlCreateDummy()
	$OptionsContext = GUICtrlCreateContextMenu($OptionsDummy)
	$OptionsCommon = GUICtrlCreateMenuItem("Общий", $OptionsContext)
	$OptionsFile = GUICtrlCreateMenuItem("Файл", $OptionsContext)
	GUICtrlCreateMenuItem("", $OptionsContext)
	$OptionsExit = GUICtrlCreateMenuItem("Выход", $OptionsContext)

	$HelpBtn = GUICtrlCreateButton("&Справка", 90, 10, 70, 20, $BS_FLAT)

	; Создан элемент - пустышка и контекстное меню, которое будет пристроено к кнопке "Справка"
	$HelpDummy = GUICtrlCreateDummy()
	$HelpContext = GUICtrlCreateContextMenu($HelpDummy)
	$HelpWWW = GUICtrlCreateMenuItem("Веб-сайт", $HelpContext)
	GUICtrlCreateMenuItem("", $HelpContext)
	$HelpAbout = GUICtrlCreateMenuItem("О примере...", $HelpContext)

	GUISetState()

	While 1
		$msg = GUIGetMsg()

		Switch $msg
			Case $OptionsExit, $GUI_EVENT_CLOSE
				ExitLoop

			Case $OptionsBtn
				ShowMenu($hGui, $msg, $OptionsContext)

			Case $HelpBtn
				ShowMenu($hGui, $msg, $HelpContext)

			Case $HelpAbout
				MsgBox(4160, "О примере...", "Удобное меню выбора действий")
		EndSwitch
	WEnd
	GUIDelete()
EndFunc

; Отображает меню в данном GUI окне, которое принадлежит данному элементу в GUI
Func ShowMenu($hWnd, $CtrlID, $nContextID)
	Local $arPos, $x, $y
	Local $hMenu = GUICtrlGetHandle($nContextID)

	$arPos = ControlGetPos($hWnd, "", $CtrlID)

	$x = $arPos[0]
	$y = $arPos[1] + $arPos[3]

	ClientToScreen($hWnd, $x, $y)
	TrackPopupMenu($hWnd, $hMenu, $x, $y)
EndFunc

; Конвертирует клиентские координаты (GUI) в абсолютные координаты экрана (desktop)
Func ClientToScreen($hWnd, ByRef $x, ByRef $y)
	Local $stPoint = DllStructCreate("int;int")

	DllStructSetData($stPoint, 1, $x)
	DllStructSetData($stPoint, 2, $y)

	; См. также _WinAPI_ClientToScreen
	DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint))

	$x = DllStructGetData($stPoint, 1)
	$y = DllStructGetData($stPoint, 2)
	; обнулять структуру не обязательно, так как она локальна
	$stPoint = 0
EndFunc

; Показать контекстное меню (hMenu) принадлежащее GUI окну (hWnd) в указанных координатах (x, y)
Func TrackPopupMenu($hWnd, $hMenu, $x, $y)
	; См. также _GUICtrlMenu_TrackPopupMenu
	DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $x, "int", $y, "hwnd", $hWnd, "ptr", 0)
EndFunc