2016-03-22 43 views
1

當我從另一個控件選項卡切換到組合框時,它會在文本週圍顯示帶虛線的框,但是當我將控件設置爲以編程方式激活時, t顯示相同的重點指標。vcl combobox並不總是顯示它有焦點

是否有解決此問題的方法?

我有德爾福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上單擊後也會繪製在組合上。因此,重複這個問題,重新啓動應用程序。

+4

請顯示[mcve] –

+0

「當我將控件設置爲以編程方式激活時」確切地說,您是如何做到這一點的?我們可以看到你的代碼嗎? –

+0

'ComboBox.SetFocus;'? – Johan

回答

2

這是由操作系統的設計,可以防止畫面時就不會顯得凌亂用戶沒有使用鍵盤。 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);