




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C#Winform實(shí)現(xiàn)自定義漂亮的通知效果目錄前言?xún)?yōu)化調(diào)整調(diào)用并顯示自定義通知主要實(shí)現(xiàn)過(guò)程代碼實(shí)現(xiàn)
前言
本文主要介紹其具體的實(shí)現(xiàn)思路(視頻僅有代碼輸入,并無(wú)過(guò)程介紹等),同時(shí),在原本實(shí)現(xiàn)的基礎(chǔ)上,進(jìn)行了多處修改和優(yōu)化,具體參見(jiàn)下面的內(nèi)容。
優(yōu)化調(diào)整
下面是對(duì)源代碼的修改、優(yōu)化和調(diào)整:
修改lblMsg(Label)的AutoSize為false,盡可能多占通知窗體區(qū)域,Anchor跟隨窗體變換,文字左側(cè)垂直居中,用于顯示可能更多的消息.設(shè)定action、timer1默認(rèn)值,Name、Opacity、StartPosition(Manual)在構(gòu)造函數(shù)中指定,這樣就不用每次創(chuàng)建通知窗體時(shí)進(jìn)行賦值了。ShowInTaskbar=false;通知窗體不在任務(wù)欄顯示。將原有代碼中定時(shí)器時(shí)間間隔調(diào)整到100毫秒,原設(shè)置為1,時(shí)間太短人眼看不出區(qū)別,白白浪費(fèi)計(jì)算。ShowNotice()改為靜態(tài)方法,直接通過(guò)Form_Alert.ShowNotice(msg,msgType);調(diào)用顯示窗體,不用new創(chuàng)建對(duì)象再調(diào)用。AlertFormNum靜態(tài)屬性設(shè)置最多顯示的通知數(shù)量,默認(rèn)盡可能多的占滿(mǎn)垂直屏幕,手動(dòng)設(shè)置數(shù)量不能低于1或超出屏幕。ShowTime靜態(tài)屬性設(shè)置完全顯示后通知的顯示時(shí)間,單位毫秒;也可以擴(kuò)展?jié)u變顯示和消失的時(shí)間。MoveEntry靜態(tài)屬性設(shè)置消息框是否水平移動(dòng)進(jìn)入,默認(rèn)true。通過(guò)設(shè)置初始的消息框位置,即可實(shí)現(xiàn)水平移動(dòng)進(jìn)入。實(shí)現(xiàn)消息框占滿(mǎn)后,新的消息框替換最近消失的通知的功能。原實(shí)現(xiàn)中最多只能顯示10個(gè)通知框,當(dāng)再多時(shí)不會(huì)顯示(丟失掉),只有騰出位置(通知消失后)才能顯示新的,現(xiàn)在已經(jīng)優(yōu)化為超出的通知框會(huì)替換掉舊通知,不會(huì)丟失。
下圖為示例,后半段顯示的內(nèi)容是設(shè)置最多顯示5個(gè)消息框時(shí),發(fā)生替換的效果;
//設(shè)置通知的數(shù)量
Form_Alert.AlertFormNum=5;
Form_Alert.MoveEntry=false;//不水平移動(dòng)進(jìn)入
調(diào)整下圖標(biāo)位置,垂直方向居中一些
水平移動(dòng)進(jìn)入的效果(默認(rèn)):
添加顯示時(shí)指定消息字體的參數(shù),有需要可直接修改顯示文字的字體。
///summary
///設(shè)置完x、y之后執(zhí)行初始化啟動(dòng)。設(shè)置位置、消息類(lèi)型、顯示、倒計(jì)時(shí)
////summary
///paramname="msg"/param
///paramname="msgType"/param
///paramname="msgFont"字體,默認(rèn)不指定即可/param
privatevoidInitStart(stringmsg,MsgTypemsgType,FontmsgFont=null)
//...
}
調(diào)用并顯示自定義通知
新建項(xiàng)目NotificationCustom,完成通知框的調(diào)用顯示
Form_Alert.ShowNotice("這是一條成功的消息",MsgType.Success);
Form_Alert.ShowNotice("警告!警告的消息",MsgType.Warning);
Form_Alert.ShowNotice("發(fā)生了錯(cuò)誤,禁止!",MsgType.Error);
Form_Alert.ShowNotice("一條普通的信息記錄",MsgType.Info);
或者顯示時(shí)指定字體(下面為隨機(jī)字體)
Form_Alert.ShowNotice("這是一條成功的消息",MsgType.Success,newFont(FontFamily.Families[random.Next(0,FontFamily.Families.Length)],(float)(10.0+10.0*random.NextDouble())));
主要實(shí)現(xiàn)過(guò)程
創(chuàng)建一個(gè)無(wú)邊框窗體Form_Alert,添加Label(lblMsg)顯示通知消息,添加一個(gè)表示關(guān)閉的圖片(PictureBox)。設(shè)置窗體StartPosition=FormStartPosition.Manual;,后面用于設(shè)置其初始位置為指定的屏幕右下角通過(guò)不同的背景顏色、不同的圖片(icon,PictureBox)代表不同的消息類(lèi)型(MsgType)定時(shí)器中通過(guò)定時(shí)時(shí)間完成消息窗的顯示(透明度變化)、顯示一定時(shí)間、關(guān)閉(逐漸透明)整個(gè)流程:定義消息窗體不同的操作(NotificationFormAction),start表示開(kāi)始顯示,顯示窗體并在定時(shí)器中處理透明、移入的顯示過(guò)程,完全顯示后改變操作狀態(tài)為wait;設(shè)置消息窗體顯示等待的時(shí)間,操作狀態(tài)變?yōu)閏lose,定時(shí)時(shí)間之后再次執(zhí)行定時(shí)器進(jìn)入close處理;close過(guò)程中定時(shí)器執(zhí)行變得透明、移出,完全透明后關(guān)閉定時(shí)器、關(guān)閉窗體。點(diǎn)擊關(guān)閉按鈕圖標(biāo),窗體狀態(tài)變?yōu)閏lose,定時(shí)時(shí)間改為close的間隔100每次定時(shí)器執(zhí)行函數(shù)的結(jié)尾記錄下次執(zhí)行的時(shí)間,用于判斷當(dāng)兩個(gè)窗體的狀態(tài)相同時(shí),剩余執(zhí)行時(shí)間為多少,判斷哪個(gè)窗體最先消失,用于完成后面的消息通知太多時(shí),新舊消息框的替換【不嚴(yán)謹(jǐn),尤其在逐漸的顯示和關(guān)閉過(guò)程中,有著多次的定時(shí)器循環(huán),如果想要完全嚴(yán)格,可以考慮計(jì)算消息窗體最終消失的時(shí)間(消息框的狀態(tài),循環(huán)執(zhí)行的剩余次數(shù),每次的間隔時(shí)間綜合計(jì)算)】ShowNotice()靜態(tài)方法顯示消息框,直接傳遞要顯示的消息和消息類(lèi)型即可,分為Success,Warning,Error,Info四類(lèi),通過(guò)指定的AlertFormNum消息框數(shù)量(或默認(rèn)數(shù)量),循環(huán)依次顯示消息框,并啟動(dòng)定時(shí)器處理消息框的窗體狀態(tài):漸變顯示(透明度)、顯示一定時(shí)間(ShowTime)、漸變消失。循環(huán)中通過(guò)Application.OpenForms[fname]獲取通知框窗體,如果沒(méi)有獲取到則創(chuàng)建新窗體,并執(zhí)行顯示,結(jié)束整個(gè)顯示處理;在循環(huán)中記錄已有窗體中最先消失的窗體;如果全部循環(huán)完,則說(shuō)明所有數(shù)量的通知框都存在,則完成對(duì)最先消失的窗體的替換并顯示新的消息窗體。
代碼實(shí)現(xiàn)
修改后全部代碼不到200行,如下,主要部分已經(jīng)進(jìn)行注釋?zhuān)?/p>
namespaceCustomAlertBoxDemo
publicenumNotificationFormAction
start,
wait,
close
publicenumMsgType
Success,
Warning,
Error,
Info
publicpartialclassForm_Alert:Form
///summary
///通知窗體的數(shù)量,默認(rèn)為垂直屏幕幾乎占滿(mǎn)的數(shù)量
////summary
privatestaticintalertFormNum=Screen.PrimaryScreen.WorkingArea.Height/(75+5);//75為窗體高度,如果調(diào)整窗體高度,記得修改此處
///summary
///通知窗體的數(shù)量,默認(rèn)為垂直屏幕幾乎占滿(mǎn)的數(shù)量,手動(dòng)修改的數(shù)量不能超出屏幕和低于1,否則設(shè)置無(wú)效
////summary
publicstaticintAlertFormNum
get=alertFormNum;
if(value=Screen.PrimaryScreen.WorkingArea.Height/(75+5)value0)
alertFormNum=value;
///summary
///自定義通知的顯示時(shí)間,單位為毫秒,默認(rèn)為3分鐘,之后開(kāi)始消失??筛鶕?jù)需要修改
////summary
publicstaticintShowTime{get;set;}=3000;
///summary
///是否移動(dòng)進(jìn)入,默認(rèn)true
////summary
publicstaticboolMoveEntry{get;set;}=true;
///summary
///創(chuàng)建通知窗體
////summary
///paramname="name"窗體名稱(chēng),必須指定/param
publicForm_Alert(stringname)
InitializeComponent();
Name=name;
this.Opacity=0.0;
ShowInTaskbar=false;
StartPosition=FormStartPosition.Manual;
privateNotificationFormActionaction=NotificationFormAction.start;
///summary
///當(dāng)前消息框的標(biāo)準(zhǔn)位置
////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;//移動(dòng)快點(diǎn)
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í)行的時(shí)間,用于后續(xù)的替換
timer1.Tag=DateTime.Now.AddMilliseconds(timer1.Interval);
privatevoidpictureBox2_Click(objectsender,EventArgse)
timer1.Interval=100;
action=NotificationFormAction.close;
///summary
///設(shè)置完x、y之后執(zhí)行初始化啟動(dòng)。設(shè)置位置、消息類(lèi)型、顯示、倒計(jì)時(shí)
////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;
//設(shè)置完x、y之后執(zhí)行初始化啟動(dòng)
frm.InitStart(msg,msgType);
return;
else
if(willDisappearFrm==null)
willDisappearFrm=frm;
else
if(willDisappearFrm.actionfrm.action)
willDisappearFrm=frm;
elseif(willDisappearFrm.action==frm.action)
//不考慮一次沒(méi)執(zhí)行的情況
if(willDisappearFrm.timer1.Tag!=nullfrm.timer1.Tag!=null)
if(wi
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人工智能領(lǐng)域人才引進(jìn)措施
- 特殊學(xué)生遠(yuǎn)程教育幫扶措施
- 機(jī)電安裝施工進(jìn)度計(jì)劃和工期保證措施
- 2025高一下學(xué)期物理作業(yè)布置計(jì)劃
- 混凝土工程施工質(zhì)量驗(yàn)收措施
- 西師版五年級(jí)下冊(cè)數(shù)學(xué)學(xué)科競(jìng)賽計(jì)劃
- 2025幼兒園保教安全管理計(jì)劃
- 高校英語(yǔ)興趣小組比賽活動(dòng)計(jì)劃
- 中華師道視角的智慧校園建設(shè)范文
- 2025年職業(yè)技術(shù)院校教師培訓(xùn)計(jì)劃
- 2025年內(nèi)蒙古自治區(qū)中考數(shù)學(xué)真題試卷(含答案)
- CT增強(qiáng)掃描造影劑外滲的預(yù)防與處理
- 深靜脈置管的維護(hù)與護(hù)理
- Unit 2 Home Sweet Home 第6課時(shí)(Project Reading Plus) 2025-2026學(xué)年人教版英語(yǔ)八年級(jí)下冊(cè)
- 孤獨(dú)癥業(yè)務(wù)管理制度
- xx公司獎(jiǎng)金管理制度
- 勞務(wù)服務(wù)購(gòu)買(mǎi)協(xié)議書(shū)范本
- 2025-2030年中國(guó)生物醫(yī)學(xué)材料行業(yè)市場(chǎng)深度分析及發(fā)展前景與投資研究報(bào)告
- 2025年小學(xué)語(yǔ)文一年級(jí)下冊(cè)無(wú)紙筆測(cè)試題(小學(xué)一年級(jí)游園樂(lè)考無(wú)紙化檢測(cè))
- 2025至2030中國(guó)彈簧鋼行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 2025年地理中考時(shí)政熱點(diǎn)復(fù)習(xí)課件
評(píng)論
0/150
提交評(píng)論