Delphi的TMainMenu如何展开指定的子菜单?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi的TMainMenu如何展开指定的子菜单?相关的知识,希望对你有一定的参考价值。

例如已知某个Item1: TMenuItem
然后要求在某个方法中(如Button1Click)将它展开(或者将它所在的上层菜单展开)

参考技术A BOOL TrackPopupMenu(
HMENU hMenu, // handle to shortcut menu
UINT uFlags, // screen-position and mouse-button flags
int x, // horizontal position, in screen coordinates
int y, // vertical position, in screen coordinates
int nReserved, // reserved, must be zero
HWND hWnd, // handle to owner window
CONST RECT *prcRect // ignored
);
procedure TForm1.Button1Click(Sender: TObject);
var
X,Y:integer;
P:Tpoint;
begin
p.X:= 0;
p.Y:= 0;
P:= ClientToScreen(P);
TrackPopupMenu(item1.Handle,TPM_LEFTALIGN,P.X,P.Y,0,handle,0);
end;本回答被提问者采纳
参考技术B 不是mainmenu吧?popumenu才这样用。追问

其实是在一个线程里用的,在特定的时间把特定菜单展开并且显示Hint框(后面这步已经解决),起到“帮助”、“向导”这样的功能。

现在是用组合键消息“Alt+字母”暂时解决的,想问问是否有更严谨的处理方式。

参考技术C visual:=true;

delphi 程序中隐藏的主菜单,使用 Alt 键自动显示

【中文标题】delphi 程序中隐藏的主菜单,使用 Alt 键自动显示【英文标题】:Hidden Main Menu in a delphi program, automatically shown using Alt key 【发布时间】:2011-09-22 02:09:13 【问题描述】:

首先,让我说我讨厌 Windows Vista 和 Windows 7 中的这个功能。其次,我想做它。 Here 是一个问题,询问如何在 WPF 中执行我想要的操作。

我想做同样的事情,但在 Delphi 中,使用 VCL 库存组件、TMainMenu 或 Action Manager 菜单,或一些可用的第三方组件,甚至是 Toolbar2000 或其他一些库。

Windows Vista/Windows 7 资源管理器主菜单的特点:

应用启动时不可见 按下并释放 Alt 使其可见 再次按下并释放 Alt 使其再次不可见 可重复。 热键适用于菜单项,即使菜单不可见*

(* Windows 资源管理器热键示例:即使菜单不可见,Microsoft Windows 资源管理器中的 Ctrl+A 也会全选,Alt+T = 显示工具弹出菜单,即使整个菜单都隐藏)。

更新: 使用已接受答案的演示可以下载here。 (HiddenMenu.zip)

【问题讨论】:

Windows 资源管理器中有很多我讨厌的功能。隐藏已知/注册文件类型的扩展名、“简化文件共享”以及您需要进入对话框以更改 NTFS 文件权限的 9 级深度是我“最不喜欢的”。 :-) 【参考方案1】:

像往常一样使用TMainMenuTActionList

那就做吧

procedure TForm1.FormShow(Sender: TObject);
begin
  Self.Menu := nil;
end;

(或在设计时简单地删除 Menu 关联)和

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key = VK_MENU) or (Key = VK_F10) then
    Menu := MainMenu1;
end;

procedure TForm1.WndProc(var Message: TMessage);
begin
  inherited;
  case Message.Msg of
    WM_EXITMENULOOP:
      SetMenu(Handle, 0);
  end;
end;

不要忘记将表单的KeyPreview 设置为true

(请注意,由于快捷方式是由TActionList 处理的,因此即使菜单“消失”也可以使用。)

【讨论】:

@David:没有想象中的那么好...如果您单击菜单项,似乎不会触发该操作。我正在努力…… 不确定,但 FormKeyDown 的 if 子句中是否缺少 Key := 0; @Uwe:不,你也想要默认行为。 '按下并释放 Alt 使其可见'。虽然用OnKeyUp 替换OnKeyDown 可能没有问题。

以上是关于Delphi的TMainMenu如何展开指定的子菜单?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi TreeView 问题

Delphi 实现最近打开文件记录菜单

delphi中的treeview控件如何取到选择节点的索引号?

delphi cxgrid 控件如可实现展开一行记录看其明细

delphi cxgrid 列内容 中心对齐如何实现

TMainMenu 类[四] - 所有可选的快捷键列表