Delphi:make函数返回PopupMenu结果

时间:2014-02-12 20:19:52

标签: delphi delphi-7

Delphi菜单的常见情况是:调用TPopupMenu.Popup,之前分配OnClick处理程序,现在OnClick处理程序“返回”结果:单击菜单索引。我需要以其他方式显示popupmenu:我想在菜单中显示N个项目,并在不进行OnClick的情况下点击索引(0到N-1)。怎么做?

我想让function DoMenu(List: TStringList): Integer返回点击的菜单项的索引(项目来自List)。

2 个答案:

答案 0 :(得分:3)

TPopupMenu.Popup()不会向您提供该信息。您必须直接调用Win32 TrackPopupMenu() 函数,指定TPM_RETURNCMD标志。这将为您提供所单击项目的 ID ,而不是索引,但您可以根据需要使用ID手动确定索引。

或者,您可以简单地为每个菜单项分配一个私有OnClick事件处理程序,并使用TPopupMenu.Tag属性(或其他方法)传递指向Integer的指针OnClick处理程序可以将索引分配给,然后在Integer退出后返回Popup()值。实施起来并不难。

答案 1 :(得分:0)

我做了这样的功能。

function DoShowPopupMenu(List: TTntStringList; Pnt: TPoint; hWnd: THandle): Integer;
var
  hMenu: THandle;
  n: integer;
begin
  hMenu:= CreatePopupMenu;
  for n:= 0 to List.Count-1 do
AppendMenuW(hMenu, MF_ENABLED or MF_STRING or MF_UNCHECKED, 100+n, PWChar(List[n]));

  n:= Integer(TrackPopupMenu(hMenu, TPM_LEFTALIGN or TPM_LEFTBUTTON or TPM_RETURNCMD,
Pnt.X, Pnt.Y, 0, hWnd, nil));
  SendMessage(hWnd, WM_NULL, 0, 0);

  if n>0 then
Result:= n-100
  else
Result:= -1;

  for n:= List.Count-1 downto 0 do
DeleteMenu(hMenu, n, MF_BYCOMMAND);
  DestroyMenu(hMenu);
end;