Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何从TCustomListBox中删除虚线焦点线?_Delphi_Delphi Xe - Fatal编程技术网

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

Delphi 如何从TCustomListBox中删除虚线焦点线?,delphi,delphi-xe,Delphi,Delphi Xe,我有一个TCustomListBox派生控件,在该控件中重写DrawItem过程,使其具有更好的外观和感觉 我注意到一件事,它似乎也会影响标准的TListBox,那就是当控件聚焦并且没有项目时,它仍然绘制虚线聚焦线 这是一个标准的、未更改的t列表框,没有任何项目: procedure TMyListBox.WMSetFocus(var Message: TWMSetFocus); begin Message.Result := 0; if Count <> 0 then

我有一个
TCustomListBox
派生控件,在该控件中重写
DrawItem
过程,使其具有更好的外观和感觉

我注意到一件事,它似乎也会影响标准的
TListBox
,那就是当控件聚焦并且没有项目时,它仍然绘制虚线聚焦线


这是一个标准的、未更改的
t列表框
,没有任何项目:

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

当控件聚焦(即单击)时绘制虚线


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


但是,如果自定义列表框包含项目,则不会绘制虚线:


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

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;

要从控件中删除虚线焦点线,还需要执行哪些操作?

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

procedure TMyListBox.WMSetFocus(var Message: TWMSetFocus);
begin
  Message.Result := 0;
  if Count <> 0 then
    inherited;
end;
过程TMyListBox.WMSetFocus(var消息:TWMSetFocus);
开始
消息。结果:=0;
如果计数为0,则
继承;
结束;

如果不初始化,它的值是多少?这类似于将TabStop设置为False吗?@Blobby-不太一样,它是用于选项卡导航的。@Blobby-但是似乎仍然存在问题,当至少有一个项目但没有选择时,当框有焦点时,您仍然可以看到focus rect。但是,当存在项时,我们无法从WM_SETFOCUS返回。@classes.pas中的David-StdWndProc将其设置为0。这是标准行为,您为什么要更改它?如果不想选择没有项目的列表框,只需禁用listbox@SirRufo我理解你的观点,但由于我希望列表框看起来很好,我需要删除这些点。至于它的价值,我想用单独的项目颜色来表示列表框没有聚焦,有点像listview的外观(蓝色表示聚焦,灰色表示非聚焦)