1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| // Ecrire sur un canvas un texte incliné, avec ou sans bordure, monochrome ou à face texturée
procedure AffTexteIncliBordeTexture( C : TCanvas; X,Y : integer; Fonte : tFont;
clBord : TColor; EpBord : integer; PenMode : TPenMode;
Texture : tBitMap; Texte : string; AngleDD : longint);
// params : C = Canvas-cible
// X,Y = Coordonnées angle supérieur gauche du début du texte.
// Fonte = Police de caractères à utiliser : uniquement des fontes scalables.
// clBord = Couleur de la bordure.
// EpBord = Epaisseur de la bordure.
// PenMode = TPenMode : utiliser en général pmCopy.
// Texture = BitMap de texture : Si Texture = Nil alors la face sera de la couleur de Fonte avec un contour de clBord si EpBord > 0.
// Texte = Texte à écrire.
// AngleDD = Angle d'inclinaison en Dixièmes de degré.
var dc : HDC;
lgFont : LOGFONT;
AncFonte,NouvFonte : HFONT;
AncPen,NouvPen : HPEN;
AncBrush,NouvBrush : HBRUSH;
begin C.Pen.Mode:=PenMode;
dc := C.Handle;
// Initialisation de la fonte
zeroMemory(@lgFont,sizeOf(lgFont));
strPCopy(lgFont.lfFaceName,Fonte.Name);
lgFont.lfHeight := Fonte.Height;
if Fonte.style=[] then lgFont.lfWeight:=FW_REGULAR; // Normal
if Fonte.style=[fsBold] then lgFont.lfWeight:=FW_BOLD; // Gras
if fsItalic in Fonte.style then lgFont.lfItalic:=1;
if fsUnderline in Fonte.style then lgFont.lfUnderline:=1;
if fsStrikeout in Fonte.style then lgFont.lfStrikeout:=1;
lgFont.lfEscapement:=AngleDD; // Modification de l'inclinaison
NouvFonte := CreateFontInDirect(lgFont);
AncFonte := SelectObject(dc,NouvFonte);
// Initialisation du contour :
if EpBord<>0 then NouvPen := CreatePen(PS_SOLID,EpBord,clBord)
else NouvPen := CreatePen(PS_NULL,0,0);
AncPen := SelectObject(dc,NouvPen);
// Initialisation de la couleur de la police ou de la Texture :
if Texture=nil then NouvBrush := CreateSolidBrush(Fonte.color)
else NouvBrush := CreatePatternBrush(Texture.Handle);
AncBrush := SelectObject(dc,NouvBrush);
// Le contexte doit être transparent
SetBkMode(dc,TRANSPARENT);
// Dessin du texe :
BeginPath(dc);
TextOut(dc,X,Y,PChar(Texte),length(texte)); //<- au lieu de TextOut(dc,X,Y,PansiChar(Texte),length(texte)) pour rendre le code compatible avec toutes les versions de Delphi (de D2 à XE2);
EndPath(dc);
StrokeAndFillPath(dc);
// Restauration objets et libération mémoire
SelectObject(dc,AncFonte);
DeleteObject(NouvFonte);
SelectObject(dc,AncPen);
DeleteObject(NouvPen);
SelectObject(dc,AncBrush);
DeleteObject(NouvBrush);
end; // AffTexteIncliBordeTexture |
Partager