我有一个TCustomListBox
派生控件,我覆盖DrawItem
程序,使其外观更好。
我注意到的一件事情似乎也影响了标准TListBox
,当控件聚焦且没有任何项目时,它仍会绘制虚线焦点线。
这是一个标准的,未更改的TListBox
,没有任何项目:
当控件聚焦(即点击)
时绘制虚线现在使用我的自定义控件,虚线仍然只显示不同:
如果我的自定义列表框包含项目,则不会绘制任何虚线:
以下是自定义列表框的主要代码:
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;
为了从控件中删除虚线焦点线我还需要做什么?
答案 0 :(得分:2)
您可以为WM_SETFOCUS
添加处理程序,以防止在没有项目时进行处理:
procedure TMyListBox.WMSetFocus(var Message: TWMSetFocus);
begin
Message.Result := 0;
if Count <> 0 then
inherited;
end;