需求:在C#中如何自定義鼠標樣式?在這裏能夠分兩種狀況,一種是在winForm,另外一種是在WPF中(注意使用的Cursor對象不同)ide
解決辦法以下:測試
a.首先針對WinForm中,咱們能夠採用圖標加載方式,代碼以下:(這種狀況用在普通控件上,但在MouseMove事件中使用,移動時鼠標會一直跳動)spa
public void SetCursor(System.Drawing.Bitmap cursor)orm
{對象
try繼承
{事件
System.Drawing.Bitmap newCursor = new System.Drawing.Bitmap(cursor.Width, cursor.Height); ;內存
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(newCursor);get
g.Clear(System.Drawing.Color.FromArgb(0, 0, 0, 0));it
g.DrawImage(cursor, 0, 0, cursor.Width, cursor.Height);
System.Windows.Forms.Cursor.Current = new System.Windows.Forms.Cursor(newCursor.GetHicon());
g.Dispose();
newCursor.Dispose();
}
catch (Exception)
{
return;
}
}
b.針WPF中,它使用的鼠標對象爲Cursor對象,而Cursor實例中有隻有Stream與.ani、.cur文件等,而這類的文件又不要建立,沒有直接使用圖標引用來的快,下面這種方法就能夠直接使用圖標來引用(而且移動鼠標時,也不會有跳動現象,,但這裏須要提醒下,網上有種相似的方法,它未繼承SafeHandle類,致使使用時會產生內存泄漏問題,請謹慎使用)
internal class BitmapCursor:System.Runtime.InteropServices.SafeHandle
{
public override bool IsInvalid
{
get { return handle == (IntPtr)(-1); }
}
public static Cursor CreateBmpCursor(System.Drawing.Bitmap cursorBitmap)
{
var c = new BitmapCursor(cursorBitmap);
return System.Windows.Interop.CursorInteropHelper.Create(c);
}
protected BitmapCursor(System.Drawing.Bitmap cursorBitmap)
:base((IntPtr)(-1),true)
{
handle = cursorBitmap.GetHicon();
}
protected override bool ReleaseHandle()
{
bool result = DestroyIcon(handle);
handle = (IntPtr)(-1);
return result;
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool DestroyIcon(IntPtr hIcon);
}
本人項目中使用的是WPF中自定義的鼠標,測試過,沒有內存泄漏問題,放心使用。