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

目录
  • 动态切换光标类型
  • 自定义光标

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

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

动态切换光标类型

以白板书写为例:鼠标操作时,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()能强制更新光标。当然,不调用这个更新方法肉眼其实也看不出啥。。。

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

自定义光标

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

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);
    }

也可以通过图片资源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;
        }
    }

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);
    }

到此这篇关于C#实现自定义光标并动态切换的文章就介绍到这了,更多相关C#光标内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C# Form自定义光标的简单实现

    下面是完整的例子,可以通过命令行编译即可看到效果. 复制代码 代码如下: using System;using System.Drawing;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Reflection; namespace ColorCursor{ /// <summary> /// 本例子的作用: 在.NET中实现自定义光标. /// </summary>    p

  • c#使用win32api实现获取光标位置

    方法一:需要调用win32api,winform.wpf通用 [DllImport("user32.dll")] public static extern bool GetCursorPos(out POINT lpPoint); [StructLayout(LayoutKind.Sequential)] public struct POINT { public int X; public int Y; public POINT(int x, int y) { this.X = x;

  • C#实现winform中RichTextBox在指定光标位置插入图片的方法

    本文实例讲述了C#实现winform中RichTextBox在指定光标位置插入图片的方法.分享给大家供大家参考,具体如下: //获取RichTextBox控件中鼠标焦点的索引位置 int startPosition = this.richTextBox1.SelectionStart; //从鼠标焦点处开始选中几个字符 this.richTextBox1.SelectionLength = 2; //清空剪切板,防止里面之前有内容 Clipboard.Clear(); //给剪切板设置图片对象

  • c#获取光标在屏幕中位置的简单实例

    需要调用win32api,winform.wpf通用 代码如下: 复制代码 代码如下: [DllImport("user32.dll")]public static extern bool GetCursorPos(out POINT lpPoint); [StructLayout(LayoutKind.Sequential)]public struct POINT{    public int X;    public int Y;    public POINT(int x, in

  • C#对桌面应用程序自定义鼠标光标

    有的时候,一个自定义的鼠标光标能给你的程序增色不少.本文这里介绍一下如何在.net桌面程序中自定义鼠标光标.由于.net的桌面程序分为WinForm和WPF两种,这里分别介绍一下. WinForm程序 对于WinForm程序,可以通过修改Control.Cursor属性来实现光标的修改,如果我们有光标文件的话,可以直接通过如下代码实现自定义光标: this.Cursor = new Cursor("myCursor.cur"); 但这种方式不是本文介绍的重点,本文主要介绍如何自己绘制光

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

    目录 动态切换光标类型 自定义光标 系统有很多光标类型 :Cursors 类 (System.Windows.Input) | Microsoft Docs 本章介绍如何自定义光标.并动态切换光标类型. 动态切换光标类型 以白板书写为例:鼠标操作时,Cursor为红点:触摸时,Cursor为空: public MainWindow() { InitializeComponent(); MouseEnter += (s, e) => { ShowMouseCursor(e); }; MouseMo

  • SpringBoot 自定义+动态切换数据源教程

    目录 1.添加maven依赖 2.配置application.yml 3.配置动态数据源 4.配置数据源操作Holder 5.读取自定义数据源,并配置 6.动态切换关键--AOP进行切换 7.使用 1).配置mapper 2).配置service 3).单元测试调用 4).测试结果 1.添加maven依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</ar

  • 关于Spring3 + Mybatis3整合时多数据源动态切换的问题

    以前的项目经历中,基本上都是spring + hibernate + Spring JDBC这种组合用的多.至于MyBatis,也就这个项目才开始试用,闲话不多说,进入正题. 以前的这种框架组合中,动态数据源切换可谓已经非常成熟了,网上也有非常多的博客介绍,都是继承AbstractRoutingDataSource,重写determineCurrentLookupKey()方法.具体做法就不在此废话了. 所以当项目中碰到这个问题,我几乎想都没有想,就采用了这种做法,但是一测试,一点反应都没有.当

  • jQuery实现百度登录框的动态切换效果

    点击右下角图片进行状态切换,效果图 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>百度登录框</title> <style type="text/css"> *{margin: 0;padding: 0;} body { font-size: 12px; } a { te

  • Core Animation一些Demo总结 (动态切换图片、大转盘、图片折叠、进度条等动画效果)

    前一篇总结了Core Animation的一些基础知识,这一篇主要是Core Animation 的一些应用,涉及到CAShapeLayer.CAReplicatorLayer等图层的知识. 先看效果图: 1.切换图片: 2.彩票转盘 3.图片折叠 4.进度条旋转 5.粒子效果 一.切换图片 看起来很复杂的动画,通过少量的计算和编码就可以简单的实现.要做到这一步,必须是需要研究iOS开发中的Core Animation和Core Graphics框架的.日常工作中,对于很多东西不求甚解,只是拿过

  • thinkphp3.2.3框架动态切换多数据库的方法分析

    本文实例讲述了thinkphp3.2.3框架动态切换多数据库的方法.分享给大家供大家参考,具体如下: 版本说明: thinkphp3.2.3 新增自定义行为类 文件位置:Application/Common/Behaviors/SwitchDbBehavior.class.php 文件内容: namespace Common\Behaviors; class SwitchDbBehavior { //私有库id,如何连接公有库则设置为share字符串 private $_privateId =

  • vue在线动态切换主题色方案

    主要原理是利用webpack插件webpack-theme-color-replacer提取相关颜色css然后根据配置动态生成替换的css 具体实现步骤如下: 1.添加webpack插件,新建文件webpack/themePlugin.js const ThemeColorReplacer = require('webpack-theme-color-replacer') const forElementUI = require('webpack-theme-color-replacer/for

  • spring boot多数据源动态切换代码实例

    这篇文章主要介绍了spring boot多数据源动态切换代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 当项目中存在多数据源时,就涉及到数据源的动态切换,通过研究,特此记录一下. 1.maven依赖 <!--数据库连接--> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> &

  • Vue + Scss 动态切换主题颜色实现换肤的示例代码

    根据预设的配色方案,在前端实现动态切换系统主题颜色. 大概的思路就是给html根标签设置一个data-theme属性,然后通过js切换data-theme的属性值,Scss根据此属性来判断使用对应主题变量.这里可以选择持久化Vux或接口来保存用户选择的主题. 一.首先需要给项目下载配置Scss 1.安装依赖 npm install node-sass sass-loader --save-dev 2.找到build中webpack.base.conf.js,在rules中添加scss规则 { t

  • mybatis多数据源动态切换的完整步骤

    笔者主要从事c#开发,近期因为项目需要,搭建了一套spring-cloud微服务框架,集成了eureka服务注册中心. gateway网关过滤.admin服务监控.auth授权体系验证,集成了redis.swagger.jwt.mybatis多数据源等各项功能. 具体搭建过程后续另写播客介绍.具体结构如下: 在搭建过程集成mybatis的时候,考虑到单一数据源无法满足实际业务需要,故结合c#的开发经验,进行多数据源动态集成. mybatis的多数据源可以采用两种方式进行,第一种是分包方式实现,这

随机推荐