Проблема с перерисовкой пользовательского компонента в Delphi

StackOverflow https://stackoverflow.com/questions/303642

Вопрос

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

Это было полезно?

Решение 2

РЕШАЕМАЯ:

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

Другие советы

Я предполагаю, что в вашем 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;

Это просто замечательно освежает.Рисует вокруг него красивую красную рамку.Может быть, вы не конвертируете баллы?Не уверен, что могло заставить его вести себя так, как вы описали.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top