WindowsForm實現警告消息框

来源:https://www.cnblogs.com/zhuanghamiao/archive/2020/07/17/winform-alert.html
-Advertisement-
Play Games

警告消息框主要是用來向用戶戶展示諸如警告、異常、完成和提示消息。一般實現的效果就是從系統視窗右下角彈出,然後加上些簡單的顯示和消失的動畫。 ###創建警告框視窗 首先我們創建一個警告框視窗(Form),將視窗設置為無邊框(FormBoderStyle=None),添加上圖片和內容顯示控制項 創建好警告 ...


警告消息框主要是用來向用戶戶展示諸如警告、異常、完成和提示消息。一般實現的效果就是從系統視窗右下角彈出,然後加上些簡單的顯示和消失的動畫。

創建警告框視窗

首先我們創建一個警告框視窗(Form),將視窗設置為無邊框(FormBoderStyle=None),添加上圖片和內容顯示控制項

創建好警告框後,我們先讓他能夠從視窗右下角顯示出來,

    public partial class AlertMessageForm : Form
    {
        public AlertMessageForm()
        {
            InitializeComponent();
        }

        private int x, y;

        public void Show(string message)
        {
            this.StartPosition = FormStartPosition.Manual;
            this.x = Screen.PrimaryScreen.WorkingArea.Width - this.Width;
            this.y = Screen.PrimaryScreen.WorkingArea.Height - this.Height;
            this.Location = new Point(x, y);
            labelContent.Text = message;
            this.Show();
        }
    }

警告框顯示和關閉動畫

添加一個計時器,通過時鐘控制視窗背景漸入和淡出

    // 警告框的行為(顯示,停留,退出)
    public enum AlertFormAction
    {
        Start,
        Wait,
        Close
    }

    public partial class AlertMessageForm : Form
    {
        public AlertMessageForm()
        {
            InitializeComponent();
        }

        private int x, y;
        private AlertFormAction action;

        private void timer1_Tick(object sender, EventArgs e)
        {
            switch (action)
            {
                case AlertFormAction.Start:
                    timer1.Interval = 50;//警告顯示的時間
                    this.Opacity += 0.1;
                    if (this.Opacity == 1.0)
                    {
                        action = AlertFormAction.Wait;
                    }
                    break;
                case AlertFormAction.Wait:
                    timer1.Interval = 3000;//警告框停留時間
                    action = AlertFormAction.Close;
                    break;
                case AlertFormAction.Close:
                    timer1.Interval = 50;//警告退出的時間
                    this.Opacity -= 0.1;
                    if (this.Opacity == 0.0)
                    {
                        this.Close();
                    }
                    break;
                default:
                    break;
            }
        }

        public void Show(string message)
        {
            //設置視窗啟始位置
            this.StartPosition = FormStartPosition.Manual;
            this.x = Screen.PrimaryScreen.WorkingArea.Width - this.Width;
            this.y = Screen.PrimaryScreen.WorkingArea.Height - this.Height;
            this.Location = new Point(x, y);

            labelContent.Text = message;
            this.Opacity = 0.0;

            this.Show();

            action = AlertFormAction.Start;
            //啟動時鐘
            timer1.Start();
        }
    }

處理多種不同類型的警告框

添加AlertType枚舉,讓警告框顯示不同類型的消息,根據消息類型變換不同的消息主題顏色,並未Show方法添加警告框類型參數

   public enum AlertType
   {
       Info,
       Success,
       Warning,
       Error
   }

  // 設置警告框主題
  private void SetAlertTheme(AlertType type)
  {
      switch (type)
      {
          case AlertType.Info:
              this.pictureBox1.Image = Properties.Resources.info;
              this.BackColor = Color.RoyalBlue;
              break;
          case AlertType.Success:
              this.pictureBox1.Image = Properties.Resources.success;
              this.BackColor = Color.SeaGreen;
              break;
          case AlertType.Warning:
              this.pictureBox1.Image = Properties.Resources.warning;
              this.BackColor = Color.DarkOrange;
              break;
          case AlertType.Error:
              this.pictureBox1.Image = Properties.Resources.error;
              this.BackColor = Color.DarkRed;
              break;
          default:
              break;
      }
  }

  // 顯示警告框
  public void Show(string message, AlertType type){
    // ...
    SetAlertTheme(type);
  }
      

處理多個警告框重疊問題

當然,完成上面的處理是不夠的,當有多個消息的時候,消息框會重疊在一起;多個消息時,需要將消息視窗按一定的規則排列,這裡我們設置每個消息視窗間隔一定的距離

        public void Show(string message, AlertType type)
        {
            // 設置視窗啟始位置
            this.StartPosition = FormStartPosition.Manual;

            // 設置程式每個打開的消息視窗的位置,超過10個就不做處理,這個可以根據自己的需求設定
            string fname;
            for (int i = 1; i < 10; i++)
            {
                fname = "alert" + i.ToString();
                AlertMessageForm alert = (AlertMessageForm)Application.OpenForms[fname];
                if (alert == null)
                {
                    this.Name = fname;
                    this.x = Screen.PrimaryScreen.WorkingArea.Width - this.Width;
                    this.y = Screen.PrimaryScreen.WorkingArea.Height - this.Height * i - 5 * i;
                    this.Location = new Point(x, y);
                    break;
                }
            }

            labelContent.Text = message;
            this.Opacity = 0.0;
            SetAlertTheme(type);
            this.Show();

            action = AlertFormAction.Start;
            //啟動時鐘
            timer1.Start();
        }

滑鼠懸停警告框處理

想要警告框停留的時間長一些,一中方式是直接設置警告框停留的時間長一些,另一種方式是通過判斷滑鼠在警告框視窗是否懸停,所以可以通過滑鼠的懸停和離開事件進行處理

        private void AlertMessageForm_MouseMove(object sender, MouseEventArgs e)
        {
            this.Opacity = 1.0;
            timer1.Interval = int.MaxValue;//警告框停留時間
            action = AlertFormAction.Close;
        }

        private void AlertMessageForm_MouseLeave(object sender, EventArgs e)
        {
            this.Opacity = 1.0;
            timer1.Interval = 3000;//警告框停留時間
            action = AlertFormAction.Close;
        }

警告框的完整代碼

    public enum AlertType
    {
        Info,
        Success,
        Warning,
        Error
    }

    public enum AlertFormAction
    {
        Start,
        Wait,
        Close
    }

    public partial class AlertMessageForm : Form
    {
        public AlertMessageForm()
        {
            InitializeComponent();
        }

        private int x, y;
        private AlertFormAction action;

        private void timer1_Tick(object sender, EventArgs e)
        {
            switch (action)
            {
                case AlertFormAction.Start:
                    timer1.Interval = 50;//警告顯示的時間
                    this.Opacity += 0.1;
                    if (this.Opacity == 1.0)
                    {
                        action = AlertFormAction.Wait;
                    }
                    break;
                case AlertFormAction.Wait:
                    timer1.Interval = 3000;//警告框停留時間
                    action = AlertFormAction.Close;
                    break;
                case AlertFormAction.Close:
                    timer1.Interval = 50;//警告關閉的時間
                    this.Opacity -= 0.1;
                    if (this.Opacity == 0.0)
                    {
                        this.Close();
                    }
                    break;
                default:
                    break;
            }
        }

        public void Show(string message, AlertType type)
        {
            // 設置視窗啟始位置
            this.StartPosition = FormStartPosition.Manual;

            // 設置程式每個打開的消息視窗的位置,超過10個就不做處理,這個可以根據自己的需求設定
            string fname;
            for (int i = 1; i < 10; i++)
            {
                fname = "alert" + i.ToString();
                AlertMessageForm alert = (AlertMessageForm)Application.OpenForms[fname];
                if (alert == null)
                {
                    this.Name = fname;
                    this.x = Screen.PrimaryScreen.WorkingArea.Width - this.Width;
                    this.y = Screen.PrimaryScreen.WorkingArea.Height - this.Height * i - 5 * i;
                    this.Location = new Point(x, y);
                    break;
                }
            }

            labelContent.Text = message;
            this.Opacity = 0.0;
            SetAlertTheme(type);
            this.Show();

            action = AlertFormAction.Start;
            //啟動時鐘
            timer1.Start();
        }

        private void AlertMessageForm_MouseMove(object sender, MouseEventArgs e)
        {
            this.Opacity = 1.0;
            timer1.Interval = int.MaxValue;//警告框停留時間
            action = AlertFormAction.Close;
        }

        private void AlertMessageForm_MouseLeave(object sender, EventArgs e)
        {
            this.Opacity = 1.0;
            timer1.Interval = 3000;//警告框停留時間
            action = AlertFormAction.Close;
        }

        private void buttonClose_Click(object sender, EventArgs e)
        {
            // 註銷滑鼠事件
            this.MouseLeave-= new System.EventHandler(this.AlertMessageForm_MouseLeave);
            this.MouseMove -= new System.Windows.Forms.MouseEventHandler(this.AlertMessageForm_MouseMove);

            timer1.Interval = 50;//警告關閉的時間
            this.Opacity -= 0.1;
            if (this.Opacity == 0.0)
            {
                this.Close();
            }
        }

        // 設置警告框主題
        private void SetAlertTheme(AlertType type)
        {
            switch (type)
            {
                case AlertType.Info:
                    this.pictureBox1.Image = Properties.Resources.info;
                    this.BackColor = Color.RoyalBlue;
                    break;
                case AlertType.Success:
                    this.pictureBox1.Image = Properties.Resources.success;
                    this.BackColor = Color.SeaGreen;
                    break;
                case AlertType.Warning:
                    this.pictureBox1.Image = Properties.Resources.warning;
                    this.BackColor = Color.DarkOrange;
                    break;
                case AlertType.Error:
                    this.pictureBox1.Image = Properties.Resources.error;
                    this.BackColor = Color.DarkRed;
                    break;
                default:
                    break;
            }
        }
    }

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 伺服器好端端的竟然中了挖礦病毒!!! 可憐我那 1 核 2 G 的伺服器,又弱又小,卻還免除不了被拉去當礦工的命運,實在是慘啊慘。 事情原來是這樣的。。。 就在今天下午,我準備登陸自己的遠程伺服器搞點東西的時候,突然發現 ssh 登陸不上了。 如上,提示被拒絕。這個問題很明顯就是伺服器沒有我的 ...
  • 前言 每一個孩子都像星空中的一顆星星,散髮著自己所特有的光芒照亮著整個夜空。今天就帶大家用27行Python代碼繪製一幅滿天星吧。 全局設置 在繪製滿天星的過程中要運用到turtle工具,它是Python的標準庫,也可以形象的稱它為海龜庫,它可以描繪繪圖的軌跡,操作簡單、快捷。首先,我們要做一些有關 ...
  • 話說Laravel7便捷的字元串操作 用過Laravel的朋友都知道,Laravel內置的字元串處理函數有瞭解,Illuminate\Support\Str類。 Laravel 7 現在基於這些函數提供了一個更加面向對象的、更加流暢的字元串操作庫。你可以使用 String::of 創建一個 Illu ...
  • 一、新建項目示例使用IDEA快速創建基於SpringBoot的工程。springboot 2.3.1java 8WebFlux 必須選用Reactive的庫POM 依賴 org.springframework.boot spring-boot-starter-webflux 二、Controller... ...
  • 前言 Dubbo是一個分散式服務框架,致力於提供高性能和透明化的RPC遠程服務調用方案,以及SOA服務治理方案。簡單的說,dubbo就是個服務框架,如果沒有分散式的需求,其實是不需要用的,只有在分散式的時候,才有dubbo這樣的分散式服務框架的需求,並且本質上是個服務調用的東東,說白了就是個遠程服務 ...
  • 條件語句 Go的條件語句和其它語言類似,主要是不支持三目運算符所以?:這種條件判斷是不支持的。Go提供的條件判斷語句主要有 if 還有 switch這兩種形式下麵是 if條件語句 if的幾種寫法,基本上和其它語言是一致的 if 條件 { } else { } if 條件 { } else if 條件 ...
  • 上次我們說到 微服務架構的前世今生(七):微服務架構生態體系 ,這次我們在說說微服務架構的技術支持。作者 哈嘍沃德先生,歡迎關註。 一、Spring Cloud Spring Cloud Netflix Eureka:服務註冊中心。 Spring Cloud Zookeeper:服務註冊中心。 Sp ...
  • 讀寫鎖實現邏輯相對比較複雜,但是卻是一個經常使用到的功能,希望將我對ReentrantReadWriteLock的源碼的理解記錄下來,可以對大家有幫助 前提條件 在理解ReentrantReadWriteLock時需要具備一些基本的知識 理解AQS的實現原理 之前有寫過一篇《深入淺出AQS源碼解析》 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...