我编写了一个源自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会导致伪影。我删除了洪水填充物,现在它可以根据需要运行。
答案 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
放在表单上来解决渲染问题。