如何从TCustomListBox中删除虚线焦点线?

时间:2014-07-13 18:08:14

标签: delphi delphi-xe

我有一个TCustomListBox派生控件,我覆盖DrawItem程序,使其外观更好。

我注意到的一件事情似乎也影响了标准TListBox,当控件聚焦且没有任何项目时,它仍会绘制虚线焦点线。


这是一个标准的,未更改的TListBox,没有任何项目:

enter image description here

当控件聚焦(即点击)

时绘制虚线

现在使用我的自定义控件,虚线仍然只显示不同:

enter image description here


如果我的自定义列表框包含项目,则不会绘制任何虚线:

enter image description here


以下是自定义列表框的主要代码:

type
  TMyListBox = class(TCustomListBox)
  private
    FFillColor: TColor;
    FFrameColor: TColor;
  protected
    procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

implementation

{ TMyListBox }

constructor TMyListBox.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FFillColor  := GetShadowColor(clMenuHighlight, 60);
  FFrameColor := GetShadowColor(clMenuHighlight, -20);

  Style := lbOwnerDrawVariable;
end;

destructor TMyListBox.Destroy;
begin
  inherited Destroy;
end;

procedure TMyListBox.DrawItem(Index: Integer; Rect: TRect;
  State: TOwnerDrawState);
var
  Offset: Integer;
begin
  inherited;

  with (Self as TMyListBox) do
  begin
    Canvas.FillRect(Rect);

    if (odSelected in State) then
    begin
      Canvas.Pen.Color := FFrameColor;
      Canvas.Brush.Color := FFillColor;
      Canvas.Rectangle(Rect);
    end
    else
    begin
      Canvas.Pen.Color := Color;
      Canvas.Brush.Color := Color;
      Canvas.Rectangle(Rect);
    end;

    Offset := (Rect.Bottom - Rect.Top - Canvas.TextHeight(Items[Index])) div 2;
    Canvas.Brush.Style := bsClear;
    Canvas.Font.Color := Font.Color;
    Canvas.TextOut(Rect.Left + Offset + 2, Rect.Top + Offset, Items[Index]);
  end;
end;

为了从控件中删除虚线焦点线我还需要做什么?

1 个答案:

答案 0 :(得分:2)

您可以为WM_SETFOCUS添加处理程序,以防止在没有项目时进行处理:

procedure TMyListBox.WMSetFocus(var Message: TWMSetFocus);
begin
  Message.Result := 0;
  if Count <> 0 then
    inherited;
end;