C# winForm自定义鼠标样式的两种方法

开发 后端
鼠标样式需要通过API来自定义。本文介绍了C#自定义鼠标样式的两种方法,可以避免自定义鼠标变成单色。

以前试过在C# WinForm中自定义鼠标样式,结果显示出来的鼠标变成单色。

后来百度了下,原来要用API来做。

首先引入两个命名空间

  1. using System.Runtime.InteropServices;  
  2. using System.Reflection; 

C# winForm自定义鼠标样式方法一

导入API

  1. [DllImport("user32.dll")]  
  2. ublic static extern IntPtr LoadCursorFromFile(string fileName);  
  3.  
  4. [DllImport("user32.dll")]  
  5. ublic static extern IntPtr SetCursor(IntPtr cursorHandle);  
  6.  
  7. [DllImport("user32.dll")]  
  8. ublic static extern uint DestroyCursor(IntPtr cursorHandle);  

接下来使用自己的鼠标样式 

  1. private void Form1_Load(object sender, EventArgs e)  
  2.   {  
  3.       Cursor myCursor = new Cursor(Cursor.Current.Handle);  
  4.       IntPtr colorCursorHandle = LoadCursorFromFile("my.cur");//鼠标图标路径  
  5.         myCursor.GetType().InvokeMember("handle", BindingFlags.Public |  
  6.       BindingFlags.NonPublic | BindingFlags.Instance |  
  7.       BindingFlags.SetField, null, myCursor,  
  8.      new object[] { colorCursorHandle });  
  9.      this.Cursor = myCursor;  
  10.   }  

C# winForm自定义鼠标样式方法之二

现在介绍另一种不用API方式的,鼠标样式只需要一张背景透明的图片就行了,png或gif格式的

写个方法 

  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.   }  

在你想要改变鼠标样式的事件里头使用这个方法就行了

  1. private void Form1_Load(object sender, EventArgs e)  
  2.  {  
  3.      Bitmap a=(Bitmap)Bitmap.FromFile("myCur.png");  
  4.      SetCursor(a, new Point(0, 0));  
  5.  }       //this.btnBack.FlatStyle = FlatStyle.Flat;    //set the button no frame  
  6. //this.btnBack.FlatAppearance.BorderSize = 0;  

C# winForm自定义鼠标样式举例:

Test.cs

  1. using System;   
  2. using System.Drawing;   
  3. using System.Windows.Forms;   
  4. using System.Runtime.InteropServices;   
  5. using System.Reflection;   
  6.  
  7. namespace ColorCursor   
  8. {   
  9. /// < summary>   
  10. /// 本例子的作用:   
  11. /// 在.NET中实现彩色光标,动画光标和自定义光标。   
  12. /// < /summary>   
  13. public class Form1 : System.Windows.Forms.Form   
  14. {   
  15. [DllImport("user32.dll")]   
  16. public static extern IntPtr LoadCursorFromFile( string fileName );   
  17.  
  18. [DllImport("user32.dll")]   
  19. public static extern IntPtr SetCursor( IntPtr cursorHandle );   
  20.  
  21. [DllImport("user32.dll")]   
  22. public static extern uint DestroyCursor( IntPtr cursorHandle );   
  23.  
  24.  
  25. [STAThread]   
  26. static void Main()   
  27. {   
  28. Application.Run(new Form1());   
  29. }   
  30.  
  31. public Form1()   
  32. {   
  33. this.Text = "欢迎光临【孟宪会之精彩世界】:http://dotnet.aspx.cc/";   
  34. Cursor myCursor = new Cursor(Cursor.Current.Handle);   
  35. //dinosau2.ani为windows自带的光标:   
  36. IntPtr colorCursorHandle = LoadCursorFromFile(@"C:\WINNT\Cursors\dinosau2.ani" );   
  37. myCursor.GetType().InvokeMember("handle",BindingFlags.Public |   
  38. BindingFlags.NonPublic | BindingFlags.Instance |   
  39. BindingFlags.SetField,null,myCursor,   
  40. new object [] { colorCursorHandle } );   
  41. this.Cursor = myCursor;   
  42. }   
  43. }   
  44. }     

 

【编辑推荐】

  1. C#多线程控制进度条之长任务操作
  2. C#多线程控制进度条之长异步操作
  3. C#多线程控制进度条之异步调用
  4. C#多线程控制进度条之多线程安全
  5. C# listview进度条显示浅析
责任编辑:book05 来源: hi.baidu
相关推荐

2009-08-05 13:34:18

C#日期相减

2009-09-02 16:21:02

C#解析Html

2009-09-11 11:04:23

C# WinForm自

2009-08-17 08:29:00

c#删除指定文件

2009-08-21 18:02:41

C#快捷键

2009-08-25 11:35:27

C#连接数据库

2009-08-04 08:58:01

C#自定义特性

2009-08-03 17:53:11

XML数据

2009-08-04 12:56:51

C#自定义事件

2009-09-03 15:46:57

C#自定义事件

2009-08-03 13:34:06

自定义C#控件

2009-08-28 17:45:19

C#自定义数据

2009-08-03 13:39:46

C#自定义用户控件

2009-08-04 13:31:35

C#自定义事件

2009-08-05 17:03:37

C#自定义控件

2009-08-04 09:56:46

C#事件处理自定义事件

2021-06-17 06:52:37

C#自定义异常

2009-08-17 17:24:02

C#自定义消息框

2009-08-04 13:07:46

C#自定义快捷键

2009-08-12 14:53:50

C#类型转换函数
点赞
收藏

51CTO技术栈公众号