gpt4 book ai didi

delphi - 鼠标中键点击TPopupMenu项时如何触发 Action ?

转载 作者:行者123 更新时间:2023-12-03 18:11:21 25 4
gpt4 key购买 nike

我们使用鼠标左键单击来触发 TPopupMenu 菜单项中的操作。如何在这些菜单项中对鼠标中键单击触发不同的操作?也就是说,TPopupmenu的菜单项上的鼠标左键和中键点击是不同的 Action 。

最佳答案

全局 Menus.PopupList 变量跟踪所有 PopupMenus 并处理发送给它们的所有信息。您可以使用自己的实例覆盖此 PopupList,如下所示:

type
TMyPopupList = class(TPopupList)
private
FMenuItem: TMenuItem;
protected
procedure WndProc(var Message: TMessage); override;
end;

{ TMyPopupList }

procedure TMyPopupList.WndProc(var Message: TMessage);
var
FindKind: TFindItemKind;
I: Integer;
Item: Integer;
Action: TBasicAction;
Menu: TMenu;
begin
case Message.Msg of
WM_MENUSELECT:
with TWMMenuSelect(Message) do
begin
FindKind := fkCommand;
if MenuFlag and MF_POPUP <> 0 then
FindKind := fkHandle;
for I := 0 to Count - 1 do
begin
if FindKind = fkHandle then
begin
if Menu <> 0 then
Item := GetSubMenu(Menu, IDItem)
else
Item := -1;
end
else
Item := IDItem;
FMenuItem := TPopupMenu(Items[I]).FindItem(Item, FindKind);
if FMenuItem <> nil then
Break;
end;
end;
WM_MBUTTONUP:
if FMenuItem <> nil then
begin
GetMenuItemSecondAction(FMenuItem, Action);
Menu := FMenuItem.GetParentMenu;
if Action <> nil then
begin
Menu := FMenuItem.GetParentMenu;
SendMessage(Menu.WindowHandle, WM_IME_KEYDOWN, VK_ESCAPE, 0);
Action.Execute;
Exit;
end;
end;
end;
inherited WndProc(Message);
end;

initialization
PopupList.Free;
PopupList := TMyPopupList.Create;

您必须自己编写的 GetMenuItemSecondAction 例程。也许this answer提供有关将您自己的操作添加到组件的一些帮助。

请注意,WM_MENUSELECT 下的代码只是从 Menus.TPopupList.WndProc 复制而来。您还可以使用 MenuItemFromPointWM_MBUTTONUP 处理中检索 MenuItem .

但正如许多评论所说:在实现此 UI 功能之前要三思(或更多)。

关于delphi - 鼠标中键点击TPopupMenu项时如何触发 Action ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6964603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com