Einzelnen Beitrag anzeigen

Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.735 Beiträge
 
Delphi 2007 Professional
 
#2

AW: PlgBlt und MaskHandle

  Alt 11. Sep 2017, 12: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:
test1.png

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 13:41 Uhr)
  Mit Zitat antworten Zitat