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,提问作者陈发条
相关产品推荐
相关产品推荐

