C#、WPF中如何自定義鼠標樣式

需求:在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中自定義的鼠標,測試過,沒有內存泄漏問題,放心使用。

相關文章
相關標籤/搜索