Рисование прозрачного tmetafile на tcanvas в Delphi
-
10-10-2019 - |
Вопрос
Я хотел бы нарисовать прозрачный Tmetafile на холсте, используемый для печатного водяного знака.
Проблема в том, что Alphablend Function не распознает tmetafile.handle как источник, поскольку она ожидает ручки Canvas.
Я создал 32 -битную растровую карту с прозрачностью, но рисование на нем заставит белый фон, таким образом, на холсте вы можете увидеть прямоугольник с альфа -смешанным. Как я могу нарисовать прозрачный Tmetafile на холсте на экране/принтере?
Tmetafile, безусловно, прозрачен, я протестировал его на простой веб-странице, используя IE с нестандартным цветом фона. Исходный код:
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;
Решение
Если вы проверете официальную документацию MSDN, вы получите это утверждение:http://msdn.microsoft.com/en-us/library/dd183351(vs.85).aspx
Происходит ошибка (и функция возвращает false), если контекст исходного устройства идентифицирует усиленный контекст устройства метафильного.
Мое первое предположение было то, что, даже если MSDN говорит только о контексте исходного устройства, ваш код никогда не будет работать с Alphablend, который предназначен для работы между двумя растровыми картами.
Но после второго расследования существует выделенный тип записи Temralphableend в перечислении Meta -файла Tyles. Так что это должно работать, как и ожидалось.
Что вы используете для отображения метафил? Нам нужен код, который вы используете для отображения метафил здесь.
Мой совет - сохранить ваш метафил в файл EMF, а затем использовать Emfexplorer для проверки его контекста.
Мы разработали блок с открытым исходным кодом, названный Syngdiplus, для рисования мета-файла с использованием GDI+, следовательно, с анти-алиатами, в Pure Delphi. Но мы еще не реализовали тип записи TemralPhableend. Если бы вы нашли интересным, чтобы в вашем приложении было бы интересно, я мог бы взглянуть на его реализацию.