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

Delphi FireMonkey中TSkLabel组件鼠标悬停时如何更改光标?

实现TSkLabel鼠标悬停更改光标样式的方法

方法一:利用鼠标事件快速实现(无需自定义组件)

这种方法适合单个或少量TSkLabel控件的场景,直接通过控件的鼠标事件处理:

  1. 在窗体类中添加私有字段保存原光标:
private
  FPrevCursor: TCursor;
  1. 为TSkLabel绑定OnMouseEnter和OnMouseLeave事件:
procedure TForm1.SkLabel1MouseEnter(Sender: TObject);
begin
  FPrevCursor := Screen.Cursor;
  Screen.Cursor := crHandPoint; // 替换为你需要的光标样式,比如crArrow、crCross等
end;

procedure TForm1.SkLabel1MouseLeave(Sender: TObject);
begin
  Screen.Cursor := FPrevCursor;
end;

注意:如果多个控件都使用这种方式,建议每个控件单独保存原光标,避免光标状态冲突。

方法二:自定义带Cursor属性的TSkLabel(复用性更高)

如果需要在多个TSkLabel控件中使用该功能,自定义继承组件是更优雅的方案,步骤如下:

  1. 创建一个新的单元(比如SkLabelEx.pas),编写以下代码:
unit SkLabelEx;

interface

uses
  Skia, Skia.Vcl, Messages;

type
  TSkLabelEx = class(TSkLabel)
  private
    FCursor: TCursor;
    procedure WMSetCursor(var Message: TWMSetCursor); message WM_SETCURSOR;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property Cursor: TCursor read FCursor write FCursor default crDefault;
  end;

implementation

{ TSkLabelEx }

constructor TSkLabelEx.Create(AOwner: TComponent);
begin
  inherited;
  FCursor := crDefault;
end;

procedure TSkLabelEx.WMSetCursor(var Message: TWMSetCursor);
begin
  inherited;
  if FCursor <> crDefault then
  begin
    Screen.Cursor := FCursor;
    Message.Result := 1; // 告知系统已处理光标设置
  end;
end;

end.
  1. 将该组件安装到Delphi组件面板后,就可以像原生TLabel一样,直接在属性面板设置Cursor属性,鼠标悬停时自动切换光标样式。

这种方法的优势是完全贴合原生控件的使用逻辑,无需重复编写事件代码,适合大规模使用的场景。


内容的提问来源于stack exchange,提问作者liansa111

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 09:22:09