Newsgroup: it.comp.lang.delphi
Titolo: TextOut e allineamento

ciao a tutti,
Ho un'area definita da una var TRect, se scrivo del testo con TextOut 
come faccio a fare l'allineamento veriticale del testo?
grazie a tutti.
------------------------
Diego Di Filippo
  R&amp;D Software Developer
 
www.ada-project.com
-----------------------
--- posted by geoForum on 
http://www.delphiedintorni.it

 come faccio a fare l'allineamento veriticale del testo?
Se usi il metodo /TextOut/ dell'oggetto *Canvas*, non hai opzioni a 
disposizione; piuttosto, richiama la procedura /DrawText/ delle Windows 
API passando l'handle del Canvas appropriato e il flag DT_VCENTER per 
l'allineamento verticale.
Per maggiori informazioni:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_0odw.asp
Ciao! :-)
-- 
Marco «Alka» Breveglieri
  (marco [@] abls [.] it)
  ABLS Team S.n.c. - Software & Web
  42019 Scandiano (Reggio Emilia)
 
http://www.abls.it

Ecco un esempio che avevo trovato in giro (efgLab?) al quale avevo solo 
applicato leggerissime modifiche:
procedure TForm1.Button1Click(Sender: TObject);
var
   lf : TLogFont;
   OldFont : hFont;
   NewFont : hFont;
   txt: pchar;
begin
   txt:= '000.15499.5'; // <-- text string to be printed
   Printer.BeginDoc;
 
Printer.Canvas.Font.Name
 := 'Arial';
   Printer.Canvas.Font.Size := 14;
   Printer.Canvas.Font.PixelsPerInch:=
     GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY);
   GetObject(Printer.Canvas.Font.Handle, sizeof(lf), @lf);
   lf.lfEscapement := 1800;   // <- rotazione in decimi di grado
   lf.lfOrientation := 0;
   // Check here that lf is properly filled out!
   NewFont := CreateFontIndirect(lf);
   OldFont := SelectObject(Printer.Canvas.Handle, NewFont);
   Windows.TextOut(Printer.Canvas.Handle,
     // 1.22" over 2.076" down (test canon i865)
     ROUND(1.22*GetDeviceCaps(Printer.Canvas.Handle, LONGPIXELSY)),
     ROUND(0.76*GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY)),
     txt,
     strlen(txt));
   SelectObject(Printer.Canvas.Handle, OldFont);
   DeleteObject(NewFont);
   Printer.EndDoc;
end;

ciao Marco,
ho sostituito la TextOut con :
DrawText( Sender.Canvas.Handle, PChar(strNumeroNodo), length( 
strNumeroNodo ), NumRect, DT_VCENTER );
perň non vedo nessun allineamento verticale, come mai?
Quel Sender č un TreeView e io crivo a fianco un nodo del treeview.


 però non vedo nessun allineamento verticale, come mai?
Siamo sicuri che il rettangolo abbia spazio sufficiente e che sia l'area 
corretta da utilizzare per l'output del testo?
Ad ogni modo, puoi tentare anche la soluzione proposta da "Bimbo Super" 
(che non mi sembrava male, anzi...) per controprova.


(che non mi sembrava male, anzi...) per controprova.
Non vedo nessun Bimbo Super nei post....:O


From: "(¯`·.¸ Bimbo Super¸.·´¯)" <bimbo...@NONVOGLIOSPAMlibero.it>
-- 
Morde. 
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

>From: "(¯`·.¸ Bimbo Super¸.·´¯)" <bimbo...@NONVOGLIOSPAMlibero.it>
scusa Morde ma non ho ben capito cosa devo cercare.


 scusa Morde ma non ho ben capito cosa devo cercare.
Bimbo Super e' quello che si firma "***Gio***", e' un post di questo stesso
thread, io ti ho dato il suo /Message-Id/ .
Il /Message-Id/ e' un codice che permette di distinguere (quasi)
univocamente un post usenet da tutti gli altri. Puoi trovare molte
spiegazioni piu' tecniche delle mie su google, io ti do' questo link:
http://xmau.com/articoli/news2.html#dupl
Ciao


si alla fine ho risolto cosě calcolando la posizione del testo con 
TextHeight.
Non mi sembra una situazione molto elegante e corretta, vorrei solo 
sapere perchč non funzione la Drawtext che mi ha consigliato Marco!!!!
mah!!!! non lo saprň mai!!! :(


 Marco!!!! mah!!!! non lo saprò mai!!! :(
A quale controllo appartiene il /Canvas/ di cui passi l'handle alla 
funzione API /DrawText/?  (indaghiamo...)


funzione API /DrawText/?  (indaghiamo...)
Ciao Marco,
L'handle che passo a DrawText è quello di un TreeView.
Nell'evento OnCustomDrawItem scrivo :
DrawText( Sender.Canvas.Handle, ... );
Questa API mi sembra ottima è un peccato che non riesca a farla 
funzionare.


 DrawText( Sender.Canvas.Handle, ... );
Mumble...mumble... :-)
Come determini il rettangolo *TRect* all'interno del quale devi 
tracciare il testo?


tracciare il testo?
Io devo scrivere del testo a fianco un item del TreeView.
Per determinare l'area :
var
   r : Trect;
begin
  { determino il rect del nodo }
  NodeRect := Node.DisplayRect( True );
  { determino il rect del testo a fianco il nodo }
  textRext := NodeRect;
  textRect.Left := NodeRect.Right;
  textRect.Right := NodeRect.Right + TextWidth( stringa_a_fianco_item );
end;
Quando faccio FillRect di textRect per vedere l'area che ho costruito, 
l'area risulta corretta.


 l'area risulta corretta.
Ho consultato di nuovo (approfonditamente) la Guida relativa alla 
funzione API /DrawText/: si dice che l'allineamento verticale ottenuto 
con il flag DT_VCENTER funziona solo per le linee singole, che a quanto 
pare si specificano in modo esplicito attraverso un altro flag, 
DT_SINGLELINE.
Hai provato a specificare entrambi i flag usando l'operatore logico *or*?
   DrawText(..., DT_SINGLELINE or DT_VCENTER);
Ciao! :-)


DT_SINGLELINE.
Si Marco! funziona benissimo grazie.
In effetti su msdn on line, quando parla del flag DT_VCENTER nella 
descrizione dice :
Centers text vertically. This value is used only with the DT_SINGLELINE 
value.
grazie di nuovo Marco.
