Citation :
 
 unit Udraw;
   interface
   uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   ExtCtrls, StdCtrls;
 type
   TForm1 = class(TForm)
     PaintBox1: TPaintBox;
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
     procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
       Y: Integer);
     procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
     procedure PaintBox1Paint(Sender: TObject);
   private
     procedure dessinecurseur;
   end;
     Tcurseur = record
      drawing : boolean; // en cours de déplacement
      rr  : trect;            // rectangle position courante
      rro : trect;           // rectangle ancienne position
      RECsprite : Trect;  // le rectangle correspondant a BMPSprite
   end;
   var
   Form1: TForm1;
   H, W : integer;            // hauteur et largeur de la paintbox
   BmpFond : Tbitmap;     // bitmap de fond
   BmpMemoire : Tbitmap; // bitmap memoire pour preparation dessin a afficher
   BMPsprite : Tbitmap;    // le bitmap que je veux deplacer avec la souris
                                   // et qui comporte dans son milieu de la couleur noire
                                   // que je voudrais rendre transparente
   cc : Tcurseur;             // pour la gestion du bitmap BMPSprite
   implementation
 {$R *.DFM}
   //------------------------------------------------------------
 procedure TForm1.FormCreate(Sender: TObject);
 begin
   H := paintbox1.height;
   W := paintbox1.width;
   cc.drawing := false;
   cc.rr := rect(50, 50, 150, 150); // definition d'un premier emplacement
                                              // pour le nouveau rectangle
   cc.rro := cc.rr;                       // position courante du spprite devient
                                              // l'ancienne position
     BmpFond := Tbitmap.create;     // bitmap de fond
   BmpFond.width  := W;
   BmpFond.height := H;
   BmpFond.LoadFromFile('fond.bmp');  // fond.bmp = 500x333 16 millions couleurs
     BmpMemoire := tbitmap.create;
   BmpMemoire.assign(BmpFond);      // copie de BmpFond sur BmpMemoire
     BMPsprite := Tbitmap.Create;
   BMPsprite.LoadFromFile('bitmap.bmp'); // chargement de l'image du sprite
   BMPsprite.PixelFormat := pf32bit;
       // c'est là que je determine la transparence mais cela ne marche pas.
   // je voudrais que tout le noir de mon sprite devienne transparent
   // j'ai fabriqué ce sprite avec image éditeur de delphi :
   // bitmap.bmp = 100x100 256 couleurs
     BMPsprite.Transparent := true;
   BMPsprite.TransparentColor := rgb(0,0,0); // couleur noire
     cc.RECsprite.Left := 0;
   cc.RECsprite.Top := 0;
   cc.RECsprite.Right := BMPsprite.Width;
   cc.RECsprite.Bottom := BMPsprite.Height;
     dessinecurseur;  // affichage du premier sprite à la position de départ
 end;
 //------------------------------------------------------------
 procedure TForm1.PaintBox1Paint(Sender: TObject);
 begin
 form1.paintbox1.Canvas.Draw(0,0,BmpMemoire);
 end;
 //------------------------------------------------------------
 Procedure Tform1.dessinecurseur;
 var
   Runion: Trect;
 begin
   BmpMemoire.canvas.copyrect(cc.rro, BmpFond.canvas,cc.rro);
   BmpMemoire.Canvas.CopyRect(cc.rr,BMPsprite.canvas,cc.RECsprite);
   Unionrect(Runion, cc.rro, cc.rr);
   form1.paintbox1.canvas.copyrect(Runion, BmpMemoire.canvas, Runion);
   cc.rro := cc.rr;
 end;
 //------------------------------------------------------------
 procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
 Var
   p : tpoint;
 begin
   p.x := X;  p.y := Y;
   if ptinrect(cc.rr, p) then
   begin
     cc.drawing := true;
     cc.rr := rect(x, y, x+100, y+100);   //100 = largeur et hauteur de BMPSprite
   end;
   dessinecurseur;
 end;
 //------------------------------------------------------------
 procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
   Y: Integer);
 begin
   IF cc.drawing then
   begin
      cc.rr := rect(x, y, x+100, y+100);
      dessinecurseur;
   end;
 end;
 //------------------------------------------------------------
 procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
 begin
   IF cc.drawing then
   begin
     cc.rr := rect(x, y, x+100, y+100);
     dessinecurseur;
     cc.drawing := false;
   end;
 end;
 //------------------------------------------------------------
 procedure TForm1.FormDestroy(Sender: TObject);
 begin
   BmpFond.free;
   BmpMemoire.free;
   BMPSprite.Free;
 end;
   end.
   |