BitmapにBitmapを重ねるには

解決


YUU  2004-12-28 01:55:28  No: 12503  IP: [192.*.*.*]

D7で、お絵かきソフトのようなものを作っています。
スタンプのような機能で、クリックしたら別なBitmapを
Image上にcopyするように考えています。

procedure TF_Map_main.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  StampBitmap: TBitmap;
begin
  StampBitmap := TBitmap.Create;
  try
    StampBitmap.LoadFromFile('C:\TNhato4.bmp');
    image.Canvas.CopyMode := cmSrcAnd; 
    Image.Canvas.CopyRect(
         Rect(X,Y,X + StampBitmap.Width ,Y+StampBitmap.Height),
         StampBitmap.Canvas,
         Rect(0,0,StampBitmap.Width ,StampBitmap.Height));
    finally
        StampBitmap.Free;
    end;
end;

星型のマークで中が黄色で、周りが白のBitmapをスタンプ用の画像として
白いCanvasに貼り付けたいのですが
CopyMode := cmSrcAnd;だと背景は透過してくれるのですが、肝心の
星型のマークの中も  重ねて貼り付けた場合  したのマークのが重なって見えます。
上に貼り付けた、星型のマークの中はしたの画像が見えないようには
出来ないでしょうか?
重ねたら絶えず、上側が優先に・・
同じ画像で、ペイントで貼り付ける場合は、意図としたように出来るのです。
よろしくお願いします。

編集    削除
りおりお  2004-12-28 02:33:19  No: 12504  IP: [192.*.*.*]

描くビットマップの Transparent を True にし、Canvas.Draw() で描くと
背景を透過できます。ヘルプで見てください。

新規で以下のプログラムを試してください

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private 宣言 }
  public
    bmp:array[0..4] of TBitmap;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i:integer;
  color:array[0..4] of TColor;
begin
  color[0] := clGreen;color[1] := clBlue;color[2] := clRed;
  color[3] := clYellow;Color[4] := clLime;
  for i := 0 to 4 do
  begin
    bmp[i] := TBitmap.Create;
    bmp[i].Width := 50;
    bmp[i].Height := 50;
    bmp[i].Canvas.Font.Height := -30;
    bmp[i].Canvas.Font.Color := color[i];
    bmp[i].Canvas.TextOut(0,0,'★');
    bmp[i].Transparent := true;
  end;
  Randomize;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i:integer;
begin
  for i := 0 to 4 do bmp[i].Free;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Canvas.Draw(X-15,Y-15,bmp[Random(5)]);
end;

フォームをクリックすると星型が背景透過で描かれます。重ねて見ると分かります。

編集    削除
YUU  2004-12-28 03:47:19  No: 12505  IP: [192.*.*.*]

りおりお さん、ありがとうございました。
上記コード、及び作成ソース内を変更し、確認出来ました。
ソースまでご提示頂きありがとうございました。
これで、試したいことの枠が広がりました。

編集    削除