- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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'.
TCustomActionMainMenuBar.WMSysCommand
),但必须传递消息才能做到这一点。 VCL 的设计问题是,只有主窗体上的一个操作菜单栏才有这个机会。
TWinControl
收到
WM_SYSCOMMAND
(辅助表单本身或本例中的备忘录),使其父表单(辅助表单)执行
CM_APPSYSCOMMAND
.收到消息后,表单(同样是辅助表单)将消息发送到应用程序窗口。
CM_APPSYSCOMMAND
应用程序的处理程序,再次将消息转换为
WM_SYSCOMMAND
并将其发送到主窗体。
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/
我在 Windows 10 中使用 Delphi XE7。我在主窗体和模态辅助窗体上都有一个 TMainMenuBar。问题是,如果辅助窗体还包含 TMemo,辅助窗体上的加速键不会激活菜单。例如,如
我是一名优秀的程序员,十分优秀!