<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文主要介紹其具體的實現思路(視訊僅有程式碼輸入,並無過程介紹等),同時,在原本實現的基礎上,進行了多處修改和優化,具體參見下面的內容。
下面是對原始碼的修改、優化和調整:
ShowInTaskbar = false;
通知表單不在工作列顯示。ShowNotice()
改為靜態方法,直接通過Form_Alert.ShowNotice(msg, msgType);
呼叫顯示錶單,不用new建立物件再呼叫。AlertFormNum
靜態屬性設定最多顯示的通知數量,預設儘可能多的佔滿垂直螢幕,手動設定數量不能低於1或超出螢幕。ShowTime
靜態屬性設定完全顯示後通知的顯示時間,單位毫秒;也可以擴充套件漸變顯示和消失的時間。MoveEntry
靜態屬性設定訊息方塊是否水平移動進入,預設true。通過設定初始的訊息方塊位置,即可實現水平移動進入。下圖為範例,後半段顯示的內容是設定最多顯示5個訊息方塊時,發生替換的效果;
// 設定通知的數量 Form_Alert.AlertFormNum = 5; Form_Alert.MoveEntry = false;// 不水平移動進入
水平移動進入的效果(預設):
/// <summary> /// 設定完x、y之後執行初始化啟動。設定位置、訊息型別、顯示、倒計時 /// </summary> /// <param name="msg"></param> /// <param name="msgType"></param> /// <param name="msgFont">字型,預設不指定即可</param> private void InitStart(string msg, MsgType msgType, Font msgFont = null) { // ... }
新建專案NotificationCustom
,完成通知框的呼叫顯示
Form_Alert.ShowNotice("這是一條成功的訊息", MsgType.Success); Form_Alert.ShowNotice("警告!警告的訊息", MsgType.Warning); Form_Alert.ShowNotice("發生了錯誤,禁止!", MsgType.Error); Form_Alert.ShowNotice("一條普通的資訊記錄", MsgType.Info);
或者顯示時指定字型(下面為隨機字型)
Form_Alert.ShowNotice("這是一條成功的訊息", MsgType.Success, new Font(FontFamily.Families[random.Next(0, FontFamily.Families.Length)], (float)(10.0+10.0*random.NextDouble())));
lblMsg
)顯示通知訊息,新增一個表示關閉的圖片(PictureBox)。StartPosition = FormStartPosition.Manual;
,後面用於設定其初始位置為指定的螢幕右下角MsgType
)NotificationFormAction
),start表示開始顯示,顯示錶單並在定時器中處理透明、移入的顯示過程,完全顯示後改變操作狀態為wait;設定訊息表單顯示等待的時間,操作狀態變為close,定時時間之後再次執行定時器進入close處理;close過程中定時器執行變得透明、移出,完全透明後關閉定時器、關閉表單。ShowNotice()
靜態方法顯示訊息方塊,直接傳遞要顯示的訊息和訊息型別即可,分為Success
,Warning
,Error
,Info
四類,通過指定的 AlertFormNum 訊息方塊數量(或預設數量),迴圈依次顯示訊息方塊,並啟動定時器處理訊息方塊的表單狀態:漸變顯示(透明度)、顯示一定時間(ShowTime)、漸變消失。迴圈中通過Application.OpenForms[fname]
獲取通知框表單,如果沒有獲取到則建立新表單,並執行顯示,結束整個顯示處理;在迴圈中記錄已有表單中最先消失的表單;如果全部迴圈完,則說明所有數量的通知框都存在,則完成對最先消失的表單的替換並顯示新的訊息表單。修改後全部程式碼不到200行,如下,主要部分已經進行註釋:
namespace CustomAlertBoxDemo { public enum NotificationFormAction { start, wait, close } public enum MsgType { Success, Warning, Error, Info } public partial class Form_Alert : Form { /// <summary> /// 通知表單的數量,預設為垂直螢幕幾乎佔滿的數量 /// </summary> private static int alertFormNum = Screen.PrimaryScreen.WorkingArea.Height / (75 + 5); // 75為表單高度,如果調整表單高度,記得修改此處 /// <summary> /// 通知表單的數量,預設為垂直螢幕幾乎佔滿的數量,手動修改的數量不能超出螢幕和低於1,否則設定無效 /// </summary> public static int AlertFormNum { get => alertFormNum; set { if (value <= Screen.PrimaryScreen.WorkingArea.Height / (75 + 5) && value > 0) { alertFormNum = value; } } } /// <summary> /// 自定義通知的顯示時間,單位為毫秒,預設為3分鐘,之後開始消失。可根據需要修改 /// </summary> public static int ShowTime { get; set; } = 3000; /// <summary> /// 是否移動進入,預設true /// </summary> public static bool MoveEntry { get; set; } = true; /// <summary> /// 建立通知表單 /// </summary> /// <param name="name">表單名稱,必須指定</param> public Form_Alert(string name) { InitializeComponent(); Name = name; this.Opacity = 0.0; ShowInTaskbar = false; StartPosition = FormStartPosition.Manual; } private NotificationFormAction action = NotificationFormAction.start; /// <summary> /// 當前訊息方塊的標準位置 /// </summary> private int x, y; private void timer1_Tick(object sender, EventArgs e) { switch (this.action) { case NotificationFormAction.wait: timer1.Interval = ShowTime; action = NotificationFormAction.close; break; case NotificationFormAction.start: this.timer1.Interval = 100; this.Opacity += 0.1; if (this.x < this.Location.X) { this.Left-=20; // 移動快點 } else { if (this.Opacity == 1.0) { action = NotificationFormAction.wait; } } break; case NotificationFormAction.close: timer1.Interval = 100; this.Opacity -= 0.1; this.Left -= 20; if (base.Opacity == 0.0) { timer1.Stop(); base.Close(); } break; } // tag記錄下次執行的時間,用於後續的替換 timer1.Tag = DateTime.Now.AddMilliseconds(timer1.Interval); } private void pictureBox2_Click(object sender, EventArgs e) { timer1.Interval = 100; action = NotificationFormAction.close; } /// <summary> /// 設定完x、y之後執行初始化啟動。設定位置、訊息型別、顯示、倒計時 /// </summary> /// <param name="msg"></param> /// <param name="msgType"></param> private void InitStart(string msg, MsgType msgType) { //this.Location = new Point(frm.x, frm.y); this.Location = new Point(x + (MoveEntry?Width / 2:0), y); switch (msgType) { case MsgType.Success: pictureBox1.Image = Resources.success; BackColor = Color.SeaGreen; break; case MsgType.Error: pictureBox1.Image = Resources.error; BackColor = Color.DarkRed; break; case MsgType.Info: pictureBox1.Image = Resources.info; BackColor = Color.RoyalBlue; break; case MsgType.Warning: pictureBox1.Image = Resources.warning; BackColor = Color.DarkOrange; break; } lblMsg.Text = msg; Show(); timer1.Start(); } public static void ShowNotice(string msg, MsgType msgType) { Form_Alert willDisappearFrm = null; for (int i = 1; i < alertFormNum+1; i++) { string fname = "alert" + i.ToString(); Form_Alert frm = (Form_Alert)Application.OpenForms[fname]; if (frm == null) { frm = new Form_Alert(fname); frm.x = Screen.PrimaryScreen.WorkingArea.Width - frm.Width - 5; frm.y = Screen.PrimaryScreen.WorkingArea.Height - frm.Height * i - 5 * i; // 設定完x、y之後執行初始化啟動 frm.InitStart(msg, msgType); return; } else { if (willDisappearFrm == null) { willDisappearFrm = frm; } else { if (willDisappearFrm.action < frm.action) { willDisappearFrm = frm; } else if (willDisappearFrm.action == frm.action) { // 不考慮一次沒執行的情況 if (willDisappearFrm.timer1.Tag!=null&& frm.timer1.Tag != null) { if (willDisappearFrm.timer1.Tag == null) { willDisappearFrm = frm; } else if(frm.timer1.Tag != null) { if ((DateTime)willDisappearFrm.timer1.Tag > (DateTime)frm.timer1.Tag) { willDisappearFrm = frm; } } } } } } } // 當前最早要消失的表單willDisappearFrm被替換 var newfrm = new Form_Alert(willDisappearFrm.Name); newfrm.x = Screen.PrimaryScreen.WorkingArea.Width - newfrm.Width - 5; newfrm.y = willDisappearFrm.Location.Y; // 必須立即替換name var totalNum = 0; foreach (Form form in Application.OpenForms) { if (form is Form_Alert) { totalNum += 1; } } willDisappearFrm.Name = $"Form_Alert{totalNum + 1}"; willDisappearFrm.pictureBox2_Click(null, null); // 設定完x、y之後執行初始化啟動 newfrm.InitStart(msg, msgType); } } }
到此這篇關於C# Winform實現自定義漂亮的通知效果的文章就介紹到這了,更多相關C# Winform通知效果內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45