ポップアップメニュー

ソース

Win32 APIを使って、ポップアップメニュー(右クリックメニュー、コンテキストメニュー)を実現してみました。

●APIの宣言

「USER32」の、「DWORD GetMenu(DWORD)」を、「?」の、「メニュー取得」として、DLLを利用。
「USER32」の、「DWORD GetSubMenu(DWORD,DWORD)」を、「?,?」の、「サブメニュー取得」として、DLLを利用。
「USER32」の、「DWORD TrackPopupMenu(DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD)」を、
「?,?,?,?,?,?,?」の、「ポップアップメニュー表示」として、DLLを利用。

関数引数戻り値
GetMenu母艦のハンドルメニューのハンドル
GetSubMenuメニューのハンドル
取得したい親メニューの番目
親メニューのハンドル
TrackPopupMenu親メニューのハンドル
オプション(0か2がおすすめ)
X座標
Y座標
?(0でいい)
母艦のハンドル
?(0でいい)
成功なら0以外
失敗なら0
参考資料:http://homepage1.nifty.com/MADIA/vb/API/TrackPopupMenu.htm

●メニューの設定

ファイルメニューを、メニュー作成。
編集メニューを、メニュー作成。
ポップアップメニューを、メニュー作成。
   ポップアップメニューに、切り取りメニューを、メニュー追加。
      その、イベントは、「切り取っちゃう」と、言う。
   ポップアップメニューに、コピーメニューを、メニュー追加。
      その、イベントは、「コピーしちゃう」と、言う。
   ポップアップメニューに、貼り付けメニューを、メニュー追加。
      その、イベントは、「貼り付けちゃう」と、言う。
   ポップアップメニューに、区切りメニューを、メニュー追加。その、テキストは、「-」
   ポップアップメニューに、終了メニューを、メニュー追加。
      その、イベントは、終わる。

ポップアップ用の親&子メニューを用意します。

●右クリックした時

母艦の、マウス押した時は、(
   もし、押された特殊キー<>「Right」ならば、待機。
   X=(母艦の、X)+マウスX+2'2はウィンドウ枠の幅。
   Y=(母艦の、Y)+マウスY+40'40はタイトルバー+メニューバー+枠の高さ。
   メニューハンドル,2,X,Y,0,(母艦の、ハンドル),0ポップアップメニュー表示
)   

『マウス押した時』イベントで『押された特殊キー』が「Right」ならば、 右クリックされたということで、先に進みます。

X,Yはデスクトップ上の座標を指定します。
  2=ウィンドウ枠の幅
  40=ウィンドウ枠の高さ(2)+タイトルバーの高さ(19)+メニューバーの高さ(19)
としてますが、合ってるでしょうか?(^_^;)

●起動した時

{メニューハンドル取得}
(母艦の、ハンドル)の、メニュー取得'メニューバーのハンドル取得?
それ、2の、サブメニュー取得'3番目の親メニューのハンドル取得?
メニューハンドル=それ。

ポップアップメニューの、可視は、オフ。
母艦浮上。
待機。

起動時に、「メニュー取得」「サブメニュー取得」で、 ポップアップ用メニューのハンドルを取得します。


(C) 2002 moka