Ideja je da se nakon iscrtavanja nekog stringa (preuzetog iz RichEdit komponente) u Canvasu dobije tacna sirina stringa. Radi se o TrueType fontu, jer ce zavrsna slika ici u WMF. Napominjem da sam vec probao s funkcijama GetTextWidth, odnosno GetTextExtentPoint32 (API) i one lepo rade kad je u pitanju normalan font. Medjutim cim promenim stil fonta na Italic odmah prikazuje pogresno, npr. string 'asdf' vraca duzinu od 20 piksela i to je tacno, a italic vraca isto 20, a prava duzina je 26
. Cackao sam po Netu i naisao na funkciju GetTextMetric, medjutim ona ne radi sa TrueType fontovima. Isto tako sam probao s funkcijom GetCharaABCWidths koja bi trebalo da vrati odsutpanje karaktera (npr f) tj. Overhang, ali mi ona stalno vraca gresku. Na Netu sam pronasao par primera koji ovo resavaju, ali su svi oni pisani u C++. Evo kako sam ja probao:
Mozda sam nesto gadno pogresio ovde, posto sam slabije do sad radio sa API-jem.
Pozdrav
Code:
procedure TForm1.AdjustEndRect(var CharW: Integer; Key: Char; MyCanvas: TCanvas);
var
iLastChar: cardinal;
iCharWidth: integer;
iCharInfo: TABC;
dc: HDC;
begin
dc := MyCanvas.Handle;
iLastChar := Ord(Key);
if GetCharABCWidths( dc, iLastChar, iLastChar, iCharInfo ) then //ovde vraca gresku
begin
iCharWidth := iCharInfo.abcA + integer(iCharInfo.abcB);
if iCharInfo.abcC >= 0 then //ako postoji odsupanje dodaj abcC
Inc( iCharWidth, iCharInfo.abcC );
end
else
GetCharWidth( dc, iLastChar, iLastChar, iCharWidth ); //ako ne, tekst nema odstupanja sledi obicna probera
if iCharWidth > 0 then
Inc( CharW, iCharWidth );
end;
procedure TForm1.AdjustEndRect(var CharW: Integer; Key: Char; MyCanvas: TCanvas);
var
iLastChar: cardinal;
iCharWidth: integer;
iCharInfo: TABC;
dc: HDC;
begin
dc := MyCanvas.Handle;
iLastChar := Ord(Key);
if GetCharABCWidths( dc, iLastChar, iLastChar, iCharInfo ) then //ovde vraca gresku
begin
iCharWidth := iCharInfo.abcA + integer(iCharInfo.abcB);
if iCharInfo.abcC >= 0 then //ako postoji odsupanje dodaj abcC
Inc( iCharWidth, iCharInfo.abcC );
end
else
GetCharWidth( dc, iLastChar, iLastChar, iCharWidth ); //ako ne, tekst nema odstupanja sledi obicna probera
if iCharWidth > 0 then
Inc( CharW, iCharWidth );
end;
Mozda sam nesto gadno pogresio ovde, posto sam slabije do sad radio sa API-jem.
Pozdrav