delphi – 如何在表单上绘制透明图像?
发布时间:2020-12-15 04:13:42 所属栏目:大数据 来源:网络整理
导读:我想在Delphi表单上绘制透明图像,但它不起作用. 这是原始的PNG: 我已经在TImage中加载了图像:: Image1.Transparent := True;Form1.Color := clWhite;Form1.TransparentColor := True;Form1.TransparentColorValue := clWhite; 应用程序: 图像不完全透明.
我想在Delphi表单上绘制透明图像,但它不起作用.
这是原始的PNG: 我已经在TImage中加载了图像:: Image1.Transparent := True; Form1.Color := clWhite; Form1.TransparentColor := True; Form1.TransparentColorValue := clWhite; 应用程序: 图像不完全透明. 解决方法
我找到了一个解决方案,可以让你只使用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:UsersAndreas RejbrandSkrivbordRatingCtrl.bmp',IMAGE_BITMAP,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,bm.bmWidth,bm.bmHeight,dc,bf) then RaiseLastOSError; finally DeleteDC(dc); end; finally DeleteObject(hbm); end; end; 使用GIMP,我转换了PNG图像 http://privat.rejbrand.se/RatingCtrl.png 找到here到32位RGBA位图,找到here,结果非常好: http://privat.rejbrand.se/gdiblend1.png (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |