Frage

Ich möchte eine transparente TMetafile auf einer Leinwand zeichnen, für Druckwasserzeichen verwendet wird.

Das Problem ist Alphablend-Funktion wird nicht TMetaFile.Handle als Quelle erkennen, wie es Leinwand Griff erwartet.

Ich habe einen 32-Bit-Bitmap mit Transparenz, sondern der Zeichnung auf es wird weißen Hintergrund zwingt somit auf Leinwand können Sie ein Alpha-blended Rechteck sehen. Wie kann ich einen transparenten TMetafile auf dem Bildschirm / Drucker male Leinwand?

TMetafile sicher transparent ist, habe ich es auf einfache Web-Seite mit IE mit Nicht-Standard-Hintergrundfarbe getestet. Der Quellcode:

procedure TPainter.DrawAlpha(ACanvas: TCanvas; ARect: TRect; AGraphic: TMetafile; AAlpha: Byte);
var
  bmp: TBitmap;
  bf: BLENDFUNCTION;
begin
  bmp := TBitmap.Create;
  try
    bmp.PixelFormat := pf32bit;
    bmp.SetSize(ARect.Right - ARect.Left, ARect.Bottom - ARect.Top);
    bmp.Transparent := True;
    bmp.Canvas.Brush.Color := clNone;
    bmp.Canvas.Brush.Style := bsClear;
    bmp.Canvas.FillRect(Rect(0, 0, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top));
    bmp.Canvas.StretchDraw(Rect(0, 0, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top), AGraphic);

    bf.BlendOp := AC_SRC_OVER;
    bf.BlendFlags := 0;
    bf.SourceConstantAlpha := 230;
    bf.AlphaFormat := 0;

    AlphaBlend(
      ACanvas.Handle,
      ARect.Left,
      ARect.Top,
      ARect.Right - ARect.Left,
      ARect.Bottom - ARect.Top,
      bmp.Canvas.Handle,
      0,
      0,
      ARect.Right - ARect.Left,
      ARect.Bottom - ARect.Top,
      bf
    );
  finally
    bmp.Free;
  end;
end;
War es hilfreich?

Lösung

Wenn Sie die MSDN offizielle Dokumentation zu überprüfen, werden Sie diese Anweisung erhalten: http://msdn.microsoft.com/en-us/ Bibliothek / dd183351 (VS.85) aspx

tritt ein Fehler auf (und die Funktion gibt FALSE), wenn die Quellgerätekontext identifiziert einen erweiterten Metadatei Gerätekontext.

Meine erste Vermutung war, dass, auch wenn die MSDN spricht nur über die Quelle Gerätekontext, den Code wird nie Arbeit mit Alphablend, die Arbeit zwischen zwei Bitmaps bestimmt ist.

Aber nach dem zweiten Untersuchung, gibt es eine speziell TEMRAlphaBlend Satzart in der Meta File Aufzählung tyles. So sollte es funktionieren wie erwartet.

Was sind Sie mit Ihrem Metafile angezeigt werden? Wir werden den Code müssen Sie hier zum Anzeigen des Metafile verwenden.

Mein Rat ist, Ihre Metafile in eine emf-Datei zu speichern, verwenden Sie dann emfexplorer seinen Kontext zu untersuchen.

Wir haben ein Open-Source-Gerät entwickelt, mit dem Namen SynGdiPlus, für eine Meta-Datei zeichnen GDI + verwenden, also mit Anti-Aliasing, in reiner Delphi. Aber wir haben nicht versucht die TEMRAlphaBlend Satzart noch. Wenn Sie interessant finden würden Anti-Aliasing Zeichnung in Ihrer App zu haben, ich habe es einen Blick in der Umsetzung übernehmen könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top