2008-11-19 51 views
1

我寫了一個派生自TLabel的新自定義組件。該組件將一些自定義繪圖添加到組件,但沒有其他。當組件被繪時,一切正常。但是當需要重繪時(例如在組件上拖動另一個窗口),「標籤部分」工作正常,但我的自定義繪圖未正確更新。我基本上是用覆蓋的Paint方法直接繪製到畫布上,當需要重畫時,我的代碼繪製的畫布部分被繪成黑色。看起來好像沒有調用paint方法。我應該怎樣做才能正確重繪?用Delphi自定義組件重繪問題

的組件是基本上是:

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的。如果畫布不完全可見,則填充會導致工件。我刪除了填埋場,現在它可以根據需要運行。

回答

1

求解:

問題是(冗餘)使用FloodFill。如果畫布不完全可見,則填充會導致工件。我刪除了填埋場,現在它可以根據需要運行。

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; 

它刷新就好了。在它周圍繪製一個漂亮的紅色框。你可能沒有轉換這些觀點嗎?不知道什麼可能會導致它按照您描述的方式行事。

+0

它基本上是一樣的,我只是使用橢圓和填充。我必須嘗試減少組件以查看是否存在某種干擾。 – Harriv 2008-11-20 08:30:03

0

我不是100%確定它會爲你工作,但我已經看到通過將TXPManifest放置在窗體上來解決渲染問題。