C# 自定義并動態切換光標

本文經原作者授權以原創方式二次分享,歡迎轉載、分享。

原文作者:唐宋元明清的博客

原文地址: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()能強制更新光標。當然,不調用這個更新方法肉眼其實也看不出啥。。。

7b5645392a6dc5c9096d8a79b7471afa.gif

光標切換效果如上,前面一段是用鼠標書寫,后面是觸摸書寫,光標類型有切換。紅點光標自定義方案見下方。

?自定義光標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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285421.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285421.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285421.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTML基礎加強

1. 什么是瀏覽器:解釋和執行HTML源碼的工具。 2. 什么是靜態頁面,什么樣的頁面是動態頁面? 靜態頁面:htm,html(直接讀取) 動態網頁:asp,aspx,jsp,…

視頻播放器for android

寫在前面 好久沒有寫博客了, 中間忙了一堆雜七雜八的事情...工作, 情感, 未來, 人生... 下面是正文 一直要寫一個視頻播放器, 好練練手. 這個app, 從年前寫到現在, 終于算弄出了樣子, 0.0版本. (不得不說, googleVPN值得擁有, android developer網站, android sdk samples, sta…

我要偷偷學習C#,然后學習GIS二次開發之試題匯總(附答案)

一、單項選擇題(每小題2分,共20分) 在類作用域中能夠通過直接使用該類的( )成員名進行訪問。 A. 私有 B. 公用 C. 保護 D. 任何 答案:D 小數類型(decimal)和浮點類型都可以表示小數,正確說法:( ) A. 兩者沒有任何區別 B. 小數類型比浮點類型取值范圍大 C.小數類型比浮…

簡單粗暴無需拼接下載 blob (ts)視頻文件

網上很多視頻采用blob來播放視頻&#xff0c;查看源碼會發現video的src為形如 &#xff1a; src"blob:https://*/f2880c6a-c2c5-4146-96b2-944ae555b76a" <video id"" class"" preload"auto" playsinline"playsinline"…

System.CommandLine版CSRebot

之前自己實現過一個CSRebot命令行工具&#xff0c;現在用System.CommandLine來實現&#xff0c;就規范和省事多了&#xff0c;雖然System.CommandLine還沒有正式發布&#xff0c;但它的實現思路還是很不錯的。下面的代碼只簡單實現了MSSQL庫生成C#體類的功能&#xff0c;其他庫…

Shell重定向

Liunx下系統打開的3個文件&#xff0c;即標準輸入、標注輸出和標準錯誤輸出。用戶的shell將鍵盤設為默認的標準輸入&#xff0c;默認的標準輸入和標準錯誤輸出為屏幕。也就是說&#xff0c;用戶從鍵盤輸入命令&#xff0c;然后將結果和錯誤消息輸入到屏幕所謂的重定向&#xff…

【CASS精品教程】CASS 9.2 for AutoCAD2014啟動提示文件加載,怎么處理?

CASS9.2在安裝完后,首次啟動會提示如下圖樣提示,應該如何處理?請看以下步驟: 解決步驟: 1、安裝完CASS9.2_2014后,首次啟動CASS92,會出現如下圖所示提示。選擇“不加載”。 2、進入AutoCAD系統配置—系統頁面 打開系統頁面菜單 系統界面截圖

VS2015不能修改安裝路徑問題

能修改安裝路徑&#xff0c;固態硬盤空間太小&#xff0c;所以不能裝在C盤啊。 其中&#xff0c;原因是以前安裝過VS2015沒有卸載干凈&#xff0c;解決方法是&#xff1a;下載Visual Studio Uninstaller卸載完全&#xff08;要以管理員運行哈&#xff09; 下載地址&#xff1a;…

python 繪制分形樹

# -*- coding: utf8 -*- """ 繪制分形樹 """ import turtledeflection_angle 20 # 樹枝與樹干夾角 trunk_min_length 5 # 樹干最小長度 trunk_step_length 10 # 樹干每次遞減長度 trunk_length 80 # 初…

像JAVA一樣流暢調試C#源代碼?

起因最近在研究ServiceScope的內一些內在運行邏輯,發現相關資料非常少&#xff0c;只有講IOC相關的文章有說Core時代的官方依賴注入怎么使用。。遂決定還是要去看源代碼。這部分源代碼在Microsoft.Extensions.DependencyInjection庫中&#xff0c;源代碼位置在src/libraries[1]…

物化視圖VS普通視圖

2019獨角獸企業重金招聘Python工程師標準>>> 物化視圖是一種特殊的物理表&#xff0c;“物化”(Materialized)視圖是相對普通視圖而言的。普通視圖是虛擬表&#xff0c;應用的局限性大&#xff0c;任何對視圖的查詢&#xff0c;Oracle都實際上轉換為視圖SQL語句的查…

【CASS精品教程】CASS繪圖軟件入門初級教程超詳細資料

文章目錄 第一章 CASS 9.0簡介第二章 CASS 9.0快速入門第三章 測制地形圖第四章 測制地籍圖第五章 土地詳查與勘測定界第六章 CASS在數據入庫中的應用第七章 CASS 9.0在工程中的應用第八章 數字地圖管理第九章 CASS在市政監管中的應用第十章 白紙圖數字化第十一章電子平板成圖第…

多兼容的JS獲取鼠標坐標

//第一、相對于屏幕 function getMousePos(event) {var e event || window.event;return {x:e.screenX,y:screenY} } //第二、相對于瀏覽器 function getMousePos(event) {var e event || window.event;return {x:e.clientX,y:clientY} }//第三、相對于文檔 function getM…

aws-ec2-雙網卡問題

問題描述 在已存在的EC2上新添加網卡后發現&#xff0c;凡是和eth0在同一個網段的只能通過eth0訪問&#xff0c;不能通過eth1。同樣的&#xff0c;在eth1網段的只能通過eth1訪問&#xff0c;不能通過eth0訪問。 如果既不在eth0也不再eth0 默認走eth0(在沒有修改路由表的前提下&…

EditPlust 批量添加自定義工具

先將插件文件***.js文件放到指定目錄&#xff0c;比如editplus的安裝下新文件夾tools。 &#xff08;下載地址見文末&#xff09; 將下列代碼內容另存為tool_u.ini 文件&#xff08;不能改名&#xff09;&#xff0c; 放到EditPlus 的ini文件目錄 &#xff08;工具-設置目錄 可…

iOS c語言 基本運算符

2019獨角獸企業重金招聘Python工程師標準>>> iOS_06_基本運算符 一、算術運算 c語言一共有34種運算符&#xff0c;包括了常見的加減乘除 1.加法運算 # 除了能做加法運算&#xff0c;還能表示正號&#xff1a;5、90 2.減法運算- # 除了能做減法運算&#xff0c;還能表…

【CASS精品教程】CASS快捷鍵大全吐血整理

A——畫弧(ARC) AA——給實體加地物名 B——自由連接 C——畫圓(CIRCLE) COPYCLIP——從不同窗口復制局部 CP——拷貝(COPY) D——繪制電力線 DD——通用繪圖命令 DDPTYPE——改變點形狀 E——刪除(ERASE) F——圖形復制 FF——繪制多點房屋 G——繪制高程點 H——線型…

Maui學習之路(三)--Winui3深入探討

Maui的學習之路 --- Winui3深入探討學習Maui已經有一段時間&#xff0c;隨著不斷地深入&#xff0c;對Maui有了一些初步的了解。我們都知道Maui為了保持平臺原生特性&#xff0c;所以在每一個平臺都使用了平臺自身的原生開發框架&#xff0c;如在Windows系統使用了Winui3作為UI…

centos 7.1 apache 源碼編譯安裝

Apache編譯安裝 一&#xff0c;需要軟件&#xff1a; http://mirrors.cnnic.cn/apache//apr/apr-1.5.2.tar.gz 1.apr-1.5.2.tar.gz http://mirrors.cnnic.cn/apache//apr/apr-util-1.5.4.tar.gz 2.apr-util-1.5.4.tar.gz http://exim.mirror.fr/pcre/pcre-8.38.tar.gz 3.pcre-8…

【ArcGIS風暴】ArcGIS平臺上點云(.las)數據生成等高線方法案例精解

las是點云數據常見的存儲格式,攝影測量和激光雷達數據均采用此格式,點云數據常用來生成等高線,地籍測量,土方量計算等。本文講解在ArcGIS平臺上生成等高線并轉換為dwg格式供CASS使用。 擴展閱讀: 什么是點云?什么是Las數據集?一篇文章告訴你點云數據的奧秘 ArcGIS+CASS點…