当我从另一个控件到组合框的选项卡时,它会显示文本周围带有虚线的框,但是当我将控件设置为以编程方式激活时,它不会显示相同的焦点指示符。
这种行为是否有解决办法?
我有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后也会在组合上绘制。因此,要重复此问题,请重新启动应用程序。
答案 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);