C# 自定义并动态切换光标

本文经原作者授权以原创方式二次分享,欢迎转载、分享。

原文作者:唐宋元明清的博客

原文地址:https://www.cnblogs.com/kybs0/p/14873136.html

系统有很多光标类型 :Cursors 类 (System.Windows.Input) | Microsoft Docs[1]

本章介绍如何自定义光标、并动态切换光标类型。

动态切换光标类型

  • 以白板书写为例:

    • 鼠标操作时Cursor为红点;

    • 触摸时Cursor为空;

public MainWindow(){InitializeComponent();MouseEnter += (s, e) =>{ShowMouseCursor(e);};MouseMove += (s, e) =>{ShowMouseCursor(e);};StylusMove += (s, e) =>{ShowNoneCursor();};}
  • 设置光标显示;

private void ShowNoneCursor(){if (Cursor == Cursors.None){return;}Cursor = Cursors.None;Mouse.UpdateCursor();}private void ShowMouseCursor(MouseEventArgs e){if (e.StylusDevice != null && e.StylusDevice.Id > -1){return;}if (Cursor == GetFillCursor()){return;}Cursor = GetFillCursor();Mouse.UpdateCursor();}private Cursor _fillCursor = null;private Cursor GetFillCursor(){return _fillCursor ?? (_fillCursor = CursorHelper.CreateFillCursor());}

触摸书写时,会有个默认光标,所以此处把触摸时的光标置空Cursors.None;

Mouse.UpdateCursor()能强制更新光标。当然,不调用这个更新方法肉眼其实也看不出啥。。。

7b5645392a6dc5c9096d8a79b7471afa.gif

光标切换效果如上,前面一段是用鼠标书写,后面是触摸书写,光标类型有切换。红点光标自定义方案见下方。

 自定义光标1)自定义一个纯色的圆形光标

public static Cursor CreateFillCursor(int size = 24, Brush fillBrush = null){int unitSize = size / 4;var bmp = new Bitmap(size, size);using (Graphics g = Graphics.FromImage(bmp)){g.Clip = new Region(new Rectangle(0, 0, size, size));g.SmoothingMode = SmoothingMode.HighQuality;g.InterpolationMode = InterpolationMode.HighQualityBicubic;using (var pen = new Pen(fillBrush ?? Brushes.Red, unitSize)){g.DrawEllipse(pen, new Rectangle(unitSize, unitSize, unitSize, unitSize));}}return BitmapCursor.CreateBmpCursor(bmp);}

2)也可以通过图片资源BitmapSource来生成光标;

public static Cursor CreateFromBitmapSource(BitmapSource source){var bitmap = BitmapSourceToBitmap(source);return BitmapCursor.CreateBmpCursor(bitmap);}private static Bitmap BitmapSourceToBitmap(BitmapSource source){using (var stream = new MemoryStream()){var e = new BmpBitmapEncoder();e.Frames.Add(BitmapFrame.Create(source));e.Save(stream);var bmp = new Bitmap(stream);return bmp;}}

2)BitmapCursor类;

internal class BitmapCursor : SafeHandle{public override bool IsInvalid => handle == (IntPtr)(-1);public static Cursor CreateBmpCursor(Bitmap cursorBitmap){var c = new BitmapCursor(cursorBitmap);return CursorInteropHelper.Create(c);}protected BitmapCursor(Bitmap cursorBitmap): base((IntPtr)(-1), true){handle = cursorBitmap.GetHicon();}protected override bool ReleaseHandle(){bool result = DestroyIcon(handle);handle = (IntPtr)(-1);return result;}[DllImport("user32")]private static extern bool DestroyIcon(IntPtr hIcon);}

参考资料:
WPF 自定义鼠标光标 - DH_青叶 - 博客园[2]
[WPF]自定义鼠标指针 - 周银辉 - 博客园[3]

参考资料

[1]

Cursors 类 (System.Windows.Input) | Microsoft Docs: https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.input.cursors?view=net-5.0

[2]

WPF 自定义鼠标光标 - DH_青叶 - 博客园: https://www.cnblogs.com/dhqy/p/7754176.html

[3]

[WPF]自定义鼠标指针 - 周银辉 - 博客园: https://www.cnblogs.com/zhouyinhui/archive/2010/05/28/1746502.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频播放器for android

写在前面 好久没有写博客了, 中间忙了一堆杂七杂八的事情...工作, 情感, 未来, 人生... 下面是正文 一直要写一个视频播放器, 好练练手. 这个app, 从年前写到现在, 终于算弄出了样子, 0.0版本. (不得不说, googleVPN值得拥有, android developer网站, android sdk samples, sta…

简单粗暴无需拼接下载 blob (ts)视频文件

网上很多视频采用blob来播放视频&#xff0c;查看源码会发现video的src为形如 &#xff1a; src"blob:https://*/f2880c6a-c2c5-4146-96b2-944ae555b76a" <video id"" class"" preload"auto" playsinline"playsinline"…

Shell重定向

Liunx下系统打开的3个文件&#xff0c;即标准输入、标注输出和标准错误输出。用户的shell将键盘设为默认的标准输入&#xff0c;默认的标准输入和标准错误输出为屏幕。也就是说&#xff0c;用户从键盘输入命令&#xff0c;然后将结果和错误消息输入到屏幕所谓的重定向&#xff…

【CASS精品教程】CASS 9.2 for AutoCAD2014启动提示文件加载,怎么处理?

CASS9.2在安装完后,首次启动会提示如下图样提示,应该如何处理?请看以下步骤: 解决步骤: 1、安装完CASS9.2_2014后,首次启动CASS92,会出现如下图所示提示。选择“不加载”。 2、进入AutoCAD系统配置—系统页面 打开系统页面菜单 系统界面截图

VS2015不能修改安装路径问题

能修改安装路径&#xff0c;固态硬盘空间太小&#xff0c;所以不能装在C盘啊。 其中&#xff0c;原因是以前安装过VS2015没有卸载干净&#xff0c;解决方法是&#xff1a;下载Visual Studio Uninstaller卸载完全&#xff08;要以管理员运行哈&#xff09; 下载地址&#xff1a;…

python 绘制分形树

# -*- coding: utf8 -*- """ 绘制分形树 """ import turtledeflection_angle 20 # 树枝与树干夹角 trunk_min_length 5 # 树干最小长度 trunk_step_length 10 # 树干每次递减长度 trunk_length 80 # 初…

像JAVA一样流畅调试C#源代码?

起因最近在研究ServiceScope的内一些内在运行逻辑,发现相关资料非常少&#xff0c;只有讲IOC相关的文章有说Core时代的官方依赖注入怎么使用。。遂决定还是要去看源代码。这部分源代码在Microsoft.Extensions.DependencyInjection库中&#xff0c;源代码位置在src/libraries[1]…

物化视图VS普通视图

2019独角兽企业重金招聘Python工程师标准>>> 物化视图是一种特殊的物理表&#xff0c;“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表&#xff0c;应用的局限性大&#xff0c;任何对视图的查询&#xff0c;Oracle都实际上转换为视图SQL语句的查…

EditPlust 批量添加自定义工具

先将插件文件***.js文件放到指定目录&#xff0c;比如editplus的安装下新文件夹tools。 &#xff08;下载地址见文末&#xff09; 将下列代码内容另存为tool_u.ini 文件&#xff08;不能改名&#xff09;&#xff0c; 放到EditPlus 的ini文件目录 &#xff08;工具-设置目录 可…

iOS c语言 基本运算符

2019独角兽企业重金招聘Python工程师标准>>> iOS_06_基本运算符 一、算术运算 c语言一共有34种运算符&#xff0c;包括了常见的加减乘除 1.加法运算 # 除了能做加法运算&#xff0c;还能表示正号&#xff1a;5、90 2.减法运算- # 除了能做减法运算&#xff0c;还能表…

Maui学习之路(三)--Winui3深入探讨

Maui的学习之路 --- Winui3深入探讨学习Maui已经有一段时间&#xff0c;随着不断地深入&#xff0c;对Maui有了一些初步的了解。我们都知道Maui为了保持平台原生特性&#xff0c;所以在每一个平台都使用了平台自身的原生开发框架&#xff0c;如在Windows系统使用了Winui3作为UI…

centos 7.1 apache 源码编译安装

Apache编译安装 一&#xff0c;需要软件&#xff1a; http://mirrors.cnnic.cn/apache//apr/apr-1.5.2.tar.gz 1.apr-1.5.2.tar.gz http://mirrors.cnnic.cn/apache//apr/apr-util-1.5.4.tar.gz 2.apr-util-1.5.4.tar.gz http://exim.mirror.fr/pcre/pcre-8.38.tar.gz 3.pcre-8…

通过两级网关设计来路由服务网格流量

编者的话本文是来自笔者的公司 Tetrate[1] 工程师 Petr McAllister 的分享&#xff0c;Tetrate 的拳头产品是 Tetrate Service Bridge[2]&#xff08;下文简称 TSB&#xff09;&#xff0c;它是在开源的 Istio 和 Envoy 基础上构建的&#xff0c;但为其增加了管理平面。简介Tet…

H5开发中常用的js方法

2019独角兽企业重金招聘Python工程师标准>>> h5和app之间的webview交互 这是常用的交互方法之一&#xff0c;iOS可以使用WKWebView,安卓可以使用JsBridge,完成常见的交互效果。function webViewHandler(iosCallback, adrCallback) {if (getMobileOperatingSystem() …

GPS RTK(银河1)基准站架设、移动站设置完整操作流程

本文讲解GPS RTK(银河1)基站架设完整操作流程,包括相对坐标、点校正等操作。 文章目录 一、架设基准站二、启动基准站三、架设移动站四、设置移动站一、架设基准站 基准站一定要架设在视野比较开阔,周围环境比较空旷的地方,地势比较高的地方;避免架在高压输变电设备附近…

在.NET 6.0上使用Kestrel配置和自定义HTTPS

本章是《定制ASP NET 6.0框架系列文章》的第四篇。在本章&#xff0c;我们将学习ASP.NET Core的Kestrel配置和自定义HTTPS&#xff0c;好我们开始正文。在ASP.NET Core中&#xff0c;默认情况下HTTPS处于打开状态&#xff0c;这个不是问题&#xff0c;我们无需禁用它。因为如果…

Virtualbox安装增强工具失败

在安装Virtualbox增强工具安装时出现unable to find the sources of your current Linux kernel&#xff0c;安装失败&#xff0c;导致主机与虚拟机之间不能共享文件夹&#xff0c;不能复制粘贴&#xff0c;鼠标也不能直接移动到物理机&#xff0c;需要按快捷键才行。 解决办法…

C语言试题118之求1到20的每个数的阶层之和

✅作者简介:大家好我是码莎拉蒂,CSDN博客专家🥇🥇🥇 📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进入网站 1、题目 题目:求 1+2!+3!+…+20!的和 分析:此程序只是把累加变成了累乘。 2 、温馨提示 想获取更多…

java.lang.NoSuchFieldError: EMPTY_ORDERED_ITERATOR起因及解决办法

java.lang.NoSuchFieldError: EMPTY_ORDERED_ITERATOR 最近这个错误遇到了好多次&#xff0c;不过都很轻松的解决了&#xff0c;问题的起因是多了一个collection包&#xff0c;如下图 看到了&#xff0c;只要把其中的一个删除掉&#xff0c;更新启动Tomcat就行了。 本文转自suc…

[转]EL函数、自定义EL函数、自定义标签

EL函数 1、EL函数的作用&#xff1a;操作字符串 2、在JSP页面中要引入EL函数库 <% taglib prefix"fn" uri"http://java.sun.com/jsp/jstl/functions" %> 3、语法 ${ fn:方法名(参数) } 4、实例 <% page language"java" contentTyp…