メニューの右クリック


たじま  2014-07-24 18:12:46  No: 46496

Firefox などのメインメニューでメニュー項目を更に右クリックして
「新しいタブで開く」とかできますが
Delphiで実現するにはどうしたらよいでしょうか?
開発環境はDelphi2009です


deldel  2014-07-29 20:45:39  No: 46497

ポップアップメニューは左クリックでも右クリックでも
同じクリックイベントが発生しますが、これを区別する方法は
色々調べてみましたが無さそうですねぇ・・・


AE85  2014-07-30 02:19:02  No: 46498

マウス位置のメインメニューアイテムだけなら以下で取れます。
ただし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;


AE85  2014-08-07 20:08:42  No: 46499

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;


AS  2014-10-06 16:13:13  No: 46500

メインメニューをボタンで作れば??

procedure TDaysDisp.OnButton11MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbRight then


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加