J'essaie de dessiner un barGraph avec à l'intérieur un texte écrit.
Je trace mon bord et ma barre de progression dans un canvas, j'écris le
texte dans un autre canvas que je copie ensuite dans le premier avec
pour paramètre CopyMode := cmSrcInvert.
Je ne parviens pas à obtenir mon texte propre, il semble être lissé
avant que j'effectue la copie sur le canvas, faut-il que j'évite
d'utiliser une police true type ou bien y a-t-il un autre moyen ?
voici tout le code :
setBrushFont(enakMeasureLow,
Font);
// selection de la fonte
conso := round( nuDatas.measure[k].measure.currentConsoPct*100
);
// consommation en pourcentage, arrondi à la valaeur entière
t := IfThen( nuDatas.measure[k].measure.isFullConso, '>200',
IntToStr(conso) ) + '%'; // texte à afficher
SetRect(R, x +
LEFT_OFFSET,
// définition du rectangle de la conso
bottomWrite + 2,
x + LEFT_OFFSET + BAR_SIZE,
bottomWrite + hTexte - 2);
brush.Color := bgColor;//BG_CONSO;
FillRect(R);
Brush.Color :=
getUsageColor(conso);
// brush : couleur en fonction du pourcentage
Pen.Color :=
Brush.Color;
// pen : même couleur
Pen.Style :=
psSolid;
// trait continu
Pen.Width :=
2;
// trait un peu épais
Brush.Style :=
bsClear;
// pas de remplissage du fond
Rectangle(R);
// trace le pourtour due la barre
x2 := R.Left + trunc(((R.Right - R.Left) * min(1.0, conso / 100)
)); // rapport de
remplissage selon la conso
SetRect(R1, R.Left, R.Bottom, x2,
R.Top);
// nouveau Rec à remplir
Brush.Style :=
bsSolid;
// remplissage du fond
Brush.Color :=
getUsageColor(conso);
// brush : couleur en fonction du pourcentage
Pen.Style := psSolid;
FillRect(R1);
// trace la partie pleine de la barre
Font.Color := clBlack;
// ** marquage en inverse video du texte **
bitmap :=
TBitmap.Create;
// création d'un bitmap pour afficher le texte
setBrushFont(enakBarre,
bitmap.Canvas.Font);
// choix de la fonte
hTexte :=
bitmap.Canvas.TextHeight(t);
// hauteur de la consommation à dessiner
lTexte :=
bitmap.Canvas.TextWidth(t);
// largeur de la consommation à dessiner
bitmap.Width := lTexte;
bitmap.Height := hTexte;
with bitmap.Canvas do begin
CopyMode := cmBlackness;
ARect := Rect(0, 0, Width, Height);
CopyRect(ARect, bitmap.Canvas, ARect);
CopyMode := cmSrcCopy;
end;
bitmap.Canvas.Brush.Style := bsClear;
bitmap.Canvas.Font.Color :=
clwhite;//getUsageColor(conso);
// couleur du texte = couleur de la barre
bitmap.Canvas.TextOut(0, 0,
t);
// écriture de la valeur de la consommation
CopyMode :=
cmSrcInvert;
// mode de copie utilisant le XOR
x1 := ( R.Left + ( (R.Right - R.Left) - bitmap.Width ) div
2);
// x1 : coordonnées d'affichage
y1 := ( R.Top + ( (R.Bottom - R.Top) - bitmap.Height ) div 2
-1);
// y1
Draw(x1, y1,
bitmap);
// copie le bitmap avec le texte dans mon canvas
bitmap.Free;
merci
Freakstreet