【问题标题】:vcl combobox doesn't always show that it has focusvcl 组合框并不总是显示它有焦点
【发布时间】:2016-03-22 12:14:12
【问题描述】:

当我从另一个控件切换到组合框时,它会在文本周围显示带有虚线的框,但是当我以编程方式将控件设置为活动时,它不会显示相同的焦点指示器。

这种行为有解决办法吗?

我有 Delphi XE6


MCVE

unit Unit27;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm27 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    ComboBox1: TComboBox;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

var
  Form27: TForm27;

implementation
{$R *.dfm}

procedure TForm27.Button1Click(Sender: TObject);
begin
  ComboBox1.SetFocus;
end;

end.

object Form27: TForm27
  Left = 0
  Top = 0
  Caption = 'Form27'
  ClientHeight = 90
  ClientWidth = 246
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Edit1: TEdit
    Left = 16
    Top = 8
    Width = 121
    Height = 21
    TabOrder = 0
    Text = 'Edit1'
  end
  object Button1: TButton
    Left = 152
    Top = 8
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 1
    OnClick = Button1Click
  end
  object ComboBox1: TComboBox
    Left = 16
    Top = 39
    Width = 145
    Height = 21
    Style = csDropDownList
    ItemIndex = 2
    TabOrder = 2
    Text = '2'
    Items.Strings = (
      '0'
      '1'
      '2'
      '3')
  end
end

启动应用程序并左键单击Button1,它会调用

  ComboBox1.SetFocus;

请注意,没有绘制焦点矩形,但组合具有焦点,如下所示: 点击键盘向上或向下箭头。组合项发生变化,现在焦点矩形变得可见。 显示一次焦点矩形后,鼠标单击 Button1 后,它也会绘制在组合上。因此,要重复该问题,请重新启动应用程序。

【问题讨论】:

  • “当我以编程方式将控件设置为活动时” 你到底是怎么做的?我们可以看看你的代码吗?
  • ComboBox.SetFocus;?
  • 如果您使用键盘加速器,则会绘制焦点矩形。这就是操作系统的工作原理。
  • 运行记事本,打开文件,点击tab一次,文档类型按钮有焦点矩形。关闭对话框,再次打开文件,用鼠标点击文件类型组合,没有绘制焦点矩形。

标签: delphi


【解决方案1】:

这是操作系统的设计,防止用户不使用键盘时屏幕出现混乱。 Here 详细解释了原因。而here 是对该机制如何工作的解释。

您可以发送WM_UPDATEUISTATE 来更改窗口的状态(以及文档中的子窗口)。

ComboBox1.Perform(WM_UPDATEUISTATE, MakeWParam(UIS_CLEAR, UISF_HIDEFOCUS), 0);

上面将更新组合框的 UI 状态,就好像需要键盘提示一样。

您不必在焦点切换时发送消息,例如,您可以在创建表单时发送它。您还可以选择将消息发送到父窗体,以使所有控件的行为一致,并且可以在 WParam 的高位字中包含 UISF_HIDEACCEL 以同时显示带下划线的加速字符。

请注意,用户已经可以选择在系统方面始终显示键盘指示器。在 Windows 7 中,设置位于“控制面板”、“轻松访问中心”、“使键盘更易于使用”、“使键盘快捷键更易于使用”、“给键盘快捷键和访问键加下划线”。

【讨论】:

    【解决方案2】:

    要使焦点矩形出现在组合框上,在以编程方式设置焦点时,可以使用以下代码:

    ComboBox.SetFocus; 
    ComboBox.Perform(WM_SYSKEYDOWN, VK_TAB, 0); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 1970-01-01
      相关资源
      最近更新 更多