VS Winform如何设置光标样式

这是封装的代码,有注释,下边有关于其它部分的说明。

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值