【C#】組件發布:MessageTip,輕快型消息提示窗


-------------201610212046更新-------------

更新至2.0版,基本完全重寫,重點:

  • 改為基於原生LayeredWindow窗體和UpdateLayeredWindow API呈現動畫,完全摒棄.net Form,這種消息框用前者再適合不過,后者對於這種場景過於臃腫了
  • 更高更快更強,更酷更炫更拉轟
  • 可自由定制若干消息窗樣式。1.0版似乎只能換個圖標而已

項目已更新至開源倉庫,有需要請自取。看圖:

-------------201608301610更新-------------

根據幾位猿友在評論中反饋的問題和建議做了更新,主要內容:

  • ShowXX的時候如果不指定point參數,則根據活動控件來確定顯示位置,如果活動控件是文本輸入類控件,則根據光標位置來確定
  • 如果指定了point參數,則直接根據該point來確定
  • 另外增加了一組ShowXX重載,接受Control和ToolStripItem(工具欄按鈕等,下稱item)對象,完了根據該對象來確定顯示位置。這里要注意,item是無焦點的,所以在MessageTip中無法得知點擊的是item,也就無法做到自動在item附近顯示,所以這里有個最佳實踐:就是如果想在item附近顯示,那就需要使用上述重載,把item傳進去;其余情況都可以讓MessageTip自動判斷顯示位置
  • 顯示位置太靠屏幕頂部時,改在基准點下方顯示,並且動畫由上浮改為下降
  • 多屏環境下的定位錯誤問題,目前是將消息框限定在基准點所在屏幕內顯示
  • 對於有位猿友提到的偶發異常,由於在我的環境始終無法重現,所以只能猜測是在Load事件和OnPaint中同時爭用TipIcon所致,暫且給TipIcon的getter加獨占特性,希望能解決

原文和網盤demo我就不更新了,項目已開源到如下幾處,有興趣的朋友請關注,歡迎fork/push/pull:

-------------原文-------------

注:本組件適用於.net2.0+的winform項目

樣子:

實際效果比這gif順滑,建議下載文末的Tester體驗

介紹:

如圖所見,這種提示在網頁、手機上用的較多,相比正經的消息框(如MessageBox),我認為好處有:

  • 不需要用戶對消息本身做出響應,點啥【確定】什么的
  • 不阻塞、不干預用戶的后續操作,就是單純告訴你一聲完事了
  • 視覺上通過動畫效果保證消息的送達性,彌補因無干預可能造成的“被無視”

這就是我所謂的【輕快型消息提示窗】,適用於:

  • 能快速出結果的操作,比如在本地庫跑個小語句啥的。如果是耗時操作,顯然弄個進度提示更合適,比如這個
  • 只需要反饋小量信息的情形,通常不應超過15字。如果需要反饋大量信息,可以嘗試這個

特點:

  • 在鼠標附近顯示消息。所以不適合耗時任務,因為等任務執行完,鼠標都不知跑哪里去了
  • 內置3種消息性質的圖標,,亦可使用自定義圖標(使用Show方法)
  • 上浮動畫效果可開閉(屬性AllowFloating,影響后續彈出的消息窗)
  • 可以只顯示圖標或文本,甚至圖標文本全無也行~雖然這樣沒意思

用法:

//開閉上浮動畫。默認開啟
MessageTip.AllowFloating = true|false;

//默認停留時長(毫秒)。當ShowXXX中指定負值delay時,使用該值,默認500
MessageTip.DefaultDelay = int;

//文本(可為null或"",下同)、圖標(為null時不顯示圖標)、停留時長(可選,下同,負值則使用DefaultDelay)
MessageTip.Show("阿斯蒂芬", image | null, [delay]);

//文本,內置的綠勾圖標,停留時長
MessageTip.ShowOk("執行成功", [delay]);

//文本,內置的黃色感嘆號圖標,停留時長
MessageTip.ShowWarning("執行成功", [delay]);

//文本,內置的紅叉圖標,停留時長
MessageTip.ShowError("執行成功", [delay]);

背景:

這東西我很早就想寫了,因為很多時候正兒八經的彈出個MessageBox會影響心情,本來就是告知一聲的事情,非得要去點一下確定,煩人,但因為一直有各種破事,到今天才弄。一開始是用AnimateWindow這個win32 API實現(MSDN),但它沒有上浮的效果,所以干脆自己實現,原理無非是步進修改窗體的透明度(Opacity)和位置(Location),只是采用了異步的手段。異步在兩個地方有使用,一是改變Location,目的是不讓它與透明度動畫打架;二是Show窗體時也是異步,目的是從線程層面完全與主UI線程隔離,達到快速Show出多個消息的效果,如圖:

不然就只能等一個消息完全消失完才能顯示下一個,並且在主線程Show的話,有可能阻塞用戶的其它操作。

最后,懇請指出問題,或告知已有的更好方案,感謝!

工程已放網盤,里面有個Tester供你體驗,就是第一幅圖那個。http://pan.baidu.com/s/1dEVjzMD

-文畢-


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM