这是封装的代码,有注释,下边有关于其它部分的说明。
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Test
{
public class MyCursor:Form
{
//单例 三要素 私有的实体对象,私有的构造函数(禁止外部通过new来访问) 提供给外部的属性或方法
private static MyCursor _instance;
private Bitmap[] bms; //光标样式,其索引对应于CursorType的各个元素
private int factor;//图片缩放系数,因为光标样式可能只有20*20的大小,众所周知,一般我们存储的图片是很大的,<1缩小,=1维持原状,>1放大
private MyCursor()
{
}
public static MyCursor Instance
{
get
{
if(_instance==null)
{
_instance = new MyCursor();
}
return _instance;
}
}
/// <summary>
/// 光标配置初始化信息
/// </summary>
/// <param name="param_fator">光标图片缩放系数</param>
/// <param name="param_bms">光标图片位图数组,请务必根据CursorType一一对应,否则配置出错</param>
public void SetCursorConfig(int param_factor, Bitmap[] param_bms)
{
//获取枚举类型的值
CursorType ct = new CursorType();
string[] enumStr = System.Enum.GetNames(ct.GetType());
if(param_bms.Length!=enumStr.Length)
{
//如果输入的光标样式长度和枚举长度不符,那么就肯定有问题,直接返回
return;
}
else
{
this.factor = param_factor;
if(this.bms==null)
{
this.bms = new Bitmap[enumStr.Length];
}
for (int i = 0; i < enumStr.Length; i++)
{
//依次赋值
this.bms[i] = param_bms[i];
}
}
}
/// <summary>
/// 设置光标样式
/// </summary>
/// <param name="ct">光标类型</param>
/// <returns></returns>
public Cursor SetCursor(CursorType ct)
{
Bitmap bmCursor = bms[(int)ct];//根据CursorType获取具体的样式
Bitmap canvas= new Bitmap((int)(bmCursor.Width * factor),(int) (bmCursor.Height * factor));//创造一个这么宽,这么高的Bitmap,以下称为画布
//画布上画图
Graphics g = Graphics.FromImage(canvas);
//画布填充黑色
g.Clear(Color.FromArgb(0, 0, 0, 0));
//把光标样式图片画在画布上
g.DrawImage(bmCursor, 0, 0, (int)(bmCursor.Width * factor), (int)(bmCursor.Height * factor));
Cursor cursor = new Cursor(canvas.GetHicon());
g.Dispose();
canvas.Dispose();
return cursor;
}
public enum CursorType
{
Default, //默认
MouseHover,//鼠标悬浮
MouseDown//鼠标按下
}
}
}
上述代码是我已经封装好的,在调用时,先初始化一次,即将你所需要的光标样式以Bitmap形式导入。
Bitmap形式导入我所常用的有两种:
(1)从磁盘中获取路径导入
Bitmap a=(Bitmap)Bitmap.FromFile(“D:\myBitMap.png”);
(2)从Resources资源中调用(前提是在Resources中添加过资源,添加步骤为双击winform中的Properties—>选择资源—>点击上方“添加资源”选项—>选择你的图片【图片尺寸无所谓,在代码中,有设置缩放系数,通过Resources.图片名获得Bitmap对象,代码如下】)
Bitmap bm = Resources.myBitMap;
-
初始化(指定光标样式)
MyCursor.Instance.SetCursorConfig(10, new Bitmap[] { Resources.myBitMap1, Resources.myBitMap2, Resources.myBitMap })
-
SetCursor(CursorType ct)注意
在调用时,Bitmap数组中顺序要对应于CursorType的各个元素【这是我自己定义的,利用数组下标对应枚举中各个值,不一一对应的话在调用时就乱了】 比如:Resources.myBitMap1 是数组中第一个元素,索引为0,对应CursorType.Default,表示这是默认指针样式, Resources.myBitMap2 是数组中第二个元素,索引为1,对应CursorType.MouseHover,表示这是悬浮指针样式
-
SetCursor(CursorType ct)
只需要一句话
this.Cursor =
MyCursor.Instance.SetCursor(MyCursor.CursorType.Default);比如:在点击按钮中调用
private void button1_Click(object sender, EventArgs e)
{
this.Cursor = MyCursor.Instance.SetCursor(MyCursor.CursorType.Default);
}
//至于this.Cursor所有继承Control的类皆有这个属性,Form间接继承Control