如何在表单上绘制透明图像?

Lit*_*per 5 delphi transparency alphablending delphi-7

我想在Delphi表单上绘制透明图像,但它不起作用.

这是原始的PNG:
透明边框

我已经在TImage中加载了图像::

Image1.Transparent := True;
Form1.Color := clWhite;
Form1.TransparentColor := True;
Form1.TransparentColorValue := clWhite;
Run Code Online (Sandbox Code Playgroud)

的TImage

应用程序:
应用


图像不完全透明.
图像可以通过任何控件或仅通过画布绘制.
我想使用BMP图像.
也许我做错了什么?
请帮忙!

And*_*and 11

我找到了一个解决方案,可以让你只使用Windows API将带有alpha通道的BMP图像绘制到表单上:

const
  AC_SRC_OVER = 0;
  AC_SRC_ALPHA = 1;

type
  BLENDFUNCTION = packed record
    BlendOp,
    BlendFlags,
    SourceConstantAlpha,
    AlphaFormat: byte;
  end;

function WinAlphaBlend(hdcDest: HDC; xoriginDest, yoriginDest, wDest, hDest: integer;
  hdcSrc: HDC; xoriginSrc, yoriginSrc, wSrc, hSrc: integer; ftn: BLENDFUNCTION): LongBool;
  stdcall; external 'Msimg32.dll' name 'AlphaBlend';

procedure TForm4.FormClick(Sender: TObject);
var
  hbm: HBITMAP;
  bm: BITMAP;
  bf: BLENDFUNCTION;
  dc: HDC;
begin
  hbm := LoadImage(0,
    'C:\Users\Andreas Rejbrand\Skrivbord\RatingCtrl.bmp',
    IMAGE_BITMAP,
    0,
    0,
    LR_LOADFROMFILE);
  if hbm = 0 then
    RaiseLastOSError;
  try
    if GetObject(hbm, sizeof(bm), @bm) = 0 then RaiseLastOSError;
    dc := CreateCompatibleDC(0);
    if dc = 0 then RaiseLastOSError;
    try
      if SelectObject(dc, hbm) = 0 then RaiseLastOSError;
      bf.BlendOp := AC_SRC_OVER;
      bf.BlendFlags := 0;
      bf.SourceConstantAlpha := 255;
      bf.AlphaFormat := AC_SRC_ALPHA;
      if not WinAlphaBlend(Canvas.Handle,
        10,
        10,
        bm.bmWidth,
        bm.bmHeight,
        dc,
        0,
        0,
        bm.bmWidth,
        bm.bmHeight,
        bf) then RaiseLastOSError;
    finally
      DeleteDC(dc);
    end;
  finally
    DeleteObject(hbm);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

使用GIMP,我转换了PNG图像

http://privat.rejbrand.se/RatingCtrl.png

这里找到一个32位RGBA位图,在这里找到,结果非常好:

http://privat.rejbrand.se/gdiblend1.png http://privat.rejbrand.se/gdiblend2.png http://privat.rejbrand.se/gdiblend3.png

  • 太好了!顺便说一句,你的代码使用常规的gdi函数声明,即`windows.AlphaBlend()`,不需要声明常量,记录和函数. (4认同)