热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

Winform应用程序如何使用自定义的鼠标图片

这篇文章主要介绍了Winform应用程序如何使用自定义的鼠标图片,在window系统中,自带的鼠标外观可能看起来比较小,因此我们需要使用自己的鼠标图片外观

首先,建立图片与鼠标的对应关系。

class MouseStyle
{
  [DllImport("user32.dll")]
  public static extern IntPtr SetCursor(IntPtr cursorHandle);


  static MouseStyle()
  {
    InitMouseStyle();
  }

  private static void InitMouseStyle()
  {
    if (Hand == null)
    {
      Hand = SetCursor("Image//Hand.png");
    }
    if (Arrow == null)
    {
      Arrow = SetCursor("Image//Arrow.png");
    }
  }
  /// 
  /// 鼠标手型样式
  /// 
  public static Cursor Hand = null;

  /// 
  /// 鼠标指针样式
  /// 
  public static Cursor Arrow = null;

  /// 
  /// 设置鼠标样式
  /// 
  /// 自定义的鼠标样式文件
  /// 鼠标样式
  private static Cursor SetCursor(string fileName)
  {
    //文件的绝对路径,在debug下
    var path = System.IO.Path.GetFullPath(fileName) ;

    //画图
    Bitmap bit = (Bitmap)Bitmap.FromFile(path, true);
    Bitmap myNewCursor = new Bitmap(bit.Width, bit.Height);
    Graphics g = Graphics.FromImage(myNewCursor);
    g.Clear(Color.FromArgb(0, 0, 0, 0));

    //箭头和手型有点不一样
    if (System.IO.Path.GetFileName(fileName).Equals("Hand.png"))
    {
      g.DrawImage(bit, bit.Width / 2 - 15, bit.Height / 2, bit.Width / 2, bit.Height / 2);
    }
    else
    {
      g.DrawImage(bit, bit.Width / 2 - 15, bit.Height / 2, bit.Width / 2, bit.Height / 2);
    }

    Cursor cursor;
    //获取图片的句柄
    try
    {
      cursor = new Cursor(myNewCursor.GetHicon());
    }
    catch
    {
      cursor = new Cursor(Icon.FromHandle(myNewCursor.GetHicon()).Handle);
    }

    //释放资源
    g.Dispose();

    return cursor;
  }
}

  如果是鼠标文件.cur结尾,可以直接使用。

法1、在每一个窗体中单独修改其中的鼠标外观,这样鼠标离开自己的程序后,也会恢复到系统默认的鼠标样式。

  在上述类中,添加代码:

/// 
/// 设置鼠标样式
/// 
/// 控件
public static void SetMouseStyle(Control col)
{
  InitMouseStyle();

  //设置窗体鼠标为箭头
  if (col is Form)
  {
    ((Form)col).Cursor = Arrow;
  }

  //遍历控件,如果控件是箭头或默认,就改为自定义的箭头
  //如果是手型就改为自定义的手型
  foreach (Control con in col.Controls)
  {
    if (con.Cursor == Cursors.Hand)
    {
      con.Cursor = Hand;
    }
    if (con.Cursor == Cursors.Arrow || con.Cursor == Cursors.Default)
    {
      con.Cursor = Arrow;
    }

    //递归遍历
    SetMouseStyle((Control)con);
  }
}

  然后在所有窗体中,均调用SetMouseStyle方法,传入窗体自身

法2、修改系统鼠标,待程序退出时,还原系统鼠标。首先添加代码,调用window的API:

[DllImport("User32.DLL")]
public static extern bool SetSystemCursor(IntPtr hcur, uint id);
public const uint OCR_NORMAL = 32512;
public const uint OCR_HAND = 32649;
public const uint OCR_IBEAM = 32513;
//速查 https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-setsystemcursor?redirectedfrom=MSDN
//OCR_APPSTARTING:标准箭头和小的沙漏;32650
//OCR_NORMAL:标准箭头 32512
//OCR_CROSS:交叉十字线光标: 32515
//OCR_HAND:手的形状(WindowsNT5.0和以后版本) 32649
//OCR_HELP:箭头和向东标记; 32651
//OCR_IBEAM:I形梁; 32513
//OCR_NO:斜的圆 32648
//OCR_SIZEALL:四个方位的箭头分别指向北、南、东、西 32646
//OCR_SIZENESEW:双箭头分别指向东北和西南; 32643
//OCR_SIZENS:双箭头,分别指向北和南 32645
//OCR_SIZENWSE:双箭头分别指向西北和东南; 32642
//OCR_SIZEWE:双箭头分别指向西和东 32644
//OCR_UP:垂直箭头: 32516
//OCR_WAIT:32514 沙漏返回值:如果成功,返回非零值;如果失败,返回值为零。

[DllImport("User32.DLL")]
public static extern bool SystemParametersInfo(uint uiAction, uint uiParam,
 IntPtr pvParam, uint fWinIni);
public const uint SPI_SETCURSORS = 87;
public const uint SPIF_SENDWININICHANGE = 2;

  程序启动和退出时分别调用设置方法和恢复方法:

private void button1_Click(object sender, EventArgs e)
{
  //设置
  SetSystemCursor(Cursors.WaitCursor.CopyHandle(), OCR_NORMAL);
  SetSystemCursor(Cursors.WaitCursor.CopyHandle(), OCR_IBEAM);
  //..可以根据情况加
}

private void button2_Click(object sender, EventArgs e)
{
  //恢复
  SystemParametersInfo(SPI_SETCURSORS, 0, IntPtr.Zero, SPIF_SENDWININICHANGE);
}

以上就是Winform应用程序如何使用自定义的鼠标图片的详细内容,更多关于Winform 自定义鼠标图片的资料请关注其它相关文章!


推荐阅读
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • windows便签快捷键_用了windows十几年,没想到竟然这么好用!隐藏的功能你知道吗?
    本文介绍了使用windows操作系统时的一些隐藏功能,包括便签快捷键、截图功能等。同时探讨了windows和macOS操作系统之间的优劣比较,以及人们对于这两个系统的不同看法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • Win10下游戏不能全屏的解决方法及兼容游戏列表
    本文介绍了Win10下游戏不能全屏的解决方法,包括修改注册表默认值和查看兼容游戏列表。同时提供了部分已经支持Win10的热门游戏列表,帮助玩家解决游戏不能全屏的问题。 ... [详细]
  • 如何在联想win10专业版中修改账户名称
    本文介绍了在联想win10专业版中修改账户名称的方法,包括在计算机管理中找到要修改的账户,通过重命名来修改登录名和属性来修改显示名称。同时指出了windows10家庭版无法使用此方法的限制。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
author-avatar
Gome--李想
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有