Page 1 sur 1

Sam 09/02/2013 - Actualités

Posté : sam. 9 févr. 2013 15:43
par Xavier
Cellules


Les marqueurs en pseudo-reliefs ont pu être dessinés sur le Canvas de composants TPaintBox, choisis car ils semblaient plus simples à manipuler que les TImages. :?

Ils sont en fait très particuliers, puisque le code qui dessine doit être écrit dans leur évènement OnPaint, celui-ci étant déclenché par Windows dès que le composant est affiché. (Ils ne sont pas persistants...) Exécuter tout le code à chaque fois que la page du Calendrier est affiché n'était pas acceptable, donc ils ont été remplacés par des TImage.

Ceux-ci ayant des méthodes Show, Hide et un évènement OnClick, les cellules des jours sont désormais composées d'un TImage unique au lieu des ensembles TLabel + TShapes multiples !
TImageCells.png
C'est laid mais ce sont de vrais images, et cette implémentation partielle a permis de valider le resize de la fenêtre. :)
Il reste à peaufiner la police, son alignement, la couleur et revoir la gestion des sélections avant de pouvoir brancher le dessin des périodes, mais tout cela a déjà été testé avec succès dans le prototype d'hier soir.

Sam 09/02/2013 - Actualités

Posté : sam. 9 févr. 2013 18:03
par Xavier
Nouvelles cellules


Les nouvelles cellules basées sur des images sont opérationnelles.
Le dessin des marqueurs des périodes étant désormais faisable grâce à ces images, retour sur la gestion des périodes elles-mêmes...


De nouveaux raccourcis-claviers ont été ajoutés au navigateur du Calendrier :
NewKeys.png

Re: Sam 09/02/2013 - Actualités

Posté : sam. 9 févr. 2013 18:18
par Denis
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...

Re: Sam 09/02/2013 - Actualités

Posté : sam. 9 févr. 2013 21:37
par Xavier
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));