delphi 自绘 PopupMenu 使用trackpopupmenu 弹出,点击菜单项没有反应

发布时间:2024-05-18 18:33 发布:上海旅游网

问题描述:

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
ApplicationEvents1: TApplicationEvents;
procedure Button1Click(Sender: TObject);
procedure PopupMenuItemsClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
PopupMenu1: TPopupMenu;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.AddMenuItemClick(Sender: TObject);
var
index: Integer;
NewItem: TMenuItem;
begin
for index := 0 to 3 do
begin
NewItem := TMenuItem.Create(PopupMenu1);
PopupMenu1.Items.Add(NewItem);
NewItem.Caption := 'Menu Item ' + IntToStr(index);
NewItem.Tag := index;
NewItem.OnClick := PopupMenuItemsClick;
end;
end;

procedure TForm1.PopupMenuClick(Sender: TObject);
var
PT: TPoint;
begin
pt.X := button2.Left;
pt.Y := button2.Top + button2.Height;
PT := ClientToScreen(PT);
TrackPopupMenu (PopupMenu1.Handle,
TPM_LEFTALIGN + TPM_LEFTBUTTON + TPM_RETURNCMD,
pt.x, pt.y, 0, Handle, nil);
// PopupMenu1.Popup(PT.X, PT.Y);// 使用这行代码点击菜单项就有反应。
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
PopupMenu1 := TPopupMenu.Create(self);
end;

procedure TForm1.PopupMenuItemsClick(Sender: TObject);
begin
with Sender as TMenuItem do
begin
case Tag of
0: ShowMessage('first item clicked');
1: ShowMessage('second item clicked');
2: ShowMessage('third item clicked');
3: ShowMessage('fourth item clicked');
end;
end;
end;

问题解答:

刚才我也遇到了这样的问题,然后我发现是trackpopupmenu的第6个参数指向的窗口句柄错了,我将该句柄指向了我的窗口,消息就回来了。

热点新闻