2004. július 21., szerda

How to fill a text with a bitmap


Problem/Question/Abstract:

How to fill a text with a pattern or bitmap? I know that using fillpath(dc) will do it but how can I assign the bitmap or a gradient color to the font?

Answer:

Solve 1:

Here's one method. To make this work, add a TImage and load it with a bmp of about 256 x 256. Make the TImage Visible - False. Drop a TButton on the form. Hook up the OnClick for the button. Change the Form's Font to be something big enough, say around 80 for the size. Also, specify a True Type Font (I used Times New Roman).

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  ClipRegion: HRGN;
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  Bmp.Width := Image1.Width;
  Bmp.Height := Image1.Height;
  Bmp.Canvas.Brush.Color := clSilver;
  {You could use a different color, or another bitmap}
  Bmp.Canvas.FillRect(RECT(0, 0, Bmp.Width, Bmp.Height));
  BeginPath(Canvas.Handle);
  SetBkMode(Canvas.Handle, TRANSPARENT);
  TextOut(Canvas.Handle, 10, 30, 'Cool!', 5);
  EndPath(Canvas.Handle);
  ClipRegion := PathToRegion(Canvas.Handle);
  SelectClipRgn(Bmp.Canvas.Handle, ClipRegion);
  Bmp.Canvas.Draw(0, 0, Image1.Picture.Bitmap);
  SelectClipRgn(Bmp.Canvas.Handle, 0);
  Canvas.Draw(0, 0, Bmp);
  DeleteObject(ClipRegion);
  Bmp.Free;
end;

end.


Solve 2:

procedure TForm1.Button1Click(Sender: TObject);
var
  dc: hdc;
  SaveIndex: integer;
  bm: TBitmap;
begin
  bm := TBitmap.Create;
  bm.LoadFromFile('c:\download\test.bmp');
  Canvas.Font.Name := 'Arial';
  Canvas.Font.Height := 100;
  dc := Canvas.Handle;
  SaveIndex := SaveDc(Dc);
  SetBkMode(dc, TRANSPARENT);
  BeginPath(dc);
  Canvas.TextOut(0, 0, 'Many TeamB guys ignore me');
  EndPath(dc);
  SelectClipPath(dc, RGN_COPY);
  Canvas.Draw(0, 0, bm);
  RestoreDc(dc, SaveIndex);
  bm.Free;
end;

Nincsenek megjegyzések:

Megjegyzés küldése