指定位置にポップアップメニューの作成 <TOP>
カーソルで指定した位置にポップアップメニューを表示します。新たに作成するポップアップメニュー・システムメニューを選択して表示させています。
CreatePopupMenu ポップアップメニューを作成
TrackPopupMenu(TrackPopupMenuEx) 指定の位置にポップアップメニューを表示
GetSystemMenu システムメニューを取得
AppendMenu メニュー末尾にメニューアイテムを追加
DestroyMenu メニューを破棄
GetCursorPos マウスカーソルの位置を取得
WindowsXP
Windows98
Windows98ではTrackPooupMenu時左から右へ、SystemMenu時上から下へアニメーション表示されます。
TrackPopupMenuとTrackPopupMenuEx
Declare Function Api_TrackPopupMenu& Lib "user32" Alias "TrackPopupMenu" (ByVal hMenu&, ByVal wFlags&, ByVal x&, ByVal y&, ByVal nReserved&, ByVal hWnd&, ByVal lprc As Any) Declare Function Api_TrackPopupMenuEx& Lib "user32" Alias "TrackPopupMenuEx" (ByVal hMenu&, ByVal wFlags&, ByVal x&, ByVal y&, ByVal hWnd&, ByVal lptpm As Any)
'================================================================ '= ポップアップメニューの作成 '= (TrackPopupMenu.bas) '================================================================ #include "Windows.bi" #define MF_APPEND &H100 ' #define MF_BYCOMMAND &H0 'nPositionはメニュー項目のID #define MF_BYPOSITION &H400 'nPositionはメニュー項目のインデックス #define MF_CHECKED &H8 'メニュー項目にチェックをつける #define MF_DISABLED &H2 'アイテムを選択不可にする #define MF_GRAYED &H1 'グレー表示されて選択できない #define MF_HILITE &H80 'メニューの項目を強調表示 #define MF_MOVE &H1000 ' #define MF_SEPARATOR &H800 'メニュー項目はセパレータ #define MF_STRING &H0 '文字列 #define MF_UNHILITE &H0 'メニューの項目を強調表示しない #define TPM_BOTTOMALIGN &H20 'ショートカットメニューの下端を、y パラメータが指定する座標に合わせる #define TPM_CENTERALIGN &H4 'ショートカットメニューの中心を、x パラメータが指定する座標に合わせる #define TPM_HORNEGANIMATION &H800 '左から右へ向かってメニューのアニメーション表示 #define TPM_HORPOSANIMATION &H400 '右から左へ向かってメニューのアニメーション表示 #define TPM_LEFTALIGN &H0 'ショートカットメニューの左端を、xパラメータが指定する座標に合わせる #define TPM_LEFTBUTTON &H0 'マウスの左ボタンでポップアップメニューからの選択が行えるようにする #define TPM_NONOTIFY &H80 'ユーザーがメニュー項目をクリックしたとき、通知メッセージを送らない #define TPM_RETURNCMD &H100 '関数の戻り値として、ユーザーが選択したメニュー項目のIDを返す #define TPM_RIGHTALIGN &H8 'ショートカットメニューの右端を、x パラメータが指定する座標に合わせる #define TPM_RIGHTBUTTON &H2 'マウスの右ボタンでポップアップメニューからの選択が行えるようにする #define TPM_TOPALIGN &H0 'ショートカットメニューの上端を、yパラメータが指定する座標に合わせる #define TPM_VCENTERALIGN &H10 'ショートカットメニューの中心を、yパラメータが指定する座標に合わせる #define TPM_VERNEGANIMATION &H2000 '下から上へ向かってメニューのアニメーション表示 #define TPM_VERPOSANIMATION &H1000 '上から下へ向かってメニューのアニメーション表示 Type POINTAPI x As Long y As Long End Type ' ドロップダウンメニュー、サブメニュー、ショートカットメニューのいずれかを作成 Declare Function Api_CreatePopupMenu& Lib "user32" Alias "CreatePopupMenu" () ' 指定の位置にポップアップメニューを表示 Declare Function Api_TrackPopupMenu& Lib "user32" Alias "TrackPopupMenu" (ByVal hMenu&, ByVal wFlags&, ByVal x&, ByVal y&, ByVal nReserved&, ByVal hWnd&, ByVal lprc As Any) ' システムメニューのハンドル取得 Declare Function Api_GetSystemMenu& Lib "user32" Alias "GetSystemMenu" (ByVal hWnd&, ByVal bRevert&) ' メニューの末尾に新しいメニュー項目を追加( InsertMenuItemを推奨) Declare Function Api_AppendMenu& Lib "user32" Alias "AppendMenuA" (ByVal hMenu&, ByVal wFlags&, ByVal wIDNewItem&, ByVal lpNewItem As Any) ' 指定されたメニューを破棄し、そのメニューに割り当てられていたメモリを解放 Declare Function Api_DestroyMenu& Lib "user32" Alias "DestroyMenu" (ByVal hMenu&) ' マウスカーソル(マウスポインタ)の現在の位置に相当するスクリーン座標を取得 Declare Function Api_GetCursorPos& Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) Var Shared hMenu As Long '================================================================ '= '================================================================ Declare Function ButtonNo bdecl () As Long Function ButtonNo() ButtonNo = Val(Mid$(GetDlgRadioSelect("Radio1"), 6)) -1 End Function '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() Var Ret As Long hMenu = Api_CreatePopupMenu() 'メニュー項目設定 Ret = Api_AppendMenu(hMenu, MF_STRING, ByVal 0, "Hello !") Ret = Api_AppendMenu(hMenu, MF_GRAYED Or MF_DISABLED, ByVal 0, "試験中 ...") Ret = Api_AppendMenu(hMenu, MF_SEPARATOR, ByVal 0, ByVal 0) Ret = Api_AppendMenu(hMenu, MF_CHECKED, ByVal 0, "TrackPopupMenu") End Sub '================================================================ '= '================================================================ Declare Sub MainForm_MouseUp edecl (ByVal Button%, ByVal Shift%, ByVal x!, ByVal y!) Sub MainForm_MouseUp(ByVal Button%, ByVal Shift%, ByVal x!, ByVal y!) Var pa As POINTAPI Var Ret As Long 'マウスカーソルの位置を取得 Ret = Api_GetCursorPos(pa) If ButtonNo = 0 Then '新規ポップアップメニュー表示 Ret = Api_TrackPopupMenu(hMenu, TPM_LEFTALIGN Or TPM_HORPOSANIMATION, pa.x, pa.y, 0, GethWnd, ByVal 0) Else 'システムメニュー表示 Ret = Api_GetSystemMenu(GethWnd, False) Ret = Api_TrackPopupMenu(Ret, TPM_LEFTALIGN Or TPM_VERPOSANIMATION, pa.x, pa.y, 0, GethWnd, ByVal 0) End If End Sub '================================================================ '= '================================================================ Declare Sub MainForm_QueryClose edecl (Cancel%, ByVal Mode%) Sub MainForm_QueryClose(Cancel%, ByVal Mode%) Var Ret As Long Ret = Api_DestroyMenu(hMenu) End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End