• 分享一个WinForm里面自定义的MessageBox


    简单测试了一下,觉得还是比MS自带的要好一点,新建一个项目,添加一个MyMsgBox的窗体,该窗体里面的代码如下:

    完整的Demo:MessageBox Demo

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace MsgBox
    {
        public partial class MyMsgBox : Form
        {
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            private static extern bool MessageBeep(uint type);
    
            [DllImport("Shell32.dll")]
            public extern static int ExtractIconEx(string libName, int iconIndex, IntPtr[] largeIcon, IntPtr[] smallIcon, int nIcons);
    
            static private IntPtr[] largeIcon;
            static private IntPtr[] smallIcon;
    
            static private MyMsgBox newMessageBox;
            static private Label frmTitle;
            static private Label frmMessage;
            static private PictureBox pIcon;
            static private FlowLayoutPanel flpButtons;
            static private Icon frmIcon;
    
            static private Button btnOK;
            static private Button btnAbort;
            static private Button btnRetry;
            static private Button btnIgnore;
            static private Button btnCancel;
            static private Button btnYes;
            static private Button btnNo;
    
            static private DialogResult CYReturnButton;
    
            public enum MyIcon
            {
                Error,
                Explorer,
                Find,
                Information,
                Mail,
                Media,
                Print,
                Question,
                RecycleBinEmpty,
                RecycleBinFull,
                Stop,
                User,
                Warning
            }
    
            public enum MyButtons
            {
                AbortRetryIgnore,
                OK,
                OKCancel,
                RetryCancel,
                YesNo,
                YesNoCancel
            }
    
            static private void BuildMessageBox(string title)
            {
                newMessageBox = new MyMsgBox();
                newMessageBox.Text = title;
                newMessageBox.Size = new System.Drawing.Size(400, 200);
                newMessageBox.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
                newMessageBox.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                newMessageBox.Paint += new PaintEventHandler(newMessageBox_Paint);
                newMessageBox.BackColor = System.Drawing.Color.White;
    
                TableLayoutPanel tlp = new TableLayoutPanel();
                tlp.RowCount = 3;
                tlp.ColumnCount = 0;
                tlp.Dock = System.Windows.Forms.DockStyle.Fill;
                tlp.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 22));
                tlp.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
                tlp.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 50));
                tlp.BackColor = System.Drawing.Color.Transparent;
                tlp.Padding = new Padding(2, 5, 2, 2);
    
                frmTitle = new Label();
                frmTitle.Dock = System.Windows.Forms.DockStyle.Fill;
                frmTitle.BackColor = System.Drawing.Color.Transparent;
                frmTitle.ForeColor = System.Drawing.Color.White;
                frmTitle.Font = new Font("Tahoma", 9, FontStyle.Bold);
    
                frmMessage = new Label();
                frmMessage.Dock = System.Windows.Forms.DockStyle.Fill;
                frmMessage.BackColor = System.Drawing.Color.White;
                frmMessage.Font = new Font("Tahoma", 9, FontStyle.Regular);
                frmMessage.Text = "hiii";
    
                largeIcon = new IntPtr[250];
                smallIcon = new IntPtr[250];
                pIcon = new PictureBox();
                ExtractIconEx("shell32.dll", 0, largeIcon, smallIcon, 250);
    
                flpButtons = new FlowLayoutPanel();
                flpButtons.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft;
                flpButtons.Padding = new Padding(0, 5, 5, 0);
                flpButtons.Dock = System.Windows.Forms.DockStyle.Fill;
                flpButtons.BackColor = System.Drawing.Color.FromArgb(240, 240, 240);
    
                TableLayoutPanel tlpMessagePanel = new TableLayoutPanel();
                tlpMessagePanel.BackColor = System.Drawing.Color.White;
                tlpMessagePanel.Dock = System.Windows.Forms.DockStyle.Fill;
                tlpMessagePanel.ColumnCount = 2;
                tlpMessagePanel.RowCount = 0;
                tlpMessagePanel.Padding = new Padding(4, 5, 4, 4);
                tlpMessagePanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 50));
                tlpMessagePanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
                tlpMessagePanel.Controls.Add(pIcon);
                tlpMessagePanel.Controls.Add(frmMessage);
    
                tlp.Controls.Add(frmTitle);
                tlp.Controls.Add(tlpMessagePanel);
                tlp.Controls.Add(flpButtons);
                newMessageBox.Controls.Add(tlp);
            }
    
            /// <summary>
            /// Message: Text to display in the message box.
            /// </summary>
            static public DialogResult Show(string Message)
            {
                BuildMessageBox("");
                frmMessage.Text = Message;
                ShowOKButton();
                newMessageBox.ShowDialog();
                return CYReturnButton;
            }
    
            /// <summary>
            /// Title: Text to display in the title bar of the messagebox.
            /// </summary>
            static public DialogResult Show(string Message, string Title)
            {
                BuildMessageBox(Title);
                frmTitle.Text = Title;
                frmMessage.Text = Message;
                ShowOKButton();
                newMessageBox.ShowDialog();
                return CYReturnButton;
            }
    
            /// <summary>
            /// MButtons: Display MyButtons on the message box.
            /// </summary>
            static public DialogResult Show(string Message, string Title, MyButtons MButtons)
            {
                BuildMessageBox(Title); // BuildMessageBox method, responsible for creating the MessageBox
                frmTitle.Text = Title; // Set the title of the MessageBox
                frmMessage.Text = Message; //Set the text of the MessageBox
                ButtonStatements(MButtons); // ButtonStatements method is responsible for showing the appropreiate buttons
                newMessageBox.ShowDialog(); // Show the MessageBox as a Dialog.
                return CYReturnButton; // Return the button click as an Enumerator
            }
    
            /// <summary>
            /// MIcon: Display MyIcon on the message box.
            /// </summary>
            static public DialogResult Show(string Message, string Title, MyButtons MButtons, MyIcon MIcon)
            {
                BuildMessageBox(Title);
                frmTitle.Text = Title;
                frmMessage.Text = Message;
                ButtonStatements(MButtons);
                IconStatements(MIcon);
                Image imageIcon = new Bitmap(frmIcon.ToBitmap(), 38, 38);
                pIcon.Image = imageIcon;
                newMessageBox.ShowDialog();
                return CYReturnButton;
            }
    
            static void btnOK_Click(object sender, EventArgs e)
            {
                CYReturnButton = DialogResult.OK;
                newMessageBox.Dispose();
            }
    
            static void btnAbort_Click(object sender, EventArgs e)
            {
                CYReturnButton = DialogResult.Abort;
                newMessageBox.Dispose();
            }
    
            static void btnRetry_Click(object sender, EventArgs e)
            {
                CYReturnButton = DialogResult.Retry;
                newMessageBox.Dispose();
            }
    
            static void btnIgnore_Click(object sender, EventArgs e)
            {
                CYReturnButton = DialogResult.Ignore;
                newMessageBox.Dispose();
            }
    
            static void btnCancel_Click(object sender, EventArgs e)
            {
                CYReturnButton = DialogResult.Cancel;
                newMessageBox.Dispose();
            }
    
            static void btnYes_Click(object sender, EventArgs e)
            {
                CYReturnButton = DialogResult.Yes;
                newMessageBox.Dispose();
            }
    
            static void btnNo_Click(object sender, EventArgs e)
            {
                CYReturnButton = DialogResult.No;
                newMessageBox.Dispose();
            }
    
            static private void ShowOKButton()
            {
                btnOK = new Button();
                btnOK.Text = "OK";
                btnOK.Size = new System.Drawing.Size(80, 25);
                btnOK.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);
                btnOK.Font = new Font("Tahoma", 8, FontStyle.Regular);
                btnOK.Click += new EventHandler(btnOK_Click);
                flpButtons.Controls.Add(btnOK);
            }
    
            static private void ShowAbortButton()
            {
                btnAbort = new Button();
                btnAbort.Text = "Abort";
                btnAbort.Size = new System.Drawing.Size(80, 25);
                btnAbort.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);
                btnAbort.Font = new Font("Tahoma", 8, FontStyle.Regular);
                btnAbort.Click += new EventHandler(btnAbort_Click);
                flpButtons.Controls.Add(btnAbort);
            }
    
            static private void ShowRetryButton()
            {
                btnRetry = new Button();
                btnRetry.Text = "Retry";
                btnRetry.Size = new System.Drawing.Size(80, 25);
                btnRetry.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);
                btnRetry.Font = new Font("Tahoma", 8, FontStyle.Regular);
                btnRetry.Click += new EventHandler(btnRetry_Click);
                flpButtons.Controls.Add(btnRetry);
            }
    
            static private void ShowIgnoreButton()
            {
                btnIgnore = new Button();
                btnIgnore.Text = "Ignore";
                btnIgnore.Size = new System.Drawing.Size(80, 25);
                btnIgnore.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);
                btnIgnore.Font = new Font("Tahoma", 8, FontStyle.Regular);
                btnIgnore.Click += new EventHandler(btnIgnore_Click);
                flpButtons.Controls.Add(btnIgnore);
            }
    
            static private void ShowCancelButton()
            {
                btnCancel = new Button();
                btnCancel.Text = "Cancel";
                btnCancel.Size = new System.Drawing.Size(80, 25);
                btnCancel.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);
                btnCancel.Font = new Font("Tahoma", 8, FontStyle.Regular);
                btnCancel.Click += new EventHandler(btnCancel_Click);
                flpButtons.Controls.Add(btnCancel);
            }
    
            static private void ShowYesButton()
            {
                btnYes = new Button();
                btnYes.Text = "Yes";
                btnYes.Size = new System.Drawing.Size(80, 25);
                btnYes.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);
                btnYes.Font = new Font("Tahoma", 8, FontStyle.Regular);
                btnYes.Click += new EventHandler(btnYes_Click);
                flpButtons.Controls.Add(btnYes);
            }
    
            static private void ShowNoButton()
            {
                btnNo = new Button();
                btnNo.Text = "No";
                btnNo.Size = new System.Drawing.Size(80, 25);
                btnNo.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);
                btnNo.Font = new Font("Tahoma", 8, FontStyle.Regular);
                btnNo.Click += new EventHandler(btnNo_Click);
                flpButtons.Controls.Add(btnNo);
            }
    
            static private void ButtonStatements(MyButtons MButtons)
            {
                if (MButtons == MyButtons.AbortRetryIgnore)
                {
                    ShowIgnoreButton();
                    ShowRetryButton();
                    ShowAbortButton();
                }
    
                if (MButtons == MyButtons.OK)
                {
                    ShowOKButton();
                }
    
                if (MButtons == MyButtons.OKCancel)
                {
                    ShowCancelButton();
                    ShowOKButton();
                }
    
                if (MButtons == MyButtons.RetryCancel)
                {
                    ShowCancelButton();
                    ShowRetryButton();
                }
    
                if (MButtons == MyButtons.YesNo)
                {
                    ShowNoButton();
                    ShowYesButton();
                }
    
                if (MButtons == MyButtons.YesNoCancel)
                {
                    ShowCancelButton();
                    ShowNoButton();
                    ShowYesButton();
                }
            }
    
            static private void IconStatements(MyIcon MIcon)
            {
                if (MIcon == MyIcon.Error)
                {
                    MessageBeep(30);
                    frmIcon = Icon.FromHandle(largeIcon[109]);
                }
    
                if (MIcon == MyIcon.Explorer)
                {
                    MessageBeep(0);
                    frmIcon = Icon.FromHandle(largeIcon[220]);
                }
    
                if (MIcon == MyIcon.Find)
                {
                    MessageBeep(0);
                    frmIcon = Icon.FromHandle(largeIcon[22]);
                }
    
                if (MIcon == MyIcon.Information)
                {
                    MessageBeep(0);
                    frmIcon = Icon.FromHandle(largeIcon[221]);
                }
    
                if (MIcon == MyIcon.Mail)
                {
                    MessageBeep(0);
                    frmIcon = Icon.FromHandle(largeIcon[156]);
                }
    
                if (MIcon == MyIcon.Media)
                {
                    MessageBeep(0);
                    frmIcon = Icon.FromHandle(largeIcon[116]);
                }
    
                if (MIcon == MyIcon.Print)
                {
                    MessageBeep(0);
                    frmIcon = Icon.FromHandle(largeIcon[136]);
                }
    
                if (MIcon == MyIcon.Question)
                {
                    MessageBeep(0);
                    frmIcon = Icon.FromHandle(largeIcon[23]);
                }
    
                if (MIcon == MyIcon.RecycleBinEmpty)
                {
                    MessageBeep(0);
                    frmIcon = Icon.FromHandle(largeIcon[31]);
                }
    
                if (MIcon == MyIcon.RecycleBinFull)
                {
                    MessageBeep(0);
                    frmIcon = Icon.FromHandle(largeIcon[32]);
                }
    
                if (MIcon == MyIcon.Stop)
                {
                    MessageBeep(0);
                    frmIcon = Icon.FromHandle(largeIcon[27]);
                }
    
                if (MIcon == MyIcon.User)
                {
                    MessageBeep(0);
                    frmIcon = Icon.FromHandle(largeIcon[170]);
                }
    
                if (MIcon == MyIcon.Warning)
                {
                    MessageBeep(30);
                    frmIcon = Icon.FromHandle(largeIcon[217]);
                }
            }
    
            static void newMessageBox_Paint(object sender, PaintEventArgs e)
            {
                Graphics g = e.Graphics;
                Rectangle frmTitleL = new Rectangle(0, 0, (newMessageBox.Width / 2), 22);
                Rectangle frmTitleR = new Rectangle((newMessageBox.Width / 2), 0, (newMessageBox.Width / 2), 22);
                Rectangle frmMessageBox = new Rectangle(0, 0, (newMessageBox.Width - 1), (newMessageBox.Height - 1));
                LinearGradientBrush frmLGBL = new LinearGradientBrush(frmTitleL, Color.FromArgb(87, 148, 160), Color.FromArgb(209, 230, 243), LinearGradientMode.Horizontal);
                LinearGradientBrush frmLGBR = new LinearGradientBrush(frmTitleR, Color.FromArgb(209, 230, 243), Color.FromArgb(87, 148, 160), LinearGradientMode.Horizontal);
                Pen frmPen = new Pen(Color.FromArgb(63, 119, 143), 1);
                g.FillRectangle(frmLGBL, frmTitleL);
                g.FillRectangle(frmLGBR, frmTitleR);
                g.DrawRectangle(frmPen, frmMessageBox);
            }
        }
    }

    调用方法:

      private void button1_Click(object sender, EventArgs e)
            {
                DialogResult result = MyMsgBox.Show("你好。。。", "提示", MyMsgBox.MyButtons.YesNo, MyMsgBox.MyIcon.Information);
    
                if (result == DialogResult.Yes)
                {
                     
                }
    
                if (result == DialogResult.No)
                {
                    MyMsgBox.Show("你好。。?", "提示", MyMsgBox.MyButtons.AbortRetryIgnore, MyMsgBox.MyIcon.Stop);
                }
            }

    效果:有很多种选择,

  • 相关阅读:
    通过图像识别技术监控屏幕画面卡死问题
    人生四问
    bring to front 必须在右边的form上才生效。
    ADO 右键问题,当dbgrideh非只读的时候,会遇到这个问题
    K-Means聚类算法
    BIRCH算法---使用聚类特征树的多阶段算法
    BIRCH算法---使用聚类特征树的多阶段算法
    分布式系统阅读笔记(二十二)-----时钟和时钟同步
    分布式系统阅读笔记(二十二)-----时钟和时钟同步
    分布式系统阅读笔记(二十二)-----时钟和时钟同步
  • 原文地址:https://www.cnblogs.com/allen0118/p/2804338.html
  • Copyright © 2020-2023  润新知