2017-06-30 4 views
-1

Ich habe ein Image1 (TImage) und eine Maske und Sprite (TImage) mit S/W-Bildern zugewiesen, um sie zur Designzeit zugewiesen. Jetzt möchte ich Mask und Sprite auf Image1 BitBlt ein transparentes Bild zu erhalten:Bitblt-Operation zeigt kein Ergebnis in Delphi

BMPmask := TBitmap.Create; 
BMPsprite := TBitmap.Create; 
try 
    BMPmask.Assign(Mask.Picture.Bitmap); 
    BMPsprite.Assign(Sprite.Picture.Bitmap); 
    BitBlt(Image1.Canvas.Handle, 50, 50, 96, 96, BMPmask.Canvas.Handle, 0, 0, SrcAnd); 
    BitBlt(Image1.Canvas.Handle, 50, 50, 96, 96, BMPsprite.Canvas.Handle, 0, 0, SrcInvert); 
finally 
    BMPmask.Free; 
    BMPsprite.Free; 
end; 

aber wenn ich mein Programm zeigt nichts laufen. Was mache ich falsch?

+0

TImage dient zum Anzeigen von Bildern. Es ist keine allgemeine Zeichenfläche. Erstellen Sie eine Bitmap. Blöd dazu. Weisen Sie diese Bitmap dann dem Bilderbild zu. Und ignorieren Sie keine Rückgabewerte beim Aufruf von API-Funktionen. Die zwei Bitmaps, die Sie in diesem Code erstellen, scheinen sinnlos. Warum sollten Sie Kopien von Bitmaps erstellen, die Sie bereits haben? –

+0

@DavidHeffernan was Sie beschreiben, ist genau das, was dieser Code tut. Die 'TImage' erstellt eine' TBitmap', auf die der Code dann blitzt. Das Bild wird wahrscheinlich nicht angezeigt, da die 'TImage' nicht weiß, dass die Bitmap gezeichnet wurde. Versuchen Sie, 'Image1.Invalidate;' nach dem Zeichnen aufzurufen. Ich stimme zu, dass das Kopieren der ursprünglichen Bitmaps überflüssig ist und entfernt werden sollte. –

+0

@Remy Ist das richtig? Die Canvas-Eigenschaft ist immer gültig und wird immer von einer Bitmap unterstützt? Ich dachte, dass die Bildkontrolle durch ein TPicture unterstützt wurde, das eine beliebige Grafik enthalten kann. –

Antwort

1

Nicht sicher, wie initialisieren Sie Image (es gibt keinen Punkt in der Frage - vielleicht ist es nicht initialisiert?). Ein einfaches Beispiel funktioniert wie erwartet:

unit Unit60; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls; 

type 
    TForm60 = class(TForm) 
    procedure Button1Click(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    public 
    ImageDst: TImage; 
    ImageMask: TImage; 
    ImageSprite: TImage; 
    Button1: TButton; 
    end; 

var 
    Form60: TForm60; 

implementation 

{$R *.dfm} 

procedure TForm60.FormCreate(Sender: TObject); 
begin 
    ImageDst := TImage.Create(Form60); 
    ImageMask := TImage.Create(Form60); 
    ImageSprite := TImage.Create(Form60); 
    Button1 := TButton.Create(Form60); 

    ImageDst.Name := 'ImageDst'; 
    ImageDst.Parent := Self; 
    ImageDst.Left := 24; 
    ImageDst.Top := 24; 
    ImageDst.Width := 249; 
    ImageDst.Height := 281; 

    ImageMask.Name := 'ImageMask'; 
    ImageMask.Parent := Self; 
    ImageMask.Left := 279; 
    ImageMask.Top := 24; 
    ImageMask.Width := 128; 
    ImageMask.Height := 128; 

    ImageSprite.Name := 'ImageSprite'; 
    ImageSprite.Parent := Self; 
    ImageSprite.Left := 279; 
    ImageSprite.Top := 158; 
    ImageSprite.Width := 128; 
    ImageSprite.Height := 128; 

    Button1.Name := 'Button1'; 
    Button1.Parent := Self; 
    Button1.Left := 288; 
    Button1.Top := 303; 
    Button1.Width := 75; 
    Button1.Height := 25; 
    Button1.Caption := 'Button1'; 
    Button1.OnClick := Button1Click; 
end; 

procedure TForm60.Button1Click(Sender: TObject); 
var 
    Mask,Sprite,Dst: TBitmap; 
begin 

    { create bitmap within TImage } 
    Dst := ImageDst.Picture.Bitmap; 
    Dst.SetSize(ImageDst.Width, ImageDst.Height); 

    { prepare some mask & show it at bottom } 
    Mask := ImageMask.Picture.Bitmap; 
    Mask.SetSize(128, 128); 
    Mask.Canvas.Brush.Color := clRed; 
    Mask.Canvas.FillRect(TRect.Create(32, 32, 96, 96)); 

    { prepare some sprite & show it at bottom } 
    Sprite := ImageSprite.Picture.Bitmap; 
    Sprite.SetSize(128, 128); 
    Sprite.Canvas.Ellipse(TRect.Create(16,16,112,112)); 

    { draw to image } 
    BitBlt(Dst.Canvas.Handle, 0, 0, Mask.Width, Mask.Height, Mask.Canvas.Handle, 0, 0, SrcAnd); 
    BitBlt(Dst.Canvas.Handle, 0, 0, Sprite.Width, Sprite.Height, Sprite.Canvas.Handle, 0, 0, SrcInvert); 
end; 

end.