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の(冗長な)使用です。キャンバスが完全に表示されていない場合、塗りつぶしによってアーティファクトが発生します。塗りつぶしを削除しましたが、必要に応じて機能するようになりました。

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 の (冗長な) 使用です。キャンバスが完全に表示されていない場合、塗りつぶしによってアーティファクトが発生します。フラッドフィルを削除したところ、必要に応じて機能するようになりました。

于 2008-11-21T12:29:27.500 に答える
0

100% うまくいくとは限りませんがTXPManifest、フォームに配置することでレンダリングの問題が修正されるのを見てきました。

于 2008-11-20T03:09:13.387 に答える