国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【C#】分享一個可攜帶附加消息的增強消息框MessageBoxEx

2019-11-17 02:16:36
字體:
來源:轉載
供稿:網友
【C#】分享一個可攜帶附加消息的增強消息框MessageBoxEx

--------------201507160917更新---------------

  • 無意中發現標準消息框在Windows7是有聲音的,只是在Windows Server 2008(R2)無聲,而我用的剛好是后者,所以誤以為是MessageBeep API在所有NT6系統都不工作造成~汗,有人在stackoverflow也提過這問題。但我仍然決定使用PlaySound API,不做修改
  • 將聲音處理交給PRocessIcon方法負責。之前考慮松耦合,所以將MessageBoxIcon和聲音分開處理,但其實聲音就是根據前者而來,兩者天然就是耦合的,分開處理多此一舉

--------------201507091034更新---------------

首先感謝猿友E204在回復中的反饋。

  • 解決雙擊【詳細信息】按鈕造成的Checked狀態改變問題,辦法是讓ToggleButton忽略WM_LBUTTONDBLCLK消息
  • 修正收起詳細信息區邏輯,改為直接取用plAttachZone.Height。之前是取ExpandHeight,會造成視覺體驗問題

--------------201507082014原文(已更新)---------------

適用于:.net 2.0+的Winform項目

樣子:

有損錄制+制圖的原因不可能原樣展示出真實效果,可至文章結尾下載Demo體驗。

功能和特點:

  • 相對父窗體居中
  • 可附帶附加消息。附加消息可以是string和Exception類型,【詳細信息】按鈕會根據是否傳入附加信息顯示和隱藏。傳入Exception實例時,呈現的是exception.ToString(),也就是可能攜帶StackTrace信息,所以如果你只是想呈現異常文本,還是老實傳入ex.Message
  • 展開/收起附加信息時有動畫效果。實用為王的你亦可設置EnableAnimate=false關閉動畫效果
  • 在Windows Server 2008 R2(未測試其它服務器系統)也有聲音反饋。標準消息框在個人系統(XP/Win7等)是有聲音的,但在srv08卻沒有。同時亦提供了EnableSound屬性允許你關閉聲音反饋
  • 移除了標準MessageBox提供的IWin32Window、MessageBoxOptions和Help相關參數,原因是我用不到,懶得實現
  • 可拖拉改變消息框尺寸,消息文本和附加文本會隨窗體大小重排。這是標準消息框未提供的能力。改變尺寸分兩種情況有不同的行為:①詳細信息未展開時,改變的是主消息區大小;②詳細信息展開時,改變的是詳細信息區的大小

總體來說,此消息框比較適合用在需要反饋大量消息文本的場合,用標準消息框的話,文本太多可能會使消息框超出屏幕大小,比如codeproject.com上這位老兄舉的例子,由于標準消息框不具備改變窗體大小的能力,將導致部分消息無法讓用戶看到。而就算沒有超出屏幕,一下子讓用戶面對那么多消息文字,體驗也不地道。使用本消息框就可以解決此類問題,比如可以將扼要信息顯示在主消息區,將大量的明細消息(例如批量處理中的單項處理情況)、次要消息、異常信息等放置在詳細信息區,由用戶或IT支持人員自己去展開獲取這些信息。同時,在沒有附加消息的時候,你仍然可以像標準消息框一樣使用它,所以,如果你跟我一樣不會用到標準消息框的IWin32Window、MessageBoxOptions和Help相關參數的話,基本上你可以在整個項目中全程用此消息框替換掉標準消息框,別忘了相比標準消息框,它還具備了可縮放、相對父窗體居中等額外能力。總言之,你值得擁有。至于如果你擔心性能問題,這個~我想這么說,我對自己的代碼質量還是有點信心的。也希望能得大俠指出槽點,感激!

使用說明:

先看公開成員:

//靜態屬性MessageBoxEx.EnableAnimateMessageBoxEx.EnableSound//靜態方法MessageBoxEx.Show(string, string, string)MessageBoxEx.Show(string, string, string, MessageBoxButtons)MessageBoxEx.Show(string, string, string, MessageBoxButtons, MessageBoxIcon)MessageBoxEx.Show(string, string, string, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton)MessageBoxEx.Show(string, string, Exception)MessageBoxEx.Show(string, string, Exception, MessageBoxButtons)MessageBoxEx.Show(string, string, Exception, MessageBoxButtons, MessageBoxIcon)MessageBoxEx.Show(string, string, Exception, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton)
  • 屬性EnableAnimate和EnableSound上面提過,分別是用來啟用/關閉動畫、聲音效果的,默認是都啟用。倆屬性影響范圍是全局的,比如設置EnableAnimate = false后,之后彈出的MessageBoxEx都沒有動畫效果,直到重新設為true,EnableSound亦然。最佳實踐是將它倆與用戶偏好設置相關聯,允許用戶自主控制
  • 方法則只有一個:Show(),從重載列表你大概都能知道如何使用。其中第3個參數就是附加消息,可接受string和Exception類的實例,其余參數的位置和意義與標準消息框一致。簡要示例如下:
    MessageBoxEx.Show("主消息", "標題", "附加消息", MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);MessageBoxEx.Show("主消息", "標題", ex, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);
  • 前3個參數可以放心為null,內部有處理,后面的枚舉你也null不了,如果傳入無效枚舉值,會拋異常
  • 只有3個string參數的那個方法,后面倆參數是可選的。所以不講究消息體驗的你仍然可以這樣使用:
    MessageBoxEx.Show("阿斯頓發");MessageBoxEx.Show("阿斯頓發", "士大夫");

方案源碼

代碼不少,原因自然是有的,有興趣的童鞋請看后面的實現說明。另外,千萬不要認為代碼量跟性能有直接關系,有時候更多的代碼恰恰是為了提升性能而存在,有時候則是為了健壯性。

using System;using System.ComponentModel;using System.Drawing;using System.IO;using System.Runtime.InteropServices;using System.Threading;using System.Windows.Forms;namespace AhDung.WinForm{    /// <summary>    /// 可以攜帶詳細信息的消息框    /// </summary>    public static class MessageBoxEx    {        //異常消息文本        private const string InvalidButtonExString = "按鈕參數不是有效的枚舉項!";        private const string InvalidIconExString = "圖標參數不是有效的枚舉項!";        private const string InvalidDfButtonExString = "默認按鈕參數不是有效的枚舉項!";        /// <summary>        /// 是否啟用動畫效果        /// </summary>        public static bool EnableAnimate { get; set; }        /// <summary>        /// 是否啟用聲音反饋        /// </summary>        public static bool EnableSound { get; set; }        //靜態構造        static MessageBoxEx()        {            //默認啟用動畫+聲音            EnableAnimate = true;            EnableSound = true;        }        #region 公開方法        /// <summary>        /// 顯示消息框        /// </summary>        /// <param name="message">消息文本</param>        /// <param name="caption">消息框標題</param>        /// <param name="attachMessage">附加消息</param>        public static DialogResult Show(string message, string caption = null, string attachMessage = null)        {            return ShowCore(message, caption, attachMessage, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);        }        /*下面這仨弄成重載而不是可選方法是為了避免不必要的參數檢查*/        /// <summary>        /// 顯示消息框        /// </summary>        /// <param name="message">消息文本</param>        /// <param name="caption">消息框標題</param>        /// <param name="attachMessage">附加消息</param>        /// <param name="buttons">按鈕組合</param>        public static DialogResult Show(string message, string caption, string attachMessage, MessageBoxButtons buttons)        {            if (!Enum.IsDefined(typeof(MessageBoxButtons), buttons)) { throw new InvalidEnumArgumentException(InvalidButtonExString); }            return ShowCore(message, caption, attachMessage, buttons, MessageBoxIcon.None, MessageBoxDefaultButton.Button1);        }        /// <summary>        /// 顯示消息框        /// </summary>        /// <param name="message">消息文本</param>        /// <param name="caption">消息框標題</param>        /// <param name="attachMessage">附加消息</param>        /// <param name="buttons">按鈕組合</param>        /// <param name="icon">圖標</param>        public static DialogResult Show(string message, string caption, string attachMessage, MessageBoxButtons buttons, MessageBoxIcon icon)        {            if (!Enum.IsDefined(typeof(MessageBoxButtons), buttons)) { throw new InvalidEnumArgumentException(InvalidButtonExString); }            if (!Enum.IsDefined(typeof(MessageBoxIcon), icon)) { throw new InvalidEnumArgumentException(InvalidIconExString); }            return ShowCore(message, caption, attachMessage, buttons, icon, MessageBoxDefaultButton.Button1);        }        /// <summary>        /// 顯示消息框        /// </summary>        /// <param name="message">消息文本</param>        /// <param name="caption">消息框標題</param>        /// <param name="attachMessage">附加消息</param>        /// <param name="buttons">按鈕組合</param>        /// <param name="icon">圖標</param>        /// <param name="defaultButton">默認按鈕</param>        public static DialogResult Show(string message, string caption, string attachMessage, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton)        {            if (!Enum.IsDefined(typeof(MessageBoxButtons), buttons)) { throw new InvalidEnumArgumentException(InvalidButtonExString); }            if (!Enum.IsDefined(typeof(MessageBoxIcon), icon)) { throw new InvalidEnumArgumentException(InvalidIconExString); }            if (!Enum.IsDefined(typeof(MessageBoxDefaultButton), defaultButton)) { throw new InvalidEnumArgumentException(InvalidDfButtonExString); }            return ShowCore(message, caption, attachMessage, buttons, icon, defaultButton);        }        /********傳入異常的重載********/        /// <summary>        /// 顯示消息框
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 界首市| 策勒县| 太康县| 吐鲁番市| 重庆市| 德清县| 越西县| 霍邱县| 巴南区| 永寿县| 行唐县| 东明县| 当阳市| 内江市| 通化市| 拉孜县| 土默特右旗| 东明县| 洛南县| 天门市| 台山市| 农安县| 松桃| 寿光市| 潞西市| 樟树市| 天全县| 盘锦市| 兴宁市| 南充市| 汕头市| 韶关市| 县级市| 北安市| 军事| 突泉县| 衡阳县| 赤城县| 绿春县| 文安县| 安庆市|