DMo a écrit :Pas mal les raccourcis
Concernant le OnPaint, tous les widgets ont un OnPaint (généralement sur un super classe, en privé) et sont redessinés entièrement à chaque fois. La seule question est donc de savoir si tu veux utiliser ton code pour le faire comme tu veux, ou un widget delphi pour le faire comme delphi et windows (ensembles) veulent le faire...
Le problème avec ce
TPaintBox et que le seul moyen d'y afficher quelque chose était de le coder dans son
OnPaint. Dessiner dans son
Canvas par du code normal ne fonctionne pas.
Donc à chaque affichage, la totalité du code est exécutée. Pour le moment il n'y a pas grand chose, juste la gestion de la date courante et les sélections, mais plus tard il y aura tous les marqueurs, et du code qui analysera les données pour en extraire les périodes etc... Une fenêtre d'un autre programme se superposant devant le
Calendrier déclencherait donc la réévaluation de tout ce code.
Avec un
TImage, c'est comme n'importe quel composant, je le construit dans mon code,
Windows se souvient de son look, et le réapplique quand il le faut, mais à partir de l'image déjà créée. En fait je me demande à quoi peuvent servir ces
TPaintBox.
En recherchant dans les messages de l'été dernier, tu m'avais déjà conseillé de bosser directement via le
Canvas des composants. J'avais préféré utilisé des
TShape car manipuler les
Brush et
Pen des
Canvas me paraissait archaïque, mais c'est clair que c'est puissant...
Code : Tout sélectionner
// Couleur du fond
Day_Cell.Canvas.Brush.Color := Day_Color;
// Couleur de la bordure selon la sélection
if Day_Selected
then Day_Cell.Canvas.Pen.Color := clBlack
else Day_Cell.Canvas.Pen.Color := Day_Color;
// Coloriage du fond
Day_Cell.Canvas.Rectangle(0, 0, 36, 16);
// Style du texte selon l'activation
Day_Cell.Canvas.Font := Self.Font;
if Day_Date = LV_ActiveDate
then Day_Cell.Canvas.Font.Style := [fsBold]
else Day_Cell.Canvas.Font.Style := [];
// Couleur du texte selon la date
if Day_Date = Trunc(Date)
then Day_Cell.Canvas.Font.Color := clMaroon
else Day_Cell.Canvas.Font.Color := clBlack;
// Affichage du texte
DecodeDate(Day_Date, Year, Month, Day);
SetTextAlign(Day_Cell.Canvas.Handle, TA_CENTER);
Day_Cell.Canvas.TextOut(18, 1, IntToStr(Day));