在Delphi中生成带透明的光标

本文介绍了一种通过Delphi中的TBitmap和TGraphic对象来创建自定义Windows光标的方法。详细展示了如何利用颜色键(color key)生成掩膜,并通过具体的函数实现将位图转换为光标资源。此外还提供了一个示例程序,演示了如何加载位图文件并将其设置为当前窗体的光标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//默认颜色贱值是粉红色
//color_key,用于生成mask的,因为只有bitmap才能生成mask,color_key表示透明部分以什么颜色代替
function CreateCursorByGraphic(bm:TGraphic ; const hotx,hoty : Integer;
                               const color_key : TColor = TColor($FF00FF)):HCursor;
var
  IconSizeX : integer;
  IconSizeY : integer;
  AndMask : TBitmap;
  OrMask  : TBitmap;
  IconInfo : TIconInfo;
  myrc     : TRect;
begin
  AndMask := TBitmap.Create;
  OrMask := TBitmap.Create;
  try
    IconSizeX := bm.Width;
    IconSizeY := bm.Height;
    AndMask.Width := IconSizeX;
    AndMask.Height := IconSizeY;
    OrMask.Width := IconSizeX;
    OrMask.Height := IconSizeY;
    myrc := RECT (0,0,IconSizeX,IconSizeY);

    //make mask,为什么要这么麻烦,而不直接使用mask呢?这是为了保证本身有透明的图形也能支持
    AndMask.Canvas.Brush.Color := color_key;
    AndMask.Canvas.FillRect (myrc);
    AndMask.Canvas.Draw( 0,0,bm );
    AndMask.Mask( color_key );  //制做出来的Mask,只有黑白两色


    //make 'or operation' draw
    OrMask.Canvas.Brush.Color := clBlack;
    OrMask.Canvas.FillRect (myrc);
    OrMask.Canvas.Draw(0,0,bm);

    //生成光标ICON
    IconInfo.fIcon := False;
    IconInfo.xHotspot := -hotx;
    IconInfo.yHotspot := hoty;
    IconInfo.hbmMask := AndMask.Handle;//bmp.Handle;//AndMask.Handle;
    IconInfo.hbmColor := OrMask.Handle;

    Result:= CreateIconIndirect(IconInfo);
  finally
    AndMask.Free;
    OrMask.Free;
  end;
end;

//从普通的BMP中生成光标
function CreateCursorByBitmap (bm : TBitmap;const hotx,hoty : Integer; const color_key : TColor = TColor($FF00FF)):HCursor;
var
  old_color : TColor;
  old_trans : Boolean;
begin
  old_color := bm.TransparentColor;
  old_trans := bm.Transparent;
  bm.TransparentColor := color_key;
  bm.Transparent := true;
  try
    Result := CreateCursorByGraphic (bm,hotx,hoty,color_key);
  finally
    bm.TransparentColor := old_color;
    bm.Transparent := old_trans;
  end;
end; 

 

 

//测试代码

var
  b1 : TBitmap;
begin
  b1 := TBitmap.Create;
  try
    b1.LoadFromFile( 'Popo.bmp' );
    cursor := CreateCursorByBitmap (b1,0,0);
    screen.Cursors[10] := cursor;
    Form1.Cursor := 10;

finally
    b1.Free;
end;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值