一.如何设置鼠标样式?

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

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

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

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

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

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

         public void SetCursor(Bitmap cursor, Point hotPoint)
{
int hotX = hotPoint.X;
int hotY = hotPoint.Y;
Bitmap myNewCursor = new Bitmap(cursor.Width * - hotX, cursor.Height * - hotY);
Graphics g = Graphics.FromImage(myNewCursor);
g.Clear(Color.FromArgb(, , , ));
g.DrawImage(cursor, cursor.Width - hotX, cursor.Height - hotY, cursor.Width,
cursor.Height); this.Cursor = new Cursor(myNewCursor.GetHicon()); g.Dispose();
myNewCursor.Dispose();
}

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

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

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

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

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

         /// <summary>
/// 设置鼠标样式
/// </summary>
/// <param name="cursor"></param>
/// <param name="hotPoint"></param>
private void SetCursor(string imageFile, Point hotPoint)
{
int hotX = hotPoint.X;
int hotY = hotPoint.Y;
Bitmap cursor = new Bitmap(imageFile);
//创建大图
Bitmap myNewCursor = new Bitmap(cursor.Width * , cursor.Height * );
Graphics g = Graphics.FromImage(myNewCursor);
g.Clear(Color.FromArgb(, , , ));
g.DrawImage(cursor, cursor.Width - hotX, cursor.Height - hotY, cursor.Width, cursor.Height);
//设置鼠标指针样式
this.Cursor = new Cursor(myNewCursor.GetHicon());
//释放资源
g.Dispose();
myNewCursor.Dispose();
}

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

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

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

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

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

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

我们只做了两件事情:

  1. 创建一个透明Bitmap,宽/高都是目标图片的2倍
  2. 把目标图片draw到我们的透明Bitmap中,使得目标图片上的热点恰好落在透明Bitmap中心

CSharp如何自定义鼠标样式的更多相关文章

  1. C#、WPF中如何自定义鼠标样式

    需求:在C#中如何自定义鼠标样式?在这里可以分两种情况,一种是在winForm,另一种是在WPF中(注意使用的Cursor对象不一样) 解决办法如下: a.首先针对WinForm中,我们可以采用图标加 ...

  2. Arcgis for javascript不同的状态下自定义鼠标样式

    俗话说:爱美之心,人皆有之.是的,没错,即使我只是一个做地图的,我也希望自己的地图看起来好看一点.在本文,给大家讲讲在Arcgis for javascript下如何自定义鼠标样式. 首先,说几个状态 ...

  3. Android:系统自定义鼠标样式切换

    一.APP通过View修改鼠标样式 app view上修改鼠标样式比较简单,通过 hover event 获取鼠标坐标并使用如下方法修改为自定义图片: getWindow().getDecorView ...

  4. ArcGIS AddIN开发之自定义鼠标样式

    如果想修改Windows默认的鼠标样式,可以这样 //设置鼠标样式 this.Cursor = System.Windows.Forms.Cursors.Cross; 可是如果想设置成一些自定义的很好 ...

  5. cursor url 自定义鼠标样式

    cursor可以自定义鼠标,写法是cursor:url(“图片路径”),pointer; url:需使用的自定义光标的 URL.图片类型需要是.cur或.ani和jpg,png等格式的(.cur或.a ...

  6. .Net应用自定义鼠标样式

    (调用系统API的方法) 1.引用命名空间 using System.Runtime.InteropServices; 命名空间提供各种各样支持 COM 互操作 及平台调用服务的成员.using Sy ...

  7. web中自定义鼠标样式

    实现一个功能:鼠标移动到一个图片左边显示左箭头,移动到右边显示右箭头. 实现方法:一个img上面定位两个div,div的样式如下: .toleft { width: 200px; height: 30 ...

  8. C#winform程序自定义鼠标样式

    public void SetCursor(Bitmap cursor, Point hotPoint) { int hotX = hotPoint.X; int hotY = hotPoint.Y; ...

  9. 【WPF】自定义鼠标样式

    /// <summary> /// This class allow you create a Cursor form a Bitmap /// </summary> inte ...

随机推荐

  1. 基于MSAA的QQ界面信息获取的实现

    主要技术(Microsoft Active Accessibility)讲解: 以下是微软对于此技术的说明 Microsoft Active Accessibility Version 2.0 Pur ...

  2. centos云服务器安装Python3记录

    题记 购买了一个月的服务器和公网ip,计划用Python与Nginx写一个web服务,于是踏上了漫漫的摸索之路. 行程 步骤 1.本地ssh连接. 2.mkdir /usr/local/python3 ...

  3. 4-js 函数

    总是有些奇奇怪怪的问题: <div> <p class="productStatus"> <span>成交量 <em>${goods ...

  4. 利用redis完成自动补全搜索功能(三)

    前面已经完成了分词和自动提示功能,最后把搜索结合在一起,来个完成的案例.当然最好还是用搜索分词解决,这个只是一个临时解决方案. 其实加上搜索很简单,要做的就是3件事 1. 分词的时候,把有用词的id存 ...

  5. oracle JDeveloper学习

    1>oracle JDeveloper官方地址,官方的学习资源包括视频和教材,很全面,很多不知道从和入手. 2>oracle JDeveloper 12C 教程,一步步学习jdev,可以此 ...

  6. .NET中CORS跨域访问WebApi

    我这里只写基本用法以作记录,具体为什么看下面的文章: http://www.cnblogs.com/landeanfen/p/5177176.html http://www.cnblogs.com/m ...

  7. 超星网站cc++

    a系统 苏龙杰     a系统 苏龙杰     目录 1 C/C ++程序设计 1.1 前 言 1.2 第一部分 基 础 篇 1.2.1 第1章 初识C 1.2.1.1 1.1 C语言的诞生与发展 1 ...

  8. 嵌入式的SQL程序设计

    嵌入式的SQL程序设计 sql语句大全之嵌入式SQL 2017-01-18 16:00 来源:未知   嵌入式SQL 为了更好的理解嵌入式SQL,本节利用一个具体例子来说明.嵌入式SQL允许程序连接数 ...

  9. MySQL 开启远程访问权限

    1.登陆mysql数据库    mysql -u root -p 查看user表 mysql> use mysql;Database changedmysql> select host,u ...

  10. using directive 使用指令,与using declaration使用声明。

    使用指令是把名字空间中的所有名字引入到当前作用域,而使用声明是把名字空间的某个名字引入到当前作用域中 语法如下 //test.cpp #include<iostream> //using ...