Проблема с перерисовкой пользовательского компонента в Delphi
-
08-07-2019 - |
Вопрос
Я написал новый пользовательский компонент, производный от 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
на бланке.