Delphi中GDI+和ImageList使用的正确姿势

GDI+DrawImage只能传入TGPImage, 因此最初想到的是从ImageList中得到Image, 然后存储为流,再转换为TGPImage,然后显示。

 

function drawImageList(graphics: TGPGraphics;

paraImageList: TImageList; paraIndex: Itneger; paraRect: TGPRectF)

var

  l_gpImage: TGPImage;
  l_icon: TIcon;
  l_bitmap: TBitmap;
  l_memStream: TMemoryStream;
  stream: TStreamAdapter;

begin

  l_icon:= TIcon.Create;
  l_bitmap:= TBitmap.Create;
  l_bitmap.PixelFormat := pf32bit;
  l_bitmap.AlphaFormat := afDefined;


  
  l_memStream:= TMemoryStream.Create;
  try
    paraImageList.GetIcon(paraIndex, l_icon);


    paraImageList.DrawingStyle:= dsTransparent;
    paraImageList.GetBitmap(paraIndex, l_bitmap);


    l_rect.X:= paraRect.X + (paraRect.Width - l_rect.Width) / 2;
    l_rect.Y:= paraRect.Y + (paraRect.Height - l_rect.Height) / 2 ;


    //l_icon.SaveToStream(l_memStream);
    l_bitmap.SaveToStream(l_memStream);


    
    l_memStream.Position:= 0;
    stream:= TStreamAdapter.Create(l_memStream);
    l_gpImage:= TGPImage.Create(stream);


    graphics.DrawImage(l_gpImage, l_rect);

end;

 

问题来了,这样画出的图片不是透明背景的。

如果要画透明背景 可以是用ImageList.GetIcon.

但这种方法的问题是,画出来的图,是模糊的。

 

另一种方式是不适用Gpgraphics, 而是直接用ImageList.Draw在画布上化。但和GDI+的方式不同一。

 

最终使用Windows的方法利用GPGraphics.hdc 相对完美实现。

procedure DrawImageListImage(graphics: TGPGraphics;
  paraImageList: TcxImageList; paraIndex: Integer; paraRect: TGPRectF);
var
 
  dc: HDC;
  X, Y: integer;
begin


  if (paraIndex >= 0) and (paraIndex < paraImageList.Count) then
  begin
    dc:= graphics.GetHDC;


    try
      X:= round(paraRect.x +(paraRect.Width - paraImageList.Width)/2);
      Y:= round(paraRect.Y +(paraRect.Height - paraImageList.Height)/2);
      ImageList_DrawEx(paraImageList.Handle, paraIndex, dc,
                        X, Y, paraImageList.Width, paraImageList.Height,
                        CLR_NONE, CLR_DEFAULT,
                        ILD_TRANSPARENT);


    finally


    end;
  end;

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值