【VBA×WindowsAPI】CreatePopupMenu関数の使い方

CreatePopupMenu関数

CreatePopupMenu関数はドロップダウンメニュー、サブメニュー、コンテキストメニュー(ショートカットメニュー)を作成するための関数です。この関数で作成されるメニューは”空の状態”であるため、AppendMenu関数InsertMenu関数などのメニュー項目を追加する関数を使ってメニューを1から作成する必要があります。このとき上画像の通り、文字列の設定だけではなくアイコン設定やサブメニューを設定することができます。

作成されたメニューはメモリ上に作成されており画面上には表示されません。画面上に表示させるにはTrackPopupMenu関数TrackPopupMenuEx関数などを使って表示させる必要があります。

CreatePopupMenu関数で作成されたメニューは不要になった場合、DestroyMenu関数を使ってメモリ上から削除(解放)することができます。このとき、メニューをウィンドウに紐づけている場合は自動的に解放されるため必ずしもDestroyMenu関数が必要になるわけではありません。

使用方法

CreatePopupMenu関数を使用するにはあらかじめ関数の宣言しておく必要があります。
※宣言をしないと関数は使えずにエラーとなるので書き忘れに注意しましょう。

使用しているWindowsが32bitか64bitかによって宣言時に書く文言が違います。
環境に合わせて以下のいずれかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内で各関数を使うことができるようになります。

 icon-code  64bit  

Declare PtrSafe Function CreatePopupMenu Lib “user32” () As LongPtr

icon-code  32bit  

Declare Function CreatePopupMenu Lib “user32” () As Long

上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
VBE上では使えない方の構文が赤色で表示される場合がありますが、実行に影響はありません。

 
各関数の宣言文は「Private/Public」を付けて各関数の有効範囲を指定することもできます。

Private Declare PtrSafe Function~ :モジュール内でのみ呼び出し有効
Public Declare PtrSafe Function~ :モジュール外で呼び出し有効

 

構文

CreatePopupMenu関数の構文は下記のように書きます。

icon-code CreatePopupMenu関数 

hMenu = CreatePopupMenu()

戻り値

 hMenu     (64bit:LongPtr型 / 32bit:Long型) 

戻り値はメモリ上に新規作成されたポップアップメニューへのハンドルです。
関数が失敗した場合はNULL(0)が返されます。

サンプルコード

以下はCreatePopupMenu関数FindWindow関数DestroyMenu関数AppendMenu関数GetCursorPos関数TrackPopupMenu関数を使って、UserForm上で右クリックをしたらコンテキストメニューを表示するサンプルコードです。

下記コードをUserFormのコードにコピーペーストしてからUserFormを表示すれば、Initializeイベントでメニューがメモリ上に作成され、右クリックをするとそのメニューを表示することができます。

 

 icon-share-square  VBA×WindowsAPIまとめページ

その他のWindowsAPI関数は下記ページにまとまっているので合わせて参照下さい。

 icon-share-square  参考

Microsoft公式:CreatePopupMenu 関数 (winuser.h) – Win32 apps

Excel, VBA, Windows API

Posted by Lic