// Es wird ein Rubbel-Los nachgebildet. Mit gedrücktgehaltener linker
// Maustaste werden Teile einer grauen Fläche weggearbeitet und darunter
// kommt ein Bild
(eine Schrift) zum Vorschein.

// Getestet mit D4 unter XP

// Variante 1: Mit 2 Timage und kreisförmigen Abtragen,
               aber "DoubleBuffered" muss TRUE sein

const 
  unten: boolean = false; 
  radius: integer = 7; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  doublebuffered := true; 
  Image1.Picture.bitmap.loadfromfile('d:\bilder\auto.bmp'); 
  Image2.boundsrect := Image1.boundsrect; 
  Image2.picture.bitmap.width := Image1.width; 
  Image2.picture.bitmap.height := Image1.height; 
  Image2.picture.bitmap.canvas.brush.color := clgray; 
  Image2.picture.bitmap.canvas.fillrect 
    (Image2.picture.bitmap.canvas.cliprect); 
  Image2.picture.bitmap.transparentcolor := clred; 
  Image2.picture.bitmap.canvas.brush.color := clred; 
  Image2.picture.bitmap.canvas.pen.style := psclear; 
  Image2.transparent := true; 
end; 
 
procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  unten := true; 
end; 
 
procedure TForm1.Image2MouseUp(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  unten := false; 
end; 
 
procedure TForm1.Image2MouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
begin 
  if unten then Image2.picture.bitmap.canvas.ellipse(x - radius, y - radius, 
      x + radius, y + radius); 
end; 
// ---------------------------------------------------------

// Variante 2: Mit 1 Timage und 1 TBitmap, quadratischem Abtragen,
               DoubleBuffered bleibt FALSE

const 
  unten: boolean = false; 
  halb: integer = 5; 
 
var 
  bild: TBitmap; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  bild := TBitmap.create; 
  bild.loadfromfile('d:\bilder\auto.bmp'); 
  Image1.picture.bitmap.width := bild.width; 
  Image1.picture.bitmap.height := bild.height; 
  Image1.picture.bitmap.canvas.brush.color := clgray; 
  Image1.picture.bitmap.canvas.fillrect 
    (Image1.picture.bitmap.canvas.cliprect); 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  bild.free; 
end; 
 
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  unten := true; 
end; 
 
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  unten := false; 
end; 
 
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
var r: TRect; 
begin 
  if unten then begin 
    r := rect(x - halb, y - halb, x + halb, y + halb); 
    Image1.Picture.bitmap.canvas.copyrect(r, bild.canvas, r); 
  end; 
end; 

// ---------------------------------------------------------

// Variante 3: Mit 1 Timage und 2 TBitmap. Ein Bitmap stellte eine Maske dar,
               was im Beispiel einen zackigen Rand ergibt und einer echten
               "Rubbelei" dadurch näher kommt

Beispiel-Schablone
const 
  unten: boolean = false; 
 
var 
  bild, schablone: TBitmap; 
  halb: integer; 
 
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  bild := TBitmap.create; 
  schablone := TBitmap.create; 
  bild.loadfromfile('d:\bilder\auto.bmp'); 
  schablone.loadfromfile('d:\bilder\stern.bmp'); 
  halb := schablone.width div 2; 
  Image1.autosize := true; 
  schablone.monochrome := true; 
  Image1.picture.bitmap.width := bild.width; 
  Image1.picture.bitmap.height := bild.height; 
  Image1.picture.bitmap.canvas.brush.color := clgray; 
  Image1.picture.bitmap.canvas.fillrect 
    (Image1.picture.bitmap.canvas.cliprect); 
end; 
 
procedure TForm1.FormDestroy(Sender: TObject); 
begin 
  bild.free; 
  schablone.free; 
end; 
 
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  unten := true; 
end; 
 
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  unten := false; 
end; 
 
procedure doit(im: TImage; x, y: integer); 
begin 
  maskblt(im.picture.bitmap.canvas.handle, x - halb, y - halb, schablone.width, 
    schablone.height, bild.canvas.handle, x - halb, y - halb, schablone.handle, 
    0, 0, MAKEROP4(srcand, srccopy)); 
  im.refresh; 
end; 
 
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
begin 
  if unten then doit(Image1, x, y); 
end; 


Zugriffe seit 6.9.2001 auf Delphi-Ecke