Delphi的自定义组件重绘问题

时间:2008-11-19 22:32:12

标签: delphi drawing custom-component

我编写了一个源自TLabel的新自定义组件。该组件为组件添加了一些自定义绘图,但没有别的。当组件被绘制时,一切正常。但是当需要重绘时(比如在组件上拖动另一个窗口),“标签部件”工作正常但我的自定义绘图没有正确更新。我基本上是在重写的Paint方法中直接绘制到画布上,当需要重绘时,我的代码绘制了一些东西的画布部分被涂成黑色。似乎没有调用paint方法。我该怎样做才能得到适当的重绘?

该组件基本上是:

TMyComponent = class(TCustomLabel, IMyInterface)
..
protected
  procedure Paint; override;
..

procedure TMyComponent.Paint;
begin
  inherited;
  MyCustomPaint;
end;

更新,涂料例程:

Position := Point(0,0);
Radius := 15;
FillColor := clBlue;
BorderColor := clBlack;
Canvas.Pen.Color := BorderColor;
Canvas.Pen.Width := 1;
Canvas.Brush.Color := BorderColor;
Canvas.Ellipse(Position.X, Position.Y, Position.X + Radius,  Position.Y + Radius);
Canvas.Brush.Color := FillColor;
Canvas.FloodFill(Position.X + Radius div 2,
  Position.Y + Radius div 2, BorderColor, fsSurface);

解决:

问题是(冗余)使用FloodFill。如果Canvas不完全可见,则floodfill会导致伪影。我删除了洪水填充物,现在它可以根据需要运行。

3 个答案:

答案 0 :(得分:1)

我猜你的MyCustomPaint有问题,因为其余部分编码正确。这是我对MyCustomPaint的实现。告诉我与你的不同之处:

procedure TMyComponent.MyCustomPaint;
var
  rect: TRect;
begin
  rect := self.BoundsRect;
  rect.TopLeft := ParentToClient(rect.TopLeft);
  rect.BottomRight := ParentToClient(Rect.BottomRight);
  Canvas.Pen.Color := clRed;
  Canvas.Rectangle(Rect);
end;

它刷新就好了。在它周围画一个漂亮的红色框。你有没有转换积分?不确定是什么原因导致它按照你描述的方式行事。

答案 1 :(得分:1)

解决:

问题是(冗余)使用FloodFill。如果Canvas不完全可见,则floodfill会导致伪影。我删除了洪水填充物,现在它可以根据需要运行。

答案 2 :(得分:0)

我不是100%确定它对您有用,但我已经看到通过将TXPManifest放在表单上来解决渲染问题。