亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

【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>        /// 顯示消息框
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
九九热在线精品视频| 91免费看视频.| 亚洲欧洲在线看| 日本高清久久天堂| 久久福利网址导航| 91九色国产社区在线观看| 亚洲精品一区二区三区婷婷月| 久热爱精品视频线路一| 7777精品视频| 日本道色综合久久影院| 亚州成人av在线| 91精品国产综合久久香蕉| 亚洲电影免费观看| 97婷婷大伊香蕉精品视频| 欧美精品xxx| 最近2019年好看中文字幕视频| 69久久夜色精品国产7777| 日本欧美精品在线| 夜色77av精品影院| 欧美老少配视频| 57pao成人永久免费视频| 亚洲黄页视频免费观看| 亚洲福利视频二区| 欧美中文字幕视频| 不卡在线观看电视剧完整版| 国产精品香蕉在线观看| 国产免费一区二区三区在线观看| 国产成人精品久久| 久久久亚洲欧洲日产国码aⅴ| 国产成人久久久精品一区| 欧美在线视频播放| 国产一区二区激情| 精品久久久久久久久久| 欧美综合在线第二页| 日本成熟性欧美| 国产日韩视频在线观看| 青草成人免费视频| 国产一区二区三区高清在线观看| 国产精品ⅴa在线观看h| 亚洲成人激情图| 精品国产老师黑色丝袜高跟鞋| 少妇激情综合网| 亚洲美女性生活视频| 国内外成人免费激情在线视频| 日韩精品在线影院| 成人免费看黄网站| 欧美激情手机在线视频| 亚洲片国产一区一级在线观看| 久久天堂av综合合色| 国产精品亚洲第一区| 欧美激情视频给我| 日韩在线观看视频免费| 欧美一级大片在线免费观看| 久久久久久久999| 青青草国产精品一区二区| 成人综合国产精品| 国产综合在线观看视频| 国产情人节一区| x99av成人免费| 亚洲欧美精品在线| 欧美黑人一级爽快片淫片高清| 精品无码久久久久久国产| 国产精品久久在线观看| 亚洲成人精品久久久| 国内精品视频久久| 欧美电影免费看| 色中色综合影院手机版在线观看| 中文字幕日韩av综合精品| 疯狂做受xxxx高潮欧美日本| 91地址最新发布| 久久躁日日躁aaaaxxxx| 国产成人精品一区| 亚洲色图美腿丝袜| 亚洲第一偷拍网| 欧美精品激情在线观看| 国产乱人伦真实精品视频| 韩国19禁主播vip福利视频| 亚洲成人a**站| 久久男人av资源网站| 欧美性videos高清精品| 亚洲国产中文字幕在线观看| 亚洲精品国产综合区久久久久久久| 精品国产乱码久久久久久婷婷| 午夜精品一区二区三区在线播放| 亚洲视频第一页| 欧美成人免费全部| 91精品国产高清自在线看超| 亚洲一区亚洲二区亚洲三区| 日韩av三级在线观看| 日韩av大片免费看| 亚洲精品91美女久久久久久久| 欧美日在线观看| 日韩欧美在线观看视频| 日韩视频免费大全中文字幕| 午夜精品视频在线| 欧美精品福利视频| 亚洲国产精品va在线| 亚洲欧美成人在线| 国产精品jvid在线观看蜜臀| 亚洲国产欧美一区二区三区久久| 中文字幕精品一区二区精品| 欧美一乱一性一交一视频| 美女视频黄免费的亚洲男人天堂| 大量国产精品视频| 久久综合久中文字幕青草| 91香蕉嫩草神马影院在线观看| 91在线视频成人| 97视频在线观看成人| 国产美女91呻吟求| 国产精品视频26uuu| 国产午夜精品一区理论片飘花| 亚洲欧美日韩一区二区在线| 国产一区二区三区高清在线观看| 尤物精品国产第一福利三区| 国产一区二区三区在线观看网站| 亚洲免费视频在线观看| 97国产精品免费视频| 丝袜美腿精品国产二区| 欧洲日本亚洲国产区| 亚洲欧美日韩一区二区在线| 在线精品播放av| 久久全国免费视频| 国产精品精品一区二区三区午夜版| 日韩av影视综合网| 精品亚洲aⅴ在线观看| 91麻豆国产语对白在线观看| 日韩精品免费观看| 久久这里有精品视频| 国产精品久久久久久一区二区| 黄网站色欧美视频| 黄色91在线观看| 国产成人精品免高潮费视频| 亚洲japanese制服美女| 国产主播喷水一区二区| 97视频在线观看免费| 亚洲成人av在线播放| www日韩欧美| 亚洲色图欧美制服丝袜另类第一页| 三级精品视频久久久久| 91视频免费在线| 青青在线视频一区二区三区| 欧美高清视频在线播放| 国内偷自视频区视频综合| 欧美在线观看网站| 欧美大奶子在线| 亚洲人精选亚洲人成在线| 国产美女扒开尿口久久久| 日韩成人av在线播放| 欧美在线观看一区二区三区| x99av成人免费| 国产日本欧美一区| 亚洲欧美成人一区二区在线电影| 亚洲国产精品成人av| 91精品国产高清久久久久久久久| 日韩精品在线看| 久久视频精品在线| 萌白酱国产一区二区| 欧美大片在线影院| 国产精品夜间视频香蕉| 欧美一级视频一区二区| 大胆欧美人体视频| 欧美性极品xxxx做受| 欧美大片欧美激情性色a∨久久| 国产精品电影久久久久电影网|