vcl combobox并不总是表明它有焦点

时间:2016-03-22 12:14:13

标签: delphi

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

这种行为是否有解决办法?

我有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

enter image description here

启动应用,然后左键点击Button1,其中会调用

  ComboBox1.SetFocus;

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

2 个答案:

答案 0 :(得分:3)

这是通过操作系统的设计,在用户不使用键盘时防止屏幕上的混乱。 Here是对原因的彻底解释。 here解释了该机制的工作原理。

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

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

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

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

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

答案 1 :(得分:2)

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

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