未正确绘制复合组件的选择框
Selection box of composite component not drawn properly
我有一个复合组件,它由一个 TEdit
和一个继承自 TCustomControl
的 TButton
(是的,我知道 TButtonedEdit
)组成。编辑和按钮在其构造函数中创建并放置在其自身上。
在设计时,选择框未正确绘制 - 我的猜测是编辑和按钮隐藏了它,因为它是为自定义控件绘制的,然后被它们透支了。
这里是对比:
我在其他第 3 方组件中也看到了这一点(例如 TcxGrid 也只绘制了选择指示器的外部部分)
问题:我该如何改变它?
最简单的复制案例:
unit SearchEdit;
interface
uses
Classes, Controls, StdCtrls;
type
TSearchEdit = class(TCustomControl)
private
fEdit: TEdit;
public
constructor Create(AOwner: TComponent); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Custom', [TSearchEdit]);
end;
{ TSearchEdit }
constructor TSearchEdit.Create(AOwner: TComponent);
begin
inherited;
fEdit := TEdit.Create(Self);
fEdit.Parent := Self;
fEdit.Align := alClient;
end;
end.
正如我在评论中所说,我能想到的最简单的事情是在父级中绘制控件,并在设计时从设计器中 "hide" 绘制它们。您可以通过调用 SetDesignVisible(False) on each of the child controls. Then you use PaintTo 在父对象上进行绘画来完成此操作。
使用你的例子我们得到:
type
TSearchEdit = class(TCustomControl)
...
protected
procedure Paint; override;
...
end;
constructor TSearchEdit.Create(AOwner: TComponent);
begin
inherited;
fEdit := TEdit.Create(Self);
fEdit.Parent := Self;
fEdit.Align := alClient;
fEdit.SetDesignVisible(False);
end;
procedure TSearchEdit.Paint;
begin
Inherited;
if (csDesigning in ComponentState) then
fEdit.PaintTo(Self.Canvas, FEdit.Left, FEdit.Top);
end;
我有一个复合组件,它由一个 TEdit
和一个继承自 TCustomControl
的 TButton
(是的,我知道 TButtonedEdit
)组成。编辑和按钮在其构造函数中创建并放置在其自身上。
在设计时,选择框未正确绘制 - 我的猜测是编辑和按钮隐藏了它,因为它是为自定义控件绘制的,然后被它们透支了。
这里是对比:
我在其他第 3 方组件中也看到了这一点(例如 TcxGrid 也只绘制了选择指示器的外部部分)
问题:我该如何改变它?
最简单的复制案例:
unit SearchEdit;
interface
uses
Classes, Controls, StdCtrls;
type
TSearchEdit = class(TCustomControl)
private
fEdit: TEdit;
public
constructor Create(AOwner: TComponent); override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Custom', [TSearchEdit]);
end;
{ TSearchEdit }
constructor TSearchEdit.Create(AOwner: TComponent);
begin
inherited;
fEdit := TEdit.Create(Self);
fEdit.Parent := Self;
fEdit.Align := alClient;
end;
end.
正如我在评论中所说,我能想到的最简单的事情是在父级中绘制控件,并在设计时从设计器中 "hide" 绘制它们。您可以通过调用 SetDesignVisible(False) on each of the child controls. Then you use PaintTo 在父对象上进行绘画来完成此操作。
使用你的例子我们得到:
type
TSearchEdit = class(TCustomControl)
...
protected
procedure Paint; override;
...
end;
constructor TSearchEdit.Create(AOwner: TComponent);
begin
inherited;
fEdit := TEdit.Create(Self);
fEdit.Parent := Self;
fEdit.Align := alClient;
fEdit.SetDesignVisible(False);
end;
procedure TSearchEdit.Paint;
begin
Inherited;
if (csDesigning in ComponentState) then
fEdit.PaintTo(Self.Canvas, FEdit.Left, FEdit.Top);
end;