Firefox などのメインメニューでメニュー項目を更に右クリックして
「新しいタブで開く」とかできますが
Delphiで実現するにはどうしたらよいでしょうか?
開発環境はDelphi2009です
ポップアップメニューは左クリックでも右クリックでも
同じクリックイベントが発生しますが、これを区別する方法は
色々調べてみましたが無さそうですねぇ・・・
マウス位置のメインメニューアイテムだけなら以下で取れます。
ただしpopupmenu1.popupでポップアップメニューが表示されません。
(多分VCL側で何かしているのかと…)
ポップアップメニュー上の右クリックは、
・サブメニューがないとダメ
・SetWindowsHookExでフックする
だった記憶があります。
m_mnuItem: TMenuItem;
// メニューの選択項目をグローバルに格納しておく
procedure TForm1.WMMenuSelect(var Message: TWMMenuSelect);
var
FindKind: TFindItemKind;
ItemIndex: Integer;
begin
if m_bDestroy then Exit;
m_mnuItem := nil;
FindKind := fkCommand;
if Message.MenuFlag and MF_POPUP <> 0 then begin
FindKind := fkHandle;
end;
if FindKind = fkHandle then begin
if Message.Menu <> 0 then begin
ItemIndex := GetSubMenu(Message.Menu, Message.IDItem);
end else begin
ItemIndex := -1;
end;
end else begin
ItemIndex := Message.IDItem;
end;
m_mnuItem := MainMenu1.FindItem(ItemIndex, FindKind);
inherited;
end;
procedure TForm1.WMRButtonUp(var Message: TWMRButtonUp);
var
pos: TPoint;
begin
if Assigned(m_mnuItem) then begin
GetCursorPos(pos);
popupmenu1.popup( pos.X , pos.Y );
s_debugmsg(format('WMRButtonUp caption=%s',[m_mnuItem.caption]));
end;
inherited;
end;
APIを直接やれば出来ないかな?と調べていたら
TrackPopupMenuでTPM_RECURSEを指定してあげれば出来るようでした。
popupmenu1.popup→s_Popupに。
procedure TForm1.s_Popup();
var
pos: TPoint;
hMenuP: HMENU;
begin
GetCursorPos(pos);
hMenuP := CreatePopupMenu();
AppendMenu(hMenuP, MF_STRING, 1, 'Messag');
AppendMenu(hMenuP, MF_STRING, 2, 'Exit');
TrackPopupMenu( hMenuP, TPM_RECURSE, pos.x, pos.y, 0, Handle, nil );
end;
メインメニューをボタンで作れば??
procedure TDaysDisp.OnButton11MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbRight then
ツイート | ![]() |