Pregunta

Me gustaría dibujar una TMetaFile transparente sobre un lienzo, que se utiliza para la impresión marca de agua.

El problema es la función AlphaBlend no reconocerá TMetaFile.Handle como fuente, ya que espera la manija de la lona.

He creado un mapa de bits de 32 bits con transparencia, pero sobre la base de que obligará a fondo blanco tanto en la lona se puede ver un rectángulo mezclado alfa. ¿Cómo puedo pintar un TMetaFile transparente en la pantalla / impresora lienzo?

TMetaFile seguramente es transparente, he probado en la página web simple usando IE con color de fondo no estándar. El código fuente:

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;
¿Fue útil?

Solución

Si marca para la documentación oficial de MSDN, obtendrá la siguiente declaración: http://msdn.microsoft.com/en-us/ biblioteca / dd183351 (VS.85) .aspx

Se produce un error (y el falso devuelve la función) si el contexto identifica dispositivo fuente un contexto de dispositivo de metarchivo mejorado.

Mi primera suposición fue que, incluso si el MSDN está hablando sólo sobre el contexto de dispositivo fuente, el código nunca se trabajo con AlphaBlend, que tiene por objeto el trabajo entre dos mapas de bits.

Sin embargo, después de la segunda investigación, hay un tipo de registro específico TEMRAlphaBlend en los tyles enumeración de archivo de metadatos. Así que debería funcionar como se esperaba.

¿Qué estás usando para mostrar su metarchivo? Tendremos que el código se utiliza para mostrar el metarchivo aquí.

Mi consejo es para guardar su metarchivo en un archivo EMF, a continuación, utilizar emfexplorer para inspeccionar su contexto.

Hemos desarrollado una unidad de código abierto, llamado SynGdiPlus, para la elaboración de un archivo de metadatos utilizando GDI +, por lo tanto, con anti-aliasing, en el más puro Delphi. Pero nosotros no aplicaran el tipo de registro TEMRAlphaBlend todavía. Si le parece interesante que tienen efectos anti-aliasing dibujo en su aplicación, podría echar un vistazo a su aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top