Функция GUICtrlCreateContextMenu

         Описание функции


GUICtrlCreateContextMenu

Создаёт контекстное меню элемента или окна GUI.

GUICtrlCreateContextMenu ( [ controlID = -1 ] )

Параметры

controlID [необязательный] Идентификатор элемента, возвращённый одной из функцией GUICtrlCreate...

Возвращаемое значение

Успех:Возвращает идентификатор (controlID) нового элемента.
Ошибка:Возвращает 0.

Примечания

После создания основного меню этой функцией, каждый последующий элемент меню может быть создан с помощью GUICtrlCreateMenuItem.
Под-меню могут быть созданы с помощью GUICtrlCreateMenu.

При отсутствии параметра или -1 в этой функции, тогда контекстное меню создаётся для окна GUI, а не для индивидуального элемента управления.

Возможно только одно контекстное меню для каждого элемента. Если вы хотите создать новое контекстное меню, то сначала вы должны удалить существующее меню.

Примечание: Вы не можете создать контекстное меню для элементов, которые уже имеют системное контекстное меню, т.е. для элементов Edit или Input.

См. также

GUICtrlCreateMenuItem, GUICtrlCreateMenu, GUICtrlGetHandle, GUICtrlSetState, GUICtrlDelete

Пример

#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