指定位置にポップアップメニューの作成          <TOP>


カーソルで指定した位置にポップアップメニューを表示します。新たに作成するポップアップメニュー・システムメニューを選択して表示させています。

CreatePopupMenu ポップアップメニューを作成

TrackPopupMenu(TrackPopupMenuEx) 指定の位置にポップアップメニューを表示

GetSystemMenu システムメニューを取得

AppendMenu メニュー末尾にメニューアイテムを追加

DestroyMenu メニューを破棄

GetCursorPos マウスカーソルの位置を取得


WindowsXP                                                       Windows98

 
Windows98ではTrackPooupMenu時左から右へ、SystemMenu時上から下へアニメーション表示されます。

TrackPopupMenuTrackPopupMenuEx

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