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:
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;
Mozda sam nesto gadno pogresio ovde, posto sam slabije do sad radio sa API-jem.
Pozdrav