Difference between revisions of "Graphics - Working with TCanvas"

From Free Pascal wiki
Jump to navigationJump to search
(back in English)
Line 1: Line 1:
 
{{Graphics - Working with TCanvas}}
 
{{Graphics - Working with TCanvas}}
  
==Using the default GUI font==
+
===Usare il font di default della GUI===
This can be done with this simple code:
+
Il font di default si ottiene con il seguente codice:
 
<syntaxhighlight>SelectObject(Canvas.Handle, GetStockObject(DEFAULT_GUI_FONT));</syntaxhighlight>
 
<syntaxhighlight>SelectObject(Canvas.Handle, GetStockObject(DEFAULT_GUI_FONT));</syntaxhighlight>
  
===Drawing a text limited on the width===
+
==Disegnare un testo delimitato in larghezza==
  
Use the DrawText routine, first with DT_CALCRECT and then without it.
+
Usare la routine DrawText due volte, prima con l'opzione DT_CALCRECT e poi senza.
  
 
<syntaxhighlight>// First calculate the text size then draw it
 
<syntaxhighlight>// First calculate the text size then draw it
Line 17: Line 17:
 
   TextBox, DT_WORDBREAK or DT_INTERNAL);</syntaxhighlight>
 
   TextBox, DT_WORDBREAK or DT_INTERNAL);</syntaxhighlight>
  
===Drawing text with sharp edges (non antialiased)===
+
==Disegnare un testo con bordi netti (non antialiased)==
  
Some widgetsets support this via
+
Alcuni widgetsets lo supportano, nel qual caso si usa il seguente codice:
  
 
<syntaxhighlight>Canvas.Font.Quality := fqNonAntialiased;</syntaxhighlight>
 
<syntaxhighlight>Canvas.Font.Quality := fqNonAntialiased;</syntaxhighlight>
  
Some widgetsets like the gtk2 do not support this and always paint antialiased. Here is a simple procedure to draw text with sharp edges under gtk2. It does not consider all cases, but it should give an idea:
+
Altri widgetsets come il gtk2 non lo supportano e disegnano sempre antialiased. Di seguito una semplice procedura per disegnare un testo a bordi netti sotto gtk2. Non tiene conto di tutti i casi, ma rende l'idea:
  
 
<syntaxhighlight>procedure PaintAliased(Canvas: TCanvas; x,y: integer; const TheText: string);
 
<syntaxhighlight>procedure PaintAliased(Canvas: TCanvas; x,y: integer; const TheText: string);

Revision as of 00:48, 16 October 2016

English (en) français (fr) italiano (it) русский (ru)

Usare il font di default della GUI

Il font di default si ottiene con il seguente codice:

SelectObject(Canvas.Handle, GetStockObject(DEFAULT_GUI_FONT));

Disegnare un testo delimitato in larghezza

Usare la routine DrawText due volte, prima con l'opzione DT_CALCRECT e poi senza.

// First calculate the text size then draw it
TextBox := Rect(0, currentPos.Y, Width, High(Integer));
DrawText(ACanvas.Handle, PChar(Text), Length(Text),
  TextBox, DT_WORDBREAK or DT_INTERNAL or DT_CALCRECT);

DrawText(ACanvas.Handle, PChar(Text), Length(Text),
  TextBox, DT_WORDBREAK or DT_INTERNAL);

Disegnare un testo con bordi netti (non antialiased)

Alcuni widgetsets lo supportano, nel qual caso si usa il seguente codice:

Canvas.Font.Quality := fqNonAntialiased;

Altri widgetsets come il gtk2 non lo supportano e disegnano sempre antialiased. Di seguito una semplice procedura per disegnare un testo a bordi netti sotto gtk2. Non tiene conto di tutti i casi, ma rende l'idea:

procedure PaintAliased(Canvas: TCanvas; x,y: integer; const TheText: string);
var
  w,h: integer;
  IntfImg: TLazIntfImage;
  Img: TBitmap;
  dy: Integer;
  dx: Integer;
  col: TFPColor;
  FontColor: TColor;
  c: TColor;
begin
  w:=0;
  h:=0;
  Canvas.GetTextSize(TheText,w,h);
  if (w<=0) or (h<=0) then exit;
  Img:=TBitmap.Create;
  IntfImg:=nil;
  try
    // paint text to a bitmap
    Img.Masked:=true;
    Img.SetSize(w,h);
    Img.Canvas.Brush.Style:=bsSolid;
    Img.Canvas.Brush.Color:=clWhite;
    Img.Canvas.FillRect(0,0,w,h);
    Img.Canvas.Font:=Canvas.Font;
    Img.Canvas.TextOut(0,0,TheText);
    // get memory image
    IntfImg:=Img.CreateIntfImage;
    // replace gray pixels
    FontColor:=ColorToRGB(Canvas.Font.Color);
    for dy:=0 to h-1 do begin
      for dx:=0 to w-1 do begin
        col:=IntfImg.Colors[dx,dy];
        c:=FPColorToTColor(col);
        if c<>FontColor then
          IntfImg.Colors[dx,dy]:=colTransparent;
      end;
    end;
    // create bitmap
    Img.LoadFromIntfImage(IntfImg);
    // paint
    Canvas.Draw(x,y,Img);
  finally
    IntfImg.Free;
    Img.Free;
  end;
end;