Domanda

vorrei disegnare un TMetaFile trasparente su una tela, utilizzati per la filigrana di stampa.

Il problema è la funzione AlphaBlend non riconoscerà TMetaFile.Handle come fonte di come si aspetta maniglia tela.

Ho creato una bitmap 32 bit con trasparenza, ma disegnando su di essa costringerà sfondo bianco quindi su tela è possibile vedere un rettangolo miscelati alfa. Come faccio a dipingere un TMetaFile trasparente sullo schermo / stampante Canvas?

TMetaFile è sicuramente trasparente, ho testato su semplice pagina web utilizzando IE con il colore di sfondo non standard. Il codice sorgente:

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;
È stato utile?

Soluzione

Se si seleziona per la documentazione ufficiale di MSDN, otterrete questa affermazione: http://msdn.microsoft.com/en-us/ biblioteca / dd183351 (VS.85) aspx

  

Un errore si verifica (e la funzione restituisce FALSO) se il contesto identifica dispositivo sorgente un contesto periferica metafile avanzato.

La mia prima risposta è stata che, anche se il MSDN sta parlando solo di contesto dispositivo sorgente, il codice non funzionerà mai con AlphaBlend, che è destinato a lavorare tra le due bitmap.

Ma, dopo la seconda indagine, v'è un tipo di record TEMRAlphaBlend dedicato nei tyles enumerazione Meta File. Così dovrebbe funzionare come previsto.

Che cosa stai usando per visualizzare il metafile? Avremo bisogno del codice si utilizza per la visualizzazione del metafile qui.

Il mio consiglio è quello di salvare il metafile in un file EMF, quindi utilizzare emfexplorer per ispezionare il suo contesto.

Abbiamo sviluppato un'unità di open source, chiamato SynGdiPlus, per disegnare una meta file utilizzando GDI +, quindi con anti-aliasing, in puro Delphi. Ma non abbiamo attuare il tipo di record TEMRAlphaBlend ancora. Se si troverebbero interessante avere l'anti-aliasing di disegno nella vostra app, ho potuto prendere uno sguardo in attuazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top