复合组件的选择框未正确绘制。

6
我有一个复合组件,由一个继承自TCustomControlTEditTButton(是的,我知道TButtonedEdit)组成。构造函数中创建了编辑框和按钮,并将它们放置在自身上。
在设计时,选择框没有正确地绘制 - 我猜测是因为编辑框和按钮隐藏了它,因为它已经为自定义控件绘制,然后被它们覆盖。
这里是比较:

enter image description here

我也看到了其他第三方组件有这种情况(比如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.

在这种情况下,需要知道使用哪个版本的Delphi。 - David Heffernan
但我认为你不会有任何好运。我认为选择指示器是由IDE挂钩控件窗口过程实现的。而且你的控件在它的子控件之前被绘制。 - David Heffernan
可能最简单的方法是,从头开始设置自己的绘画来进行设计。 - Graymatter
@Gray 你的意思是在父级中进行绘制,并抑制子级的绘制吗? - David Heffernan
@DavidHeffernan 是的,在设计时可以使用 fEdit.PaintTo(...) 这样的东西,在父级上直接绘制到父级画布上。 - Graymatter
1个回答

3
如我在评论中所说,我能想到的最简单的方法是在父控件中绘制控件,并在设计时“隐藏”它们。您可以通过在每个子控件上调用SetDesignVisible(False)来实现这一点。然后,您可以使用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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接