gpt4 book ai didi

delphi - 即使 UI 状态表明不显示加速键,TLabel 也会显示加速键

转载 作者:行者123 更新时间:2023-12-03 14:52:31 24 4
gpt4 key购买 nike

使用默认的 Windows 设置,在用户按下 ALT 键之前,加速键不会显示在对话框上。

Delphi的TLabel控件不遵守这个约定,如下所示:

虽然标签和复选框都指定了加速键,但复选框正确地隐藏了它,但标签却没有。当然,当按下 ALT 时,复选框会显示加速器,但之前的行为是不正确的。

我对为什么会发生这种情况的理解是,实现此行为的 VCL 代码包含在 TWinControl 中,例如 UpdateUIState 方法,并且依赖于发送底层窗口化控制 WM_CHANGEUISTATE 消息。由于 TLabel 不是窗口化的,因此它错过了此处理。

任何人都可以提出一种方法来实现非窗口控件所需的行为吗?

更新1

我刚刚发现组框和单选按钮组也不响应 UI 状态。

更新2

QC#97044 .

最佳答案

我想我已经找到了处理它的方法。

function HideAccelFlag(Control: TControl): Integer;
begin
//ask the top level window about its UI state
while Assigned(Control.Parent) do begin
Control := Control.Parent;
end;
if (Control.Perform(WM_QUERYUISTATE, 0, 0) and UISF_HIDEACCEL)=UISF_HIDEACCEL then begin
Result := DT_HIDEPREFIX;
end else begin
Result := 0;
end;
end;

type
TUIStateAwareLabel = class(TLabel)
protected
procedure DoDrawText(var Rect: TRect; Flags: Longint); override;
end;

procedure TUIStateAwareLabel.DoDrawText(var Rect: TRect; Flags: Integer);
begin
if ShowAccelChar then begin
Flags := Flags or HideAccelFlag(Self);
end;
inherited;
end;

我确保始终通过使用 TReader.OnFindComponentClass Hook 表单流机制来创建 TUIStateAwareLabel 而不是 TLabel

处理 TCustomGroupBox 后代更加困惑。对于他们,我将 TCustomGroupBox.Paint 的源代码复制到我的后代中,并再次使用 HideAccelFlag

下一个任务是将其写成质量控制报告。

关于delphi - 即使 UI 状态表明不显示加速键,TLabel 也会显示加速键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6912424/

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