• CSharp如何自定义鼠标样式


    一.如何设置鼠标样式?

    在CSharp的WinForm开发中,可以通过下面的API设置鼠标样式:

    1 //把鼠标样式设置为十字(系统自带的一种鼠标样式)
    2 this.Cursor = Cursors.Cross;
    3 //把鼠标样式设置为自定义图片
    4 this.Cursor = new Cursor(string fileName);//要求file为cur格式
    5 this.Cursor = new Cursor(IntPtr handel);
    6 this.Cursor = new Cursor(System.IO.Stream stream);
    7 this.Cursor = new Cursor(Type type, string resource);
    View Code

    如果系统提供的鼠标样式不能满足需求,那么势必要把指定的图片作为鼠标样式,项目的资源文件一般是png/jpg/bmp等普通图片格式,而API却需要一个cur格式的图片资源作为参数。。。

    当然,去找一个在线转换工具处理一下也不麻烦,但资源文件的每一次变更都要重新做一次处理,这是我们所无法接受的,而且有的目标文件甚至是动态生成的,根本无法得到一个确定的cur文件,所以我们有理由去寻找一种用普通图片来设置鼠标样式的方法

    二.如何用png文件设置鼠标样式?

    搜索一下,很容易得到下面的可用代码:(先别着急copy,下面代码有Bug

     1         public void SetCursor(Bitmap cursor, Point hotPoint)
     2         {
     3             int hotX = hotPoint.X;
     4             int hotY = hotPoint.Y;
     5             Bitmap myNewCursor = new Bitmap(cursor.Width * 2 - hotX, cursor.Height * 2 - hotY);
     6             Graphics g = Graphics.FromImage(myNewCursor);
     7             g.Clear(Color.FromArgb(0, 0, 0, 0));
     8             g.DrawImage(cursor, cursor.Width - hotX, cursor.Height - hotY, cursor.Width, 
     9             cursor.Height);
    10 
    11             this.Cursor = new Cursor(myNewCursor.GetHicon());
    12 
    13             g.Dispose();
    14             myNewCursor.Dispose();
    15         }
    View Code

    P.S.上面的代码来自前辈的博文,点我查看

    网络上的可用代码大都是这个版本(包括百度文库),拿到代码copy进自己的类,在类开头注释中写上源码链接,稍微一改,嗯,不错,现成代码确实好用,效果挺好。。。

    第一次希望把自定义图片的左上角作为鼠标热点(就是箭头形鼠标尖尖的那个位置),直接使用上面的代码,效果很棒,没有发现任何问题

    今天要把自定义图片的左下角作为鼠标热点(因为目标图片是一支铅笔,画图工具里的小铅笔),直接使用上面代码,发现不好用了,热点始终无法对准左下角,百思不得其解,只好开始挖自定义鼠标样式的原理

    最终得到了下面的代码:(下面的代码就是完美的解决方案,着急的话先拿去用吧,大可放心使用,不着急的话可以看看下面的原理,非常简单)

     1         /// <summary>
     2         /// 设置鼠标样式
     3         /// </summary>
     4         /// <param name="cursor"></param>
     5         /// <param name="hotPoint"></param>
     6         private void SetCursor(string imageFile, Point hotPoint)
     7         {
     8             int hotX = hotPoint.X;
     9             int hotY = hotPoint.Y;
    10             Bitmap cursor = new Bitmap(imageFile);
    11             //创建大图
    12             Bitmap myNewCursor = new Bitmap(cursor.Width * 2, cursor.Height * 2);
    13             Graphics g = Graphics.FromImage(myNewCursor);
    14             g.Clear(Color.FromArgb(120, 0, 0, 0));
    15             g.DrawImage(cursor, cursor.Width - hotX, cursor.Height - hotY, cursor.Width, cursor.Height);
    16             //设置鼠标指针样式
    17             this.Cursor = new Cursor(myNewCursor.GetHicon());
    18             //释放资源
    19             g.Dispose();
    20             myNewCursor.Dispose();
    21         }
    View Code

    其实只是对之前的现成代码做了一点点改动,但确实修复了这个Bug

    三.自定义鼠标样式的原理

    首先清楚一点:设置目标图片为鼠标样式,那么热点默认在图片中心

    那么理论上热点不可能跑到左上角去,但系统默认的箭形鼠标热点不就在左上角吗?怎么做到的?

    下面这幅图应该足够解释清楚设置鼠标热点的原理了:

    P.S.图中的灰黑色部分应该是全透明的,这里设置成半透明只是为了便于观察

    我们只做了两件事情:

    1. 创建一个透明Bitmap,宽/高都是目标图片的2倍
    2. 把目标图片draw到我们的透明Bitmap中,使得目标图片上的热点恰好落在透明Bitmap中心
  • 相关阅读:
    Html table 内容超出显示省略号
    [已解决] odoo12 菜单不显示,安装后多出菜单
    js display, visible 区别
    on() 和 click() 的区别
    jquery $.proxy使用
    阿里云ECS服务器部署HADOOP集群(六):Flume 安装
    阿里云ECS服务器部署HADOOP集群(七):Sqoop 安装
    阿里云ECS服务器部署HADOOP集群(三):ZooKeeper 完全分布式集群搭建
    阿里云ECS服务器部署HADOOP集群(五):Pig 安装
    阿里云ECS服务器部署HADOOP集群(四):Hive本地模式的安装
  • 原文地址:https://www.cnblogs.com/ayqy/p/4135933.html
Copyright © 2020-2023  润新知