2008-11-19 10 views
1

J'ai écrit un nouveau composant personnalisé dérivé de TLabel. Le composant ajoute un dessin personnalisé au composant, mais rien d'autre. Lorsque le composant est peint, tout fonctionne bien. Mais lorsque le redessin est nécessaire (comme faire glisser une autre fenêtre sur le composant), "label part" fonctionne correctement mais mon dessin personnalisé n'est pas correctement mis à jour. Je dessine directement sur le canevas dans une méthode Paint surchargée, et lorsque le redessin est requis, les parties de canevas où mon code a dessiné quelque chose sont peintes en noir. Il semble que la méthode de peinture ne soit pas appelée. Qu'est-ce que je devrais faire pour obtenir un redessin approprié?Problème de rafraîchissement de composant personnalisé avec Delphi

Le composant est essentiellement:

TMyComponent = class(TCustomLabel, IMyInterface) 
.. 
protected 
    procedure Paint; override; 
.. 

procedure TMyComponent.Paint; 
begin 
    inherited; 
    MyCustomPaint; 
end; 

mise à jour, la routine de la peinture:

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); 

RESOLU:

Le problème est (redondant) l'utilisation de FloodFill. Si le canevas n'est pas entièrement visible, le remplissage provoque des artefacts. J'ai enlevé l'inondation et maintenant cela fonctionne comme nécessaire.

Répondre

1

SOLVED:

Le problème est (redondant) l'utilisation de FloodFill. Si le canevas n'est pas entièrement visible, le remplissage provoque des artefacts. J'ai enlevé l'inondation et maintenant cela fonctionne comme nécessaire.

1

Je suppose qu'il y a quelque chose qui ne va pas dans votre MyCustomPaint parce que le reste est codé correctement. Voici ma mise en œuvre d'un MyCustomPaint. Dites-moi ce qui est différent de la vôtre:

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; 

Il rafraîchit très bien. Dessine une belle boîte rouge autour d'elle. Ne convertissez-vous pas les points peut-être? Je ne sais pas ce qui pourrait le faire se comporter comme vous l'avez décrit.

+0

C'est fondamentalement la même chose, j'utilise juste l'ellipse et l'inondation. Je dois essayer de réduire un peu le composant pour voir s'il y a quelque chose qui interfère. – Harriv

0

Je ne suis pas sûr à 100% que cela fonctionnera pour vous, mais j'ai vu un problème de rendu se corriger en plaçant TXPManifest sur un formulaire.