You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi技术问题:如何在TImage控件上显示.cur光标文件

在Delphi中加载.cur光标文件并在TImage控件显示为图像

问题分析

你尝试用TIcon加载.cur资源后直接转换为TBitmap或赋值给TImage的方法无效,核心原因是TIcon对光标文件的处理和标准位图不兼容,直接赋值会丢失光标颜色/掩码数据;而直接绘制到Image画布时,可能因画布未正确初始化导致无显示。

解决方案

通过Windows API直接加载光标句柄,绘制到初始化好的TBitmap中,再将位图赋值给TImage,以下是两种可靠实现:

方法1:加载系统默认尺寸的光标

适用于使用系统标准光标尺寸(通常32x32)的场景:

var
  hCursor: HCURSOR;
  bmp: TBitmap;
begin
  // 从资源加载光标(spy_cur为资源名称)
  hCursor := LoadCursor(HInstance, 'spy_cur');
  if hCursor = 0 then Exit;

  bmp := TBitmap.Create;
  try
    // 设置位图尺寸为系统光标默认大小
    bmp.Width := GetSystemMetrics(SM_CXCURSOR);
    bmp.Height := GetSystemMetrics(SM_CYCURSOR);
    
    // 填充背景色(可根据需求修改,比如clBtnFace)
    bmp.Canvas.Brush.Color := clWhite;
    bmp.Canvas.FillRect(Rect(0, 0, bmp.Width, bmp.Height));
    
    // 将光标绘制到位图
    DrawIconEx(bmp.Canvas.Handle, 0, 0, hCursor, bmp.Width, bmp.Height, 0, 0, DI_NORMAL);
    
    // 赋值给TImage
    Image2.Picture.Bitmap.Assign(bmp);
  finally
    bmp.Free;
    // 注意:LoadCursor加载的资源光标句柄无需手动销毁,由系统管理
  end;
end;

方法2:获取光标真实尺寸并绘制

如果你的.cur文件是自定义尺寸(非32x32),需要先获取光标实际大小再绘制:

var
  hCursor: HCURSOR;
  iconInfo: TIconInfo;
  bmpInfo: TBitmapInfoHeader;
  bmp: TBitmap;
begin
  hCursor := LoadCursor(HInstance, 'spy_cur');
  if hCursor = 0 then Exit;

  if GetIconInfo(hCursor, iconInfo) then
  begin
    try
      // 获取光标颜色位图的信息
      GetObject(iconInfo.hbmColor, SizeOf(TBitmapInfoHeader), @bmpInfo);
      
      bmp := TBitmap.Create;
      try
        // 设置位图为光标真实尺寸
        bmp.Width := bmpInfo.biWidth;
        bmp.Height := Abs(bmpInfo.biHeight);
        
        bmp.Canvas.Brush.Color := clWhite;
        bmp.Canvas.FillRect(Rect(0, 0, bmp.Width, bmp.Height));
        
        DrawIconEx(bmp.Canvas.Handle, 0, 0, hCursor, bmp.Width, bmp.Height, 0, 0, DI_NORMAL);
        
        Image2.Picture.Bitmap.Assign(bmp);
      finally
        bmp.Free;
      end;
    finally
      // 释放GetIconInfo返回的临时位图句柄
      DeleteObject(iconInfo.hbmColor);
      DeleteObject(iconInfo.hbmMask);
    end;
  end;
end;

额外说明

  • 如果是加载外部.cur文件(而非资源),将LoadCursor替换为LoadCursorFromFile('路径\xxx.cur'),此时需要在使用完光标句柄后调用DestroyCursor(hCursor)释放资源。
  • 若需要显示光标热点,可以在绘制后用Canvas画一个小标记(比如红色点),热点坐标可从TIconInfo.xHotspot和TIconInfo.yHotspot获取。

内容的提问来源于stack exchange,提问作者陈发条

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:58:39