C#Winform實現(xiàn)自定義漂亮的通知效果_第1頁
C#Winform實現(xiàn)自定義漂亮的通知效果_第2頁
C#Winform實現(xiàn)自定義漂亮的通知效果_第3頁
C#Winform實現(xiàn)自定義漂亮的通知效果_第4頁
C#Winform實現(xiàn)自定義漂亮的通知效果_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第C#Winform實現(xiàn)自定義漂亮的通知效果目錄前言優(yōu)化調(diào)整調(diào)用并顯示自定義通知主要實現(xiàn)過程代碼實現(xiàn)

前言

本文主要介紹其具體的實現(xiàn)思路(視頻僅有代碼輸入,并無過程介紹等),同時,在原本實現(xiàn)的基礎(chǔ)上,進行了多處修改和優(yōu)化,具體參見下面的內(nèi)容。

優(yōu)化調(diào)整

下面是對源代碼的修改、優(yōu)化和調(diào)整:

修改lblMsg(Label)的AutoSize為false,盡可能多占通知窗體區(qū)域,Anchor跟隨窗體變換,文字左側(cè)垂直居中,用于顯示可能更多的消息.設(shè)定action、timer1默認值,Name、Opacity、StartPosition(Manual)在構(gòu)造函數(shù)中指定,這樣就不用每次創(chuàng)建通知窗體時進行賦值了。ShowInTaskbar=false;通知窗體不在任務(wù)欄顯示。將原有代碼中定時器時間間隔調(diào)整到100毫秒,原設(shè)置為1,時間太短人眼看不出區(qū)別,白白浪費計算。ShowNotice()改為靜態(tài)方法,直接通過Form_Alert.ShowNotice(msg,msgType);調(diào)用顯示窗體,不用new創(chuàng)建對象再調(diào)用。AlertFormNum靜態(tài)屬性設(shè)置最多顯示的通知數(shù)量,默認盡可能多的占滿垂直屏幕,手動設(shè)置數(shù)量不能低于1或超出屏幕。ShowTime靜態(tài)屬性設(shè)置完全顯示后通知的顯示時間,單位毫秒;也可以擴展?jié)u變顯示和消失的時間。MoveEntry靜態(tài)屬性設(shè)置消息框是否水平移動進入,默認true。通過設(shè)置初始的消息框位置,即可實現(xiàn)水平移動進入。實現(xiàn)消息框占滿后,新的消息框替換最近消失的通知的功能。原實現(xiàn)中最多只能顯示10個通知框,當(dāng)再多時不會顯示(丟失掉),只有騰出位置(通知消失后)才能顯示新的,現(xiàn)在已經(jīng)優(yōu)化為超出的通知框會替換掉舊通知,不會丟失。

下圖為示例,后半段顯示的內(nèi)容是設(shè)置最多顯示5個消息框時,發(fā)生替換的效果;

//設(shè)置通知的數(shù)量

Form_Alert.AlertFormNum=5;

Form_Alert.MoveEntry=false;//不水平移動進入

調(diào)整下圖標(biāo)位置,垂直方向居中一些

水平移動進入的效果(默認):

添加顯示時指定消息字體的參數(shù),有需要可直接修改顯示文字的字體。

///summary

///設(shè)置完x、y之后執(zhí)行初始化啟動。設(shè)置位置、消息類型、顯示、倒計時

////summary

///paramname="msg"/param

///paramname="msgType"/param

///paramname="msgFont"字體,默認不指定即可/param

privatevoidInitStart(stringmsg,MsgTypemsgType,FontmsgFont=null)

//...

}

調(diào)用并顯示自定義通知

新建項目NotificationCustom,完成通知框的調(diào)用顯示

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())));

主要實現(xiàn)過程

創(chuàng)建一個無邊框窗體Form_Alert,添加Label(lblMsg)顯示通知消息,添加一個表示關(guān)閉的圖片(PictureBox)。設(shè)置窗體StartPosition=FormStartPosition.Manual;,后面用于設(shè)置其初始位置為指定的屏幕右下角通過不同的背景顏色、不同的圖片(icon,PictureBox)代表不同的消息類型(MsgType)定時器中通過定時時間完成消息窗的顯示(透明度變化)、顯示一定時間、關(guān)閉(逐漸透明)整個流程:定義消息窗體不同的操作(NotificationFormAction),start表示開始顯示,顯示窗體并在定時器中處理透明、移入的顯示過程,完全顯示后改變操作狀態(tài)為wait;設(shè)置消息窗體顯示等待的時間,操作狀態(tài)變?yōu)閏lose,定時時間之后再次執(zhí)行定時器進入close處理;close過程中定時器執(zhí)行變得透明、移出,完全透明后關(guān)閉定時器、關(guān)閉窗體。點擊關(guān)閉按鈕圖標(biāo),窗體狀態(tài)變?yōu)閏lose,定時時間改為close的間隔100每次定時器執(zhí)行函數(shù)的結(jié)尾記錄下次執(zhí)行的時間,用于判斷當(dāng)兩個窗體的狀態(tài)相同時,剩余執(zhí)行時間為多少,判斷哪個窗體最先消失,用于完成后面的消息通知太多時,新舊消息框的替換【不嚴謹,尤其在逐漸的顯示和關(guān)閉過程中,有著多次的定時器循環(huán),如果想要完全嚴格,可以考慮計算消息窗體最終消失的時間(消息框的狀態(tài),循環(huán)執(zhí)行的剩余次數(shù),每次的間隔時間綜合計算)】ShowNotice()靜態(tài)方法顯示消息框,直接傳遞要顯示的消息和消息類型即可,分為Success,Warning,Error,Info四類,通過指定的AlertFormNum消息框數(shù)量(或默認數(shù)量),循環(huán)依次顯示消息框,并啟動定時器處理消息框的窗體狀態(tài):漸變顯示(透明度)、顯示一定時間(ShowTime)、漸變消失。循環(huán)中通過Application.OpenForms[fname]獲取通知框窗體,如果沒有獲取到則創(chuàng)建新窗體,并執(zhí)行顯示,結(jié)束整個顯示處理;在循環(huán)中記錄已有窗體中最先消失的窗體;如果全部循環(huán)完,則說明所有數(shù)量的通知框都存在,則完成對最先消失的窗體的替換并顯示新的消息窗體。

代碼實現(xiàn)

修改后全部代碼不到200行,如下,主要部分已經(jīng)進行注釋:

namespaceCustomAlertBoxDemo

publicenumNotificationFormAction

start,

wait,

close

publicenumMsgType

Success,

Warning,

Error,

Info

publicpartialclassForm_Alert:Form

///summary

///通知窗體的數(shù)量,默認為垂直屏幕幾乎占滿的數(shù)量

////summary

privatestaticintalertFormNum=Screen.PrimaryScreen.WorkingArea.Height/(75+5);//75為窗體高度,如果調(diào)整窗體高度,記得修改此處

///summary

///通知窗體的數(shù)量,默認為垂直屏幕幾乎占滿的數(shù)量,手動修改的數(shù)量不能超出屏幕和低于1,否則設(shè)置無效

////summary

publicstaticintAlertFormNum

get=alertFormNum;

if(value=Screen.PrimaryScreen.WorkingArea.Height/(75+5)value0)

alertFormNum=value;

///summary

///自定義通知的顯示時間,單位為毫秒,默認為3分鐘,之后開始消失。可根據(jù)需要修改

////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

///當(dāng)前消息框的標(biāo)準位置

////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

///設(shè)置完x、y之后執(zhí)行初始化啟動。設(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í)行初始化啟動

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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論