Delphi的TMainMenu如何展开指定的子菜单?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi的TMainMenu如何展开指定的子菜单?相关的知识,希望对你有一定的参考价值。
例如已知某个Item1: TMenuItem
然后要求在某个方法中(如Button1Click)将它展开(或者将它所在的上层菜单展开)
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+字母”暂时解决的,想问问是否有更严谨的处理方式。
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】:像往常一样使用TMainMenu
和TActionList
。
那就做吧
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控件如何取到选择节点的索引号?