Newsgroup: it.comp.lang.delphi
Titolo: Lunghezza di una fraze in pixel

Salve! Dunque io ho una certa stringa, vorrei sapere se c'e' un modo per
ottenere la lunghezza di tale stringa, se visualizzata con un certo font e
una certa dimensione.. in particolare per i font in cui le lettere hanno
lunghezze differenti..
qualcosa tipo:
i:=CalcolaWidth('ciao a tutti!','Times new roman', 12);
Grazie!            {MSX}
--
{MSX}  -  
http://msx.rules.it
Mantenitore delle FAQ di it.comp.lang.delphi,
reperibili qui: 
http://gpi.infomedia.it/abc/delphi/FaqDelphi.txt

 i:=CalcolaWidth('ciao a tutti!','Times new roman', 12);
Se controlli un metodo del Tcanvas (textheight e textwidth), ti restituisce
l'altezza o la larghezza del testo
che gli passi.
Se il canvas è dello schermo, usa un qualunque canvas di un oggetto a video
(un qualunque derivato di TCustomControl). se vuoi sapere la larghezza in
pixel su stampa usa i lcanvas di Tprinter.
Ovviamente per font diversi controlla 
canvas.font.name
 e canvas.font.size
Occhio che in questo caso, se setti un valore in un oggetto dello schermo
poi quello cambia font sul serio... :)
Ciao
Matteo

 i:=CalcolaWidth('ciao a tutti!','Times new roman', 12);
GetTextExtentPoint32
E' un'API di Windows.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


si ma dentro un controllo i font cambiano.
sai come si potrebbe usare?

 sai come si potrebbe usare?
In che senso "dentro un controllo i font cambiano" ?


 
Ciao!
Ho scritto questa "piccola" funzioncella, dovrebbe fare al caso tuo, caso
mai adattala :) 
//*************************************************
{
Function GetTextExtentByFont
  (const text : pchar; font : LOGFONTA) : TSize;
Parametri :
  text : pchar contenente il testo di cui si vogliono mappare le dim.
  font : caratteristiche del font di mappatura. (vedi l'esempio sotto, in
         particolare ff.lfHeight := ...
Ritorna TSize ( TSize.cx TSize.cy )
}
Function GetTextExtentByFont
  (const text : pchar; font : LOGFONTA) : TSize;
//////////////////////////////////////////////////////////////////////////
 Type PENUMLOGFONTA = ^ENUMLOGFONTA;
 Function EnumFontFamProc_CompareFonts
             ( var elfLogFont : ENUMLOGFONT;
               var lpntm : NEWTEXTMETRIC;
               FontType : Integer;
               const lParam: PENUMLOGFONTA ) : Integer; stdcall;
 Begin
   if strIcomp ( lParam^.elfLogFont.lfFaceName,
                 elfLogFont.elfLogFont.lfFaceName) = 0
   then result := 0  // ferma l'enumerazione; 0 = il font è disponibile
   else result := 1; // continua l'enumerazione; 1 = il font NON è disp.
 End;
//////////////////////////////////////////////////////////////////////////
 procedure RaiseGetLastError (const err : string);
 begin
 
result.cx
 := GetLastError;
 
result.cy
 := 
result.cx
;
   raise Exception.Create ( 'GetLastError('+err+'): ' +
    	    	    	    	     IntToStr (
result.cx
));
 end;
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
VAR
  prevobj : HGDIOBJ;
  dc : HDC;
  _font : HFONT;
  GTEP32_result : BOOL;
  font_notavailable : Integer;
Begin
  dc := CreateCompatibleDC (0);
  if dc = NULL then begin
    RaiseGetLastError ('CreateCompatibleDC');
  end;
  // Enumera tutti i font di dc per vedere se font.lfFaceName è
  // disponibile.
  font_notavailable := Integer (
    	    	    	    	EnumFontFamilies ( dc,
                                                   nil,
 
	           @EnumFontFamProc_CompareFonts,
    	    	    	    	    	    	   Integer(@font) )  );
// Se il font non è disponibile, ne seleziona uno di default
  if font_notavailable = 1 then
        font.lfFaceName := 'Small Fonts';
// Converte i PPI richiesti in logical pixels
  font.lfHeight := - MulDiv ( font.lfHeight,
                              GetDeviceCaps(dc, LOGPIXELSY),
                              72);
  // Crea un oggeto HFONT dal font logico font
  _font := CreateFontIndirect (font);
  if _font = NULL then begin
    DeleteDC (dc);
    RaiseGetLastError ('CreateFontIndirect');
    exit;
  end;
  // Seleziona il font per dc
  prevobj := SelectObject (dc, _font);
  if prevobj = NULL then begin
    DeleteObject (_font);
    DeleteDC (dc);
    RaiseGetLastError ('CreateFontIndirect');
    exit;
  end;
  // Ecco i nostri dati interessanti...
  GTEP32_result := GetTextExtentPoint32 ( dc,
                                          text,
                                          integer(strlen(text)),
                                          result );
  // Libera la memoria allocata
  SelectObject (dc, prevobj);
  DeleteObject (_font);
  DeleteDC (dc);
  // Se GetTextExtentPoint32 aveva fallito, solleva un'eccezione.
  if not GTEP32_result
       then RaiseGetLastError ('GetTextExtentPoint32');
End;
//*************************************************
//*************************************************
//*************************************************
procedure TForm1.Button1Click(Sender: TObject);
var ff : LOGFONTA;
    ffsize : TSIZE;
begin
  ff.lfFaceName := 'MS Sans Serif';
  ff.lfHeight := 12; // --> Size del font (viene convertita nella func)
  ff.lfWidth := 0;
  ff.lfEscapement := 0;
  ff.lfOrientation := 0;
  ff.lfWeight := FW_NORMAL;
  ff.lfItalic := 0;
  ff.lfStrikeOut := 0;
  ff.lfCharSet := DEFAULT_CHARSET;
  ff.lfOutPrecision := OUT_DEFAULT_PRECIS;
  ff.lfClipPrecision := CLIP_DEFAULT_PRECIS;
  ff.lfQuality := DEFAULT_QUALITY;
  ff.lfPitchAndFamily := DEFAULT_PITCH;
  Try
    ffsize := GetTextExtentByFont ('Ciao a tutti!!', ff);
  Except
    // ... 
ffsize.cx
 e cy contengono GetLastError
  End;
end;
//*************************************************
Spero sia utile, e soprattutto corretto, perchè l'ho scritto al volo... :)
Ciao!!
Davide DG.
-- 
All resistance is futile! Prepare to be disassembled !

Grazie!            {MSX}

--------------------------------
Inviato via 
http://usenet.iol.it
 

 i:=CalcolaWidth('ciao a tutti!','Times new roman', 12);
quick&dirty:
crei una label in zona non visibile (top = -100);
le assegni il font ed il size;
Len = label.Canvas.TextExtent('ciao a tutti!').cx;
Hgt = label.Canvas.TextExtent('ciao a tutti!').cy;
Saluti
Paolo Arosio