C# 自定义并动态切换光标
系统有很多光标类型 :Cursors 类 (System.Windows.Input) | Microsoft Docs
本章介绍如何自定义光标、并动态切换光标类型。
动态切换光标类型
以白板书写为例:鼠标操作时,Cursor为红点;触摸时,Cursor为空;
1 public MainWindow()
2 {
3 InitializeComponent();
4 MouseEnter += (s, e) =>
5 {
6 ShowMouseCursor(e);
7 };
8 MouseMove += (s, e) =>
9 {
10 ShowMouseCursor(e);
11 };
12 StylusMove += (s, e) =>
13 {
14 ShowNoneCursor();
15 };
16 }
设置光标显示:
1 private void ShowNoneCursor()
2 {
3 if (Cursor == Cursors.None)
4 {
5 return;
6 }
7 Cursor = Cursors.None;
8 Mouse.UpdateCursor();
9 }
10 private void ShowMouseCursor(MouseEventArgs e)
11 {
12 if (e.StylusDevice != null && e.StylusDevice.Id > -1)
13 {
14 return;
15 }
16 if (Cursor == GetFillCursor())
17 {
18 return;
19 }
20 Cursor = GetFillCursor();
21 Mouse.UpdateCursor();
22 }
23 private Cursor _fillCursor = null;
24 private Cursor GetFillCursor()
25 {
26 return _fillCursor ?? (_fillCursor = CursorHelper.CreateFillCursor());
27 }
触摸书写时,会有个默认光标,所以此处把触摸时的光标置空Cursors.None。
Mouse.UpdateCursor()能强制更新光标。当然,不调用这个更新方法肉眼其实也看不出啥。。。

光标切换效果如上,前面一段是用鼠标书写,后面是触摸书写,光标类型有切换。红点光标自定义方案见下方。
自定义光标
自定义一个纯色的圆形光标:
1 public static Cursor CreateFillCursor(int size = 24, Brush fillBrush = null)
2 {
3 int unitSize = size / 4;
4 var bmp = new Bitmap(size, size);
5 using (Graphics g = Graphics.FromImage(bmp))
6 {
7 g.Clip = new Region(new Rectangle(0, 0, size, size));
8 g.SmoothingMode = SmoothingMode.HighQuality;
9 g.InterpolationMode = InterpolationMode.HighQualityBicubic;
10 using (var pen = new Pen(fillBrush ?? Brushes.Red, unitSize))
11 {
12
13 g.DrawEllipse(pen, new Rectangle(unitSize, unitSize, unitSize, unitSize));
14 }
15 }
16 return BitmapCursor.CreateBmpCursor(bmp);
17 }
也可以通过图片资源BitmapSource来生成光标:
1 public static Cursor CreateFromBitmapSource(BitmapSource source)
2 {
3 var bitmap = BitmapSourceToBitmap(source);
4 return BitmapCursor.CreateBmpCursor(bitmap);
5 }
6 private static Bitmap BitmapSourceToBitmap(BitmapSource source)
7 {
8 using (var stream = new MemoryStream())
9 {
10 var e = new BmpBitmapEncoder();
11 e.Frames.Add(BitmapFrame.Create(source));
12 e.Save(stream);
13
14 var bmp = new Bitmap(stream);
15
16 return bmp;
17 }
18 }
BitmapCursor:

1 internal class BitmapCursor : SafeHandle
2 {
3 public override bool IsInvalid => handle == (IntPtr)(-1);
4
5 public static Cursor CreateBmpCursor(Bitmap cursorBitmap)
6 {
7
8 var c = new BitmapCursor(cursorBitmap);
9
10 return CursorInteropHelper.Create(c);
11 }
12 protected BitmapCursor(Bitmap cursorBitmap)
13 : base((IntPtr)(-1), true)
14 {
15 handle = cursorBitmap.GetHicon();
16 }
17 protected override bool ReleaseHandle()
18 {
19 bool result = DestroyIcon(handle);
20
21 handle = (IntPtr)(-1);
22
23 return result;
24 }
25 [DllImport("user32")]
26 private static extern bool DestroyIcon(IntPtr hIcon);
27 }
博客参考:
C# 自定义并动态切换光标的更多相关文章
- springboot多数据源动态切换和自定义mybatis分页插件
1.配置多数据源 增加druid依赖 完整pom文件 数据源配置文件 route.datasource.driver-class-name= com.mysql.jdbc.Driver route.d ...
- springAOP实现基于注解的数据源动态切换
需求 代码实现读写数据库分离 武器 spring3.0以上版本 实现思路 1.继承org.springframework.jdbc.datasource.lookup.AbstractRoutingD ...
- Spring3 整合Hibernate3.5 动态切换SessionFactory (切换数据库方言)
一.缘由 上一篇文章Spring3.3 整合 Hibernate3.MyBatis3.2 配置多数据源/动态切换数据源 方法介绍到了怎么样在Sping.MyBatis.Hibernate整合的应用中动 ...
- Spring3.3 整合 Hibernate3、MyBatis3.2 配置多数据源/动态切换数据源 方法
一.开篇 这里整合分别采用了Hibernate和MyBatis两大持久层框架,Hibernate主要完成增删改功能和一些单一的对象查询功能,MyBatis主要负责查询功能.所以在出来数据库方言的时候基 ...
- Spring动态切换多数据源解决方案
Spring动态配置多数据源,即在大型应用中对数据进行切分,并且采用多个数据库实例进行管理,这样可以有效提高系统的水平伸缩性.而这样的方案就会不同于常见的单一数据实例的方案,这就要程序在运行时根据当时 ...
- SpringBoot 动态切换多数据源
1. 配置文件application-dev.properties 2. 动态切换数据源核心 A. 数据源注册器 B. 动态数据源适配器 C. 自定义注解 D. 动态数据源切面 E. 数据源路 ...
- springboot 双数据源+aop动态切换
# springboot-double-dataspringboot-double-data 应用场景 项目需要同时连接两个不同的数据库A, B,并且它们都为主从架构,一台写库,多台读库. 多数据源 ...
- 【原】通过AOP实现MyBatis多数据源的动态切换
[环境参数]1.开发框架:Spring + SpringMVC + MyBatis 2.数据库A的URL:jdbc.url=jdbc:mysql://172.16.17.164:3306/ test? ...
- ExtJS动态切换主题
ExtJS动态切换主题 在Sencha Cmd构建的Ext程序中怎么去动态切换主题,目前看好像只能单一切换,但是在官网文档找到了答案 Resource Management在上一节通过 ...
随机推荐
- mysql数据库备份(windows环境)
备份:cmd输入指令,按照新数据库的字符集去备份,备份等待即可: 恢复:之前新建数据库,注意字符集问题,输入指令还原即可:
- 用猿大师的VLC播放插件在高版本Chrome播放RTSP视频流,并抓图、录像、回放、倍速等
因为项目上需要把海康威视摄像头集成到WEB网页中播放,于是开始了对WEB播放摄像头方案的各种折腾. 2015年之前还可以用VLC原生播放器在Chrome.Firefox等浏览器中直接播放,延迟比较低, ...
- Old ST-LINK firmware detected.do you want to upgrade it?升级固件
一段时间没有使用st-link烧写程序了.打开keil5准备把程序烧写到stm32板子上时,报错Old ST-LINK firmware detected.do you want to upgrade ...
- msfvenom的使用
msfvenom也只metasploit中的一个很强的工具,msfvenom生成木马非常的迅速可以各种版本的木马 该工具由msfpaylod和msfencodes的组成 生成木马是需要在本地监听,等待 ...
- Android笔记--常用布局
线性布局--LinearLayout 线性布局的方向 orientation属性值:若为horizontal,内部视图在水平方向从左往右排列 若为vertical,内部视图在垂直方向从上往下排列 如果 ...
- 基于机器学习的语音编解码器声网Agora Silver:支持超低码率下的高音质语音互动
从 1860 年电话发明,到现如今通过网络进行语音互动,语音始终是最自然.最基础的实时互动方式.过去几年,语音实时互动成为越来越多人日常生活的一部分.但是每个人都会遇到弱网环境,这会直接影响语音通话体 ...
- SpringBoot——自定义自动配置与起步依赖
SpringBoot--自定义自动配置与起步依赖 SpringBoot为我们提供了灵活强大的自动配置与起步依赖功能,接下来我们参考其实现原理,实现专属于我们自己的自动配置与起步依赖. 不仅如此,我们对 ...
- MySQL 主从复制的问题及解决方案
更多内容,前往 IT-BLOG 复制功能是构建 MySQL 的大规模.高性能的基础,也就是所谓的 "水平扩展" 架构.我们可以通过为服务器配置一个或多个备库.同时,复制也是高可用性 ...
- 循序渐进讲解负载均衡vivoGateway(VGW)
作者:vivo 互联网运维团队- Duan Chengping 在大规模业务场景中,已经不可能通过单机提供业务,这就衍生出了负载均衡的需求.为了满足合适可靠的负载,本文将从简单的基础需求出发,一步步推 ...
- 记一次 .NET 某传感器采集系统 线程爆高分析
一:背景 1. 讲故事 前段时间有位朋友微信找到我,说他的程序使用 hsl 库之后,采集 plc 时内存溢出,让我帮忙看一下怎么回事,哈哈,貌似是分析之旅中的第二次和 hsl 打交道,既然找到我,那就 ...