




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第C#Winform實現自定義漂亮的通知效果目錄前言優(yōu)化調整調用并顯示自定義通知主要實現過程代碼實現
前言
本文主要介紹其具體的實現思路(視頻僅有代碼輸入,并無過程介紹等),同時,在原本實現的基礎上,進行了多處修改和優(yōu)化,具體參見下面的內容。
優(yōu)化調整
下面是對源代碼的修改、優(yōu)化和調整:
修改lblMsg(Label)的AutoSize為false,盡可能多占通知窗體區(qū)域,Anchor跟隨窗體變換,文字左側垂直居中,用于顯示可能更多的消息.設定action、timer1默認值,Name、Opacity、StartPosition(Manual)在構造函數中指定,這樣就不用每次創(chuàng)建通知窗體時進行賦值了。ShowInTaskbar=false;通知窗體不在任務欄顯示。將原有代碼中定時器時間間隔調整到100毫秒,原設置為1,時間太短人眼看不出區(qū)別,白白浪費計算。ShowNotice()改為靜態(tài)方法,直接通過Form_Alert.ShowNotice(msg,msgType);調用顯示窗體,不用new創(chuàng)建對象再調用。AlertFormNum靜態(tài)屬性設置最多顯示的通知數量,默認盡可能多的占滿垂直屏幕,手動設置數量不能低于1或超出屏幕。ShowTime靜態(tài)屬性設置完全顯示后通知的顯示時間,單位毫秒;也可以擴展?jié)u變顯示和消失的時間。MoveEntry靜態(tài)屬性設置消息框是否水平移動進入,默認true。通過設置初始的消息框位置,即可實現水平移動進入。實現消息框占滿后,新的消息框替換最近消失的通知的功能。原實現中最多只能顯示10個通知框,當再多時不會顯示(丟失掉),只有騰出位置(通知消失后)才能顯示新的,現在已經優(yōu)化為超出的通知框會替換掉舊通知,不會丟失。
下圖為示例,后半段顯示的內容是設置最多顯示5個消息框時,發(fā)生替換的效果;
//設置通知的數量
Form_Alert.AlertFormNum=5;
Form_Alert.MoveEntry=false;//不水平移動進入
調整下圖標位置,垂直方向居中一些
水平移動進入的效果(默認):
添加顯示時指定消息字體的參數,有需要可直接修改顯示文字的字體。
///summary
///設置完x、y之后執(zhí)行初始化啟動。設置位置、消息類型、顯示、倒計時
////summary
///paramname="msg"/param
///paramname="msgType"/param
///paramname="msgFont"字體,默認不指定即可/param
privatevoidInitStart(stringmsg,MsgTypemsgType,FontmsgFont=null)
//...
}
調用并顯示自定義通知
新建項目NotificationCustom,完成通知框的調用顯示
Form_Alert.ShowNotice("這是一條成功的消息",MsgType.Success);
Form_Alert.ShowNotice("警告!警告的消息",MsgType.Warning);
Form_Alert.ShowNotice("發(fā)生了錯誤,禁止!",MsgType.Error);
Form_Alert.ShowNotice("一條普通的信息記錄",MsgType.Info);
或者顯示時指定字體(下面為隨機字體)
Form_Alert.ShowNotice("這是一條成功的消息",MsgType.Success,newFont(FontFamily.Families[random.Next(0,FontFamily.Families.Length)],(float)(10.0+10.0*random.NextDouble())));
主要實現過程
創(chuàng)建一個無邊框窗體Form_Alert,添加Label(lblMsg)顯示通知消息,添加一個表示關閉的圖片(PictureBox)。設置窗體StartPosition=FormStartPosition.Manual;,后面用于設置其初始位置為指定的屏幕右下角通過不同的背景顏色、不同的圖片(icon,PictureBox)代表不同的消息類型(MsgType)定時器中通過定時時間完成消息窗的顯示(透明度變化)、顯示一定時間、關閉(逐漸透明)整個流程:定義消息窗體不同的操作(NotificationFormAction),start表示開始顯示,顯示窗體并在定時器中處理透明、移入的顯示過程,完全顯示后改變操作狀態(tài)為wait;設置消息窗體顯示等待的時間,操作狀態(tài)變?yōu)閏lose,定時時間之后再次執(zhí)行定時器進入close處理;close過程中定時器執(zhí)行變得透明、移出,完全透明后關閉定時器、關閉窗體。點擊關閉按鈕圖標,窗體狀態(tài)變?yōu)閏lose,定時時間改為close的間隔100每次定時器執(zhí)行函數的結尾記錄下次執(zhí)行的時間,用于判斷當兩個窗體的狀態(tài)相同時,剩余執(zhí)行時間為多少,判斷哪個窗體最先消失,用于完成后面的消息通知太多時,新舊消息框的替換【不嚴謹,尤其在逐漸的顯示和關閉過程中,有著多次的定時器循環(huán),如果想要完全嚴格,可以考慮計算消息窗體最終消失的時間(消息框的狀態(tài),循環(huán)執(zhí)行的剩余次數,每次的間隔時間綜合計算)】ShowNotice()靜態(tài)方法顯示消息框,直接傳遞要顯示的消息和消息類型即可,分為Success,Warning,Error,Info四類,通過指定的AlertFormNum消息框數量(或默認數量),循環(huán)依次顯示消息框,并啟動定時器處理消息框的窗體狀態(tài):漸變顯示(透明度)、顯示一定時間(ShowTime)、漸變消失。循環(huán)中通過Application.OpenForms[fname]獲取通知框窗體,如果沒有獲取到則創(chuàng)建新窗體,并執(zhí)行顯示,結束整個顯示處理;在循環(huán)中記錄已有窗體中最先消失的窗體;如果全部循環(huán)完,則說明所有數量的通知框都存在,則完成對最先消失的窗體的替換并顯示新的消息窗體。
代碼實現
修改后全部代碼不到200行,如下,主要部分已經進行注釋:
namespaceCustomAlertBoxDemo
publicenumNotificationFormAction
start,
wait,
close
publicenumMsgType
Success,
Warning,
Error,
Info
publicpartialclassForm_Alert:Form
///summary
///通知窗體的數量,默認為垂直屏幕幾乎占滿的數量
////summary
privatestaticintalertFormNum=Screen.PrimaryScreen.WorkingArea.Height/(75+5);//75為窗體高度,如果調整窗體高度,記得修改此處
///summary
///通知窗體的數量,默認為垂直屏幕幾乎占滿的數量,手動修改的數量不能超出屏幕和低于1,否則設置無效
////summary
publicstaticintAlertFormNum
get=alertFormNum;
if(value=Screen.PrimaryScreen.WorkingArea.Height/(75+5)value0)
alertFormNum=value;
///summary
///自定義通知的顯示時間,單位為毫秒,默認為3分鐘,之后開始消失??筛鶕枰薷?/p>
////summary
publicstaticintShowTime{get;set;}=3000;
///summary
///是否移動進入,默認true
////summary
publicstaticboolMoveEntry{get;set;}=true;
///summary
///創(chuàng)建通知窗體
////summary
///paramname="name"窗體名稱,必須指定/param
publicForm_Alert(stringname)
InitializeComponent();
Name=name;
this.Opacity=0.0;
ShowInTaskbar=false;
StartPosition=FormStartPosition.Manual;
privateNotificationFormActionaction=NotificationFormAction.start;
///summary
///當前消息框的標準位置
////summary
privateintx,y;
privatevoidtimer1_Tick(objectsender,EventArgse)
switch(this.action)
caseNotificationFormAction.wait:
timer1.Interval=ShowTime;
action=NotificationFormAction.close;
break;
caseNotificationFormAction.start:
this.timer1.Interval=100;
this.Opacity+=0.1;
if(this.xthis.Location.X)
this.Left-=20;//移動快點
else
if(this.Opacity==1.0)
action=NotificationFormAction.wait;
break;
caseNotificationFormAction.close:
timer1.Interval=100;
this.Opacity-=0.1;
this.Left-=20;
if(base.Opacity==0.0)
timer1.Stop();
base.Close();
break;
//tag記錄下次執(zhí)行的時間,用于后續(xù)的替換
timer1.Tag=DateTime.Now.AddMilliseconds(timer1.Interval);
privatevoidpictureBox2_Click(objectsender,EventArgse)
timer1.Interval=100;
action=NotificationFormAction.close;
///summary
///設置完x、y之后執(zhí)行初始化啟動。設置位置、消息類型、顯示、倒計時
////summary
///paramname="msg"/param
///paramname="msgType"/param
privatevoidInitStart(stringmsg,MsgTypemsgType)
//this.Location=newPoint(frm.x,frm.y);
this.Location=newPoint(x+(MoveEntryWidth/2:0),y);
switch(msgType)
caseMsgType.Success:
pictureBox1.Image=Resources.success;
BackColor=Color.SeaGreen;
break;
caseMsgType.Error:
pictureBox1.Image=Resources.error;
BackColor=Color.DarkRed;
break;
caseMsgType.Info:
pictureBox1.Image=R;
BackColor=Color.RoyalBlue;
break;
caseMsgType.Warning:
pictureBox1.Image=Resources.warning;
BackColor=Color.DarkOrange;
break;
lblMsg.Text=msg;
Show();
timer1.Start();
publicstaticvoidShowNotice(stringmsg,MsgTypemsgType)
Form_AlertwillDisappearFrm=null;
for(inti=1;ialertFormNum+1;i++)
stringfname="alert"+i.ToString();
Form_Alertfrm=(Form_Alert)Application.OpenForms[fname];
if(frm==null)
frm=newForm_Alert(fname);
frm.x=Screen.PrimaryScreen.WorkingArea.Width-frm.Width-5;
frm.y=Screen.PrimaryScreen.WorkingArea.Height-frm.Height*i-5*i;
//設置完x、y之后執(zhí)行初始化啟動
frm.InitStart(msg,msgType);
return;
else
if(willDisappearFrm==null)
willDisappearFrm=frm;
else
if(willDisappearFrm.actionfrm.action)
willDisappearFrm=frm;
elseif(willDisappearFrm.action==frm.action)
//不考慮一次沒執(zhí)行的情況
if(willDisappearFrm.timer1.Tag!=nullfrm.timer1.Tag!=null)
if(wi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 區(qū)塊鏈技術在能源管理的創(chuàng)新應用
- 醫(yī)療數據合規(guī)管理與商業(yè)倫理
- 醫(yī)療健康服務的政策支持與可持續(xù)發(fā)展
- 建筑設備自動化總結模版
- 明癬的臨床護理
- 區(qū)塊鏈技術助力教育物資供應鏈的透明與高效
- 醫(yī)療信息化的安全保障措施研究
- 錄像課心得體會模版
- ST段抬高型心肌梗死的臨床護理
- 小兒消化性潰瘍的臨床護理
- 食管癌病人的健康教育
- 中國航天事業(yè)的軍事應用與國防戰(zhàn)略
- 名著復習之革命烈士詩抄
- 人工智能與機器視覺技術應用
- 思想道德與法治2021版第六章第二節(jié)
- 工業(yè)機器人技術畢業(yè)論文范文
- 地球物理勘探-第三章磁法勘探1
- Django 3 Web應用開發(fā)實戰(zhàn)(上篇)
- 施工單位主體驗收自評報告
- 腎臟內科臨床診療指南及操作規(guī)范
- DB32/T 4454-2023智慧化工園區(qū)建設規(guī)范
評論
0/150
提交評論