Как указано в документации для WM_CONTEXTMENU
, когда дочернее окно не обрабатывает сообщение, процедура окна по умолчанию отправляет сообщение в родительское окно.
Таким образом, вы можете отобразить всплывающее меню, обработав сообщение на родительском элементе управления. В приведенном ниже примере отображается «PopupMenu1» для «Panel1», помещенной в форму, вам может потребоваться настроить ее, если элемент управления не размещен непосредственно в форме.
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
Panel1: TPanel;
..
protected
procedure WMContextMenu(var Message: TWMContextMenu);
message WM_CONTEXTMENU;
end;
...
procedure TForm1.WMContextMenu(var Message: TWMContextMenu);
var
Pt: TPoint;
Control: TControl;
begin
Pt := SmallPointToPoint(Message.Pos);
Control := ControlAtPos(ScreenToClient(Pt), False, True, True);
if Control = Panel1 then begin
PopupMenu1.PopupComponent := Panel1;
PopupMenu1.Popup(Pt.X, Pt.Y);
Message.Result := 1;
end;
inherited;
end;