【问题标题】:Delphi: avoid run-time component selection dashesDelphi:避免运行时组件选择破折号
【发布时间】:2019-08-26 15:34:28
【问题描述】:

如何避免TToggleSwitch 控件的标题在单击时在其标题上显示选择破折号?

我在点击事件之后尝试了ActiveControl := nil;,但点击它时它仍然会显示一会儿选择。

【问题讨论】:

  • 我在几天内想起了一个类似的问题。是你的吗?发生了什么?顺便说一句,我们在谈论哪个平台?
  • 不是我的。窗户
  • 将 ShowStateCaption 设置为 False 并在其旁边使用 TLabel?

标签: delphi


【解决方案1】:

您可以将插入器声明与 WM_QUERYUISTATE 的消息处理程序一起使用,如下所示:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.WinXCtrls;

type
  TToggleSwitch = class(Vcl.WinXCtrls.TToggleSwitch)
  private
    procedure WMQueryUIState(var Msg: TMessage); message WM_QUERYUISTATE;
  end;

  TForm1 = class(TForm)
    ToggleSwitch1: TToggleSwitch;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TToggleSwitch }

procedure TToggleSwitch.WMQueryUIState(var Msg: TMessage);
begin
  Msg.Result := UISF_HIDEFOCUS;
end;

end.

可惜没有它的属性。

【讨论】:

  • 现在键盘用户无法使用该应用程序了。
  • @AndreasRejbrand 我猜你的意思是他们无法切换到 TToggleSwitch。另一种选择是修补 Vcl.WinXCtrls 单元,以便不绘制焦点矩形
  • @Dave:您仍然可以使用 tab 键,但您不知道何时到达控件,因为无论有没有键盘焦点,它看起来都完全相同。所以你必须tab和猜测,希望收到空格键消息的控件确实是这个控件。
【解决方案2】:

这是一个焦点矩形,表示控件具有键盘焦点。这些视觉提示对于喜欢使用键盘而不是鼠标的用户来说非常重要1,比如我自己(更快更快,更符合人体工程学),以及在您不能出于某种原因(确实会发生)使用指点设备。

当我在切换开关中看到焦点矩形时,我知道该控件具有键盘焦点,并且我可以通过按空格键来切换它。如果没有这个矩形,我就不敢按空格键2。而且,如果您尝试在控件收到键盘焦点后立即将焦点从控件上移开,那么我将无法在没有鼠标的情况下使用表单。

因此,这个矩形很重要。您不应将美学置于功能和可访问性之前。

在 Windows XP 中,如果我没记错的话,微软意识到大多数人都不像我。相反,他们更喜欢使用鼠标,并且确实发现焦点矩形和带下划线的字母很烦人。因此,他们选择隐藏这些东西直到用户表示他想要使用键盘。例如,您可能已经注意到,对话框中的下划线字符通常不会出现,直到您按下 Alt 键。

这个你可以做到。据我所知,TToggleSwitch 控件默认遵循这些规则,因此您不需要更改任何内容。

Dave's approach 似乎使用相关 API 来无条件禁用焦点矩形,我强烈建议不要这样做。如果我没记错的话,Raymond Chen 已经在博客中讨论过这个话题。 (也许是here。)永远不要在专业软件中这样做。


1 对于键盘用户,表单中最重要的事情是所有控件都可以仅使用键盘以方便的方式访问。例如,跳位顺序非常重要。按 tab 键应该把你从一个控件带到它的右边或下面的邻居,而不是在屏幕上乱跳。此外,键盘加速键(如 &Save&Colour:)应始终存在,TButton.DefaultTButton.Cancel 属性应始终在适当的地方设置。

这听起来像是在咆哮,但我每天都在遭受这些事情的折磨! :)

2 因为我不能确定当前焦点控件实际上是这个切换开关控件。我的意思是,无论有没有焦点,它看起来都一样!它可能是聚焦的,或者聚焦的控件可能是屏幕上远处的某个按钮,或者其他一些由于未绘制焦点矩形而行为不端的控件。这个其他控件很可能是“退出而不保存”按钮。

【讨论】:

    【解决方案3】:

    按钮文本周围的虚线用于标记使用 Tab 选择按钮。

    因此将TabStop 属性设置为False 将防止出现这些虚线。

    但请注意,这也将阻止任何人使用 TAB 键将焦点移至此按钮,从而使用键盘按下/切换此按钮。

    【讨论】:

    • 输入焦点和选项卡选择是两个不同的东西。破折号标记具有输入焦点的控件。您可以关闭选项卡选择,并且控件在单击时仍然可以获得输入焦点
    猜你喜欢
    • 2017-12-09
    • 2016-07-16
    • 2011-08-25
    • 2012-02-29
    • 2022-01-22
    • 2020-09-01
    • 2020-01-30
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多