-------------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:
- https://github.com/ahdung/MessageTip【主要】
- https://coding.net/u/ahdung/p/MessageTip/git
- http://git.oschina.net/ahdung/MessageTip
-------------原文-------------
注:本組件適用於.net2.0+的winform項目
樣子:
實際效果比這gif順滑,建議下載文末的Tester體驗
介紹:
如圖所見,這種提示在網頁、手機上用的較多,相比正經的消息框(如MessageBox),我認為好處有:
- 不需要用戶對消息本身做出響應,點啥【確定】什么的
- 不阻塞、不干預用戶的后續操作,就是單純告訴你一聲完事了
- 視覺上通過動畫效果保證消息的送達性,彌補因無干預可能造成的“被無視”
這就是我所謂的【輕快型消息提示窗】,適用於:
特點:
- 在鼠標附近顯示消息。所以不適合耗時任務,因為等任務執行完,鼠標都不知跑哪里去了
- 內置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
-文畢-