本文經原作者授權以原創方式二次分享,歡迎轉載、分享。
原文作者:唐宋元明清的博客
原文地址:https://www.cnblogs.com/kybs0/p/14873136.html
系統有很多光標類型 :Cursors 類 (System.Windows.Input) | Microsoft Docs[1]
本章介紹如何自定義光標、并動態切換光標類型。
動態切換光標類型
以白板書寫為例:
鼠標操作時
Cursor
為紅點;觸摸時
Cursor
為空;
public?MainWindow(){InitializeComponent();MouseEnter?+=?(s,?e)?=>{ShowMouseCursor(e);};MouseMove?+=?(s,?e)?=>{ShowMouseCursor(e);};StylusMove?+=?(s,?e)?=>{ShowNoneCursor();};}
設置光標顯示;
private?void?ShowNoneCursor(){if?(Cursor?==?Cursors.None){return;}Cursor?=?Cursors.None;Mouse.UpdateCursor();}private?void?ShowMouseCursor(MouseEventArgs?e){if?(e.StylusDevice?!=?null?&&?e.StylusDevice.Id?>?-1){return;}if?(Cursor?==?GetFillCursor()){return;}Cursor?=?GetFillCursor();Mouse.UpdateCursor();}private?Cursor?_fillCursor?=?null;private?Cursor?GetFillCursor(){return?_fillCursor????(_fillCursor?=?CursorHelper.CreateFillCursor());}
觸摸書寫時,會有個默認光標,所以此處把觸摸時的光標置空Cursors.None
;
Mouse.UpdateCursor()
能強制更新光標。當然,不調用這個更新方法肉眼其實也看不出啥。。。

光標切換效果如上,前面一段是用鼠標書寫,后面是觸摸書寫,光標類型有切換。紅點光標自定義方案見下方。
?自定義光標1)自定義一個純色的圓形光標
:
public?static?Cursor?CreateFillCursor(int?size?=?24,?Brush?fillBrush?=?null){int?unitSize?=?size?/?4;var?bmp?=?new?Bitmap(size,?size);using?(Graphics?g?=?Graphics.FromImage(bmp)){g.Clip?=?new?Region(new?Rectangle(0,?0,?size,?size));g.SmoothingMode?=?SmoothingMode.HighQuality;g.InterpolationMode?=?InterpolationMode.HighQualityBicubic;using?(var?pen?=?new?Pen(fillBrush????Brushes.Red,?unitSize)){g.DrawEllipse(pen,?new?Rectangle(unitSize,?unitSize,?unitSize,?unitSize));}}return?BitmapCursor.CreateBmpCursor(bmp);}
2)也可以通過圖片資源BitmapSource
來生成光標;
public?static?Cursor?CreateFromBitmapSource(BitmapSource?source){var?bitmap?=?BitmapSourceToBitmap(source);return?BitmapCursor.CreateBmpCursor(bitmap);}private?static?Bitmap?BitmapSourceToBitmap(BitmapSource?source){using?(var?stream?=?new?MemoryStream()){var?e?=?new?BmpBitmapEncoder();e.Frames.Add(BitmapFrame.Create(source));e.Save(stream);var?bmp?=?new?Bitmap(stream);return?bmp;}}
2)BitmapCursor
類;
internal?class?BitmapCursor?:?SafeHandle{public?override?bool?IsInvalid?=>?handle?==?(IntPtr)(-1);public?static?Cursor?CreateBmpCursor(Bitmap?cursorBitmap){var?c?=?new?BitmapCursor(cursorBitmap);return?CursorInteropHelper.Create(c);}protected?BitmapCursor(Bitmap?cursorBitmap):?base((IntPtr)(-1),?true){handle?=?cursorBitmap.GetHicon();}protected?override?bool?ReleaseHandle(){bool?result?=?DestroyIcon(handle);handle?=?(IntPtr)(-1);return?result;}[DllImport("user32")]private?static?extern?bool?DestroyIcon(IntPtr?hIcon);}
參考資料:
WPF 自定義鼠標光標 - DH_青葉 - 博客園[2]
[WPF]自定義鼠標指針 - 周銀輝 - 博客園[3]
參考資料
[1]
Cursors 類 (System.Windows.Input) | Microsoft Docs: https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.input.cursors?view=net-5.0
[2]WPF 自定義鼠標光標 - DH_青葉 - 博客園: https://www.cnblogs.com/dhqy/p/7754176.html
[3][WPF]自定義鼠標指針 - 周銀輝 - 博客園: https://www.cnblogs.com/zhouyinhui/archive/2010/05/28/1746502.html