Delphi菜单的常见情况是:调用TPopupMenu.Popup,之前分配OnClick处理程序,现在OnClick处理程序“返回”结果:单击菜单索引。我需要以其他方式显示popupmenu:我想在菜单中显示N个项目,并在不进行OnClick的情况下点击索引(0到N-1)。怎么做?
我想让function DoMenu(List: TStringList): Integer
返回点击的菜单项的索引(项目来自List
)。
答案 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;