Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
Delphi 2007 Professional
|
AW: PlgBlt und MaskHandle
11. Sep 2017, 13:57
So, ich hab mal eine Lösung, wenn auch eher unelegant:
Delphi-Quellcode:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
bmp, mask, mask2: TBitmap;
r: TRect;
Points: array[0..2] of TPoint;
begin
bmp := TBitmap.Create;
try
bmp.LoadFromFile('test.bmp');
bmp.Transparent := True;
SetRect(r, 0, 0, bmp.Width, bmp.Height);
PaintBox1.Canvas.Draw(r.Left, r.Top, bmp);
OffsetRect(r, bmp.Width + 2, 0);
Points[0] := Point(r.Left, r.Top);
Points[1] := Point(r.Right, r.Top);
Points[2] := Point(r.Left, r.Bottom);
PlgBlt(PaintBox1.Canvas.Handle, Points, bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, 0, 0, 0);
OffsetRect(r, bmp.Width + 2, 0);
Points[0] := Point(r.Left, r.Top);
Points[1] := Point(r.Right, r.Top);
Points[2] := Point(r.Left, r.Bottom);
mask := TBitmap.Create;
try
mask.SetSize(bmp.Width, bmp.Height);
mask.Monochrome := True;
mask.PixelFormat := pfDevice;
mask2 := TBitmap.Create;
try
mask2.Handle := bmp.MaskHandle;
BitBlt(mask.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, mask2.Canvas.Handle, 0, 0, NOTSRCCOPY);
finally
mask2.Free;
end;
PlgBlt(PaintBox1.Canvas.Handle, Points, bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, mask.Handle, 0, 0);
finally
mask.Free;
end;
finally
bmp.Free;
end;
end;
Ergebnis:
Wenn jemand eine Idee hat, wie ich das ohne die zwei Zwischenbitmaps Mask/mask2 hinkriege, immer her damit!
Update: MaskHandle geht anscheinend bei erstmaliger Verwendung kaputt, also besser so:
Delphi-Quellcode:
mask2 := TBitmap.Create;
try
//mask2.Handle := bmp.MaskHandle; Funktioniert nur einmalig - ist danach kaputt???
mask2.Assign(bmp);
mask2.Mask(bmp.Canvas.Pixels[0, bmp.Height - 1]);
BitBlt(mask.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, mask2.Canvas.Handle, 0, 0, NOTSRCCOPY);
finally
mask2.Free;
end;
Update2: Klar geht's kaputt, wenn man's an mask2 dranhängt und dann mask2.Free aufruft.
Also so:
Delphi-Quellcode:
mask2 := TBitmap.Create;
try
mask2.Handle := bmp.MaskHandle;
BitBlt(mask.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, mask2.Canvas.Handle, 0, 0, NOTSRCCOPY);
mask2.ReleaseHandle;
finally
mask2.Free;
end;
Uli Gerhardt
Geändert von uligerhardt (11. Sep 2017 um 14:41 Uhr)
|