Function Reference

GUICtrlCreateContextMenu

コントロール用またはGUIウィンドウ全体用のコンテキストメニューを作成します。

GUICtrlCreateContextMenu ( [controlID] )

 

パラメータ

controlID [オプション] GUICtrlCreate...関数によって返されるコントロール識別子。

 

返し値

成功 新しく作成したコントロールの識別子(コントロールID)を返します。
失敗 0を返します。

 

注意

この関数でコンテキストメニューのメインコントロールを作成後、GUICtrlCreateMenuItemを使用して各メニューアイテムを作成できます。
サブメニューはGUICtrlCreateMenuを使用して作成できます。

パラメータ無し、または-1を使用してこの関数を使用すると、作成されたコンテキストメニューは個々のコントロールではなくGUIウィンドウ全体に対して関連付けられます。

コントロールに対してコンテキストメニューを1つだけ作成できます。新しいコンテキストメニューを作成したい場合はまず最初に既存のメニューを削除してください。

注意:既にシステムコンテキストメニューを持っているコントロール(例:エディットコントロール、インプットコントロール)に対してコンテキストメニューを作成することはできません。

 

関連

GUICtrlCreateMenuItem, GUICtrlCreateMenu, GUICtrlGetHandle, GUICtrlSetState, GUICtrlDelete

 


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

Opt('MustDeclareVars', 1)

Example1()
Example2()

; ****************
; * 最初のサンプル *
; ****************
Func Example1()
    Local $contextmenu, $button, $buttoncontext, $buttonitem, $msg
    Local $newsubmenu, $textitem, $fileitem, $saveitem, $infoitem

    ;GUIを右クリックでコンテキストメニューが開く
    ;"ok"ボタンをを右クリックでコントロール指定のコンテキストメニューが開く

    GUICreate("My GUI Context Menu", 300, 200)

    $contextmenu = GUICtrlCreateContextMenu()

    $button = GUICtrlCreateButton("OK", 100, 100, 70, 20)
    $buttoncontext = GUICtrlCreateContextMenu($button)
    $buttonitem = GUICtrlCreateMenuItem("About button", $buttoncontext)

    $newsubmenu = GUICtrlCreateMenu("new", $contextmenu)
    $textitem = GUICtrlCreateMenuItem("text", $newsubmenu)

    $fileitem = GUICtrlCreateMenuItem("Open", $contextmenu)
    $saveitem = GUICtrlCreateMenuItem("Save", $contextmenu)
    GUICtrlCreateMenuItem("", $contextmenu)     ; セパレータ

    $infoitem = GUICtrlCreateMenuItem("Info", $contextmenu)

    GUISetState()

    ; ダイアログが閉じられるまでGUIを実行
    While 1
        $msg = GUIGetMsg()
       
        If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd
    GUIDelete()
EndFunc   ;==>example1


; *****************
; * 2つめのサンプル *
; *****************
Func Example2()
    Local $hGui, $OptionsBtn, $OptionsDummy, $OptionsContext, $OptionsCommon, $OptionsFile, $msg
    Local $OptionsExit, $HelpBtn, $HelpDummy, $HelpContext, $HelpWWW, $HelpAbout
    $hGui = GUICreate("My GUI", 170, 40)

    $OptionsBtn = GUICtrlCreateButton("&Options", 10, 10, 70, 20, $BS_FLAT)

    ; 最初にオプション用のダミーコントロールとそれ用のコンテキストメニューを作成
    $OptionsDummy = GUICtrlCreateDummy()
    $OptionsContext = GUICtrlCreateContextMenu($OptionsDummy)
    $OptionsCommon = GUICtrlCreateMenuItem("Common", $OptionsContext)
    $OptionsFile = GUICtrlCreateMenuItem("File", $OptionsContext)
    GUICtrlCreateMenuItem("", $OptionsContext)
    $OptionsExit = GUICtrlCreateMenuItem("Exit", $OptionsContext)


    $HelpBtn = GUICtrlCreateButton("&Help", 90, 10, 70, 20, $BS_FLAT)

    ; ダミーコントロールとヘルプ用コンテキストメニューも作成
    $HelpDummy = GUICtrlCreateDummy()
    $HelpContext = GUICtrlCreateContextMenu($HelpDummy)
    $HelpWWW = GUICtrlCreateMenuItem("Website", $HelpContext)
    GUICtrlCreateMenuItem("", $HelpContext)
    $HelpAbout = GUICtrlCreateMenuItem("About...", $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(64, "About...", "GUICtrlGetHandle-Sample")
        EndSwitch
    WEnd
    GUIDelete()
EndFunc   ;==>Example2


; 指定したGUIウィンドウ内の指定したGUI-ctrlに属するメニューを表示
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   ;==>ShowMenu


; クライアント(GUI)座標をスクリーン(デスクトップ)座標に変換
Func ClientToScreen($hWnd, ByRef $x, ByRef $y)
    Local $stPoint = DllStructCreate("int;int")
   
    DllStructSetData($stPoint, 1, $x)
    DllStructSetData($stPoint, 2, $y)

    DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint))
   
    $x = DllStructGetData($stPoint, 1)
    $y = DllStructGetData($stPoint, 2)
    ; 構造体を解放。ローカルなので本当は不必要
    $stPoint = 0
EndFunc   ;==>ClientToScreen


; 指定された座標(x、y)に指定されたGUIウィンドウ(hWnd)に属するポップアップメニュー(hMenu)を表示
Func TrackPopupMenu($hWnd, $hMenu, $x, $y)
    DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $x, "int", $y, "hwnd", $hWnd, "ptr", 0)
EndFunc   ;==>TrackPopupMenu