Delphi FireMonkey中TSkLabel组件鼠标悬停时如何更改光标?
实现TSkLabel鼠标悬停更改光标样式的方法
方法一:利用鼠标事件快速实现(无需自定义组件)
这种方法适合单个或少量TSkLabel控件的场景,直接通过控件的鼠标事件处理:
- 在窗体类中添加私有字段保存原光标:
private FPrevCursor: TCursor;
- 为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控件中使用该功能,自定义继承组件是更优雅的方案,步骤如下:
- 创建一个新的单元(比如
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.
- 将该组件安装到Delphi组件面板后,就可以像原生TLabel一样,直接在属性面板设置
Cursor属性,鼠标悬停时自动切换光标样式。
这种方法的优势是完全贴合原生控件的使用逻辑,无需重复编写事件代码,适合大规模使用的场景。
内容的提问来源于stack exchange,提问作者liansa111
相关产品推荐
相关产品推荐

