1

我编写了一个从 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 会导致伪影。我删除了洪水填充,现在它可以根据需要工作。

4

3 回答 3

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;

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

于 2008-11-20T00:02:46.273 回答
1

解决了:

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

于 2008-11-21T12:29:27.500 回答
0

我不是 100% 确定它会为你工作,但我已经看到渲染问题通过放置TXPManifest在表单上得到解决。

于 2008-11-20T03:09:13.387 回答