gpt4 book ai didi

辅助表单上的 Delphi TActionMainMenu 加速器

转载 作者:行者123 更新时间:2023-12-03 19:13:43 26 4
gpt4 key购买 nike

我在 Windows 10 中使用 Delphi XE7。我在主窗体和模态辅助窗体上都有一个 TMainMenuBar。问题是,如果辅助窗体还包含 TMemo,辅助窗体上的加速键不会激活菜单。例如,如果辅助窗体具有文件菜单,则 Alt+F 不会打开文件菜单。但是,如果按下并释放 alt,"file"会突出显示,“F”会加下划线,然后按 F 将打开菜单。请注意,如果删除 TMemo,问题就会消失。此外,主窗体上的 Tmemo 不会导致主窗体上的菜单出现问题。

我在“辅助表单上的 TActionMainMenuBar 加速键”上进行了搜索,但没有一个命中描述了这个特定问题,尽管讨论了这个组件和加速键的其他问题。有谁知道如何在两种表单上仍然使用 TActionMainMenuBar 时实现所需的行为? (出于各种原因,我更喜欢不使用标准的 TMenu。)

最佳答案

这是一个 VCL 设计问题。 (下面的解释可能在某些方面有所偏离。我正在使用 XE2 进行跟踪,但行为并不完全相同。您可能需要在解决方案部分保留其中一个消息处理程序。)

菜单栏加速器生成 WM_SYSCOMMAND信息。 API documentation 中给出了您确切的加速器案例作为示例。 :

If the wParam is SC_KEYMENU, lParam contains the character code of the key that is used with the ALT key to display the popup menu. For example, pressing ALT+F to display the File popup will cause a WM_SYSCOMMAND with wParam equal to SC_KEYMENU and lParam equal to 'f'.



操作菜单栏是专有的 VCL 组件。因此,表单的默认窗口过程没有机会为它们处理加速器消息。组件本身具有模拟行为的代码( TCustomActionMainMenuBar.WMSysCommand),但必须传递消息才能做到这一点。 VCL 的设计问题是,只有主窗体上的一个操作菜单栏才有这个机会。

一个 TWinControl收到 WM_SYSCOMMAND (辅助表单本身或本例中的备忘录),使其父表单(辅助表单)执行 CM_APPSYSCOMMAND .收到消息后,表单(同样是辅助表单)将消息发送到应用程序窗口。 CM_APPSYSCOMMAND应用程序的处理程序,再次将消息转换为 WM_SYSCOMMAND并将其发送到主窗体。

我只能猜测,但这种设计背后的目的可能是,能够从没有菜单栏的辅助表单访问主菜单。

在任何情况下,除了切换到 native 菜单之外,您还必须在 VCL 处理消息之前拦截消息并将其转发到辅助窗体上的操作菜单栏。可以有其他方法来实现这一点,但我尝试过并且似乎有效的是:
type
TSecondaryForm = class(TForm)
...
protected
procedure CMAppsyscommand(var Message: TMessage); message CM_APPSYSCOMMAND;
procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND;
...


procedure TSecondaryForm.CMAppsyscommand(var Message: TMessage);
begin
if ActionMainMenuBar1.Perform(PMessage(Message.LParam).Msg,,
PMessage(Message.LParam).WParam, PMessage(Message.LParam).LParam) = 0 then
inherited;
end;

// you may not need the below handler
procedure TSecondaryForm.WMSysCommand(var Message: TWMSysCommand);
begin
if ActionMainMenuBar1.Perform(Message.Msg,
TMessage(Message).WParam, TMessage(Message).LParam) = 0 then
inherited;
end;

关于辅助表单上的 Delphi TActionMainMenu 加速器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37690519/

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