Проблема перерисовки нестандартного компонента в Delphi - PullRequest
1 голос
/ 20 ноября 2008

Я написал новый пользовательский компонент, полученный из TLabel. Компонент добавляет некоторый пользовательский рисунок к компоненту, но ничего больше. Когда компонент окрашен, все работает нормально. Но когда требуется перерисовка (например, перетаскивание другого окна поверх компонента), «часть надписи» работает нормально, но мой пользовательский чертеж не обновляется должным образом. Я в основном рисую прямо на холст в переопределенном методе 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. Если холст не виден полностью, затопление вызывает появление артефактов. Я удалил флуд, и теперь он работает как надо.

Ответы [ 3 ]

1 голос
/ 21 ноября 2008

РЕШИТЬ:

Проблема заключается в (избыточном) использовании FloodFill. Если холст не виден полностью, затопление вызывает появление артефактов. Я удалил флуд, и теперь он работает как нужно.

1 голос
/ 20 ноября 2008

Я предполагаю, что в 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 голосов
/ 20 ноября 2008

Я не уверен на 100%, что это сработает для вас, но я видел проблему с рендерингом, исправленную путем помещения TXPManifest в форму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...