您的位置:首页 > 其它

自定义一个MessageBox

2016-02-23 16:10 471 查看
using System;

using System.Collections.Generic;

using System.Text;

using System.Drawing;

using System.Drawing.Drawing2D;

using System.Windows.Forms;

using System.Runtime.InteropServices;

partial class MessageBoxNew : 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 int minHeight = 200;

    static private int maxHeihgt = 700;

    static private int minWidth = 400;

    static private int maxWidth = 1000;

    static private bool init = false;

    static private IntPtr[] largeIcon;

    static private IntPtr[] smallIcon;

    static private MessageBoxNew newMessageBox;

    static private Label frmTitle;

    static private Label frmMessage;

    static private PictureBox pIcon;

    static private FlowLayoutPanel flpButtons;

    static private Icon frmIcon;

    static MessageBoxButtons MButtons;

    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 MessageBoxDefaultButton defaultButton = MessageBoxDefaultButton.Button1;

    static private DialogResult CYReturnButton;

    static private void BuildMessageBox(string title)

    {

        newMessageBox = new MessageBoxNew();

        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.KeyPreview = true;

        newMessageBox.KeyPress += new System.Windows.Forms.KeyPressEventHandler(MessageBoxNew.MessageBoxNew_KeyPress);

        newMessageBox.KeyDown += new System.Windows.Forms.KeyEventHandler(MessageBoxNew.MessageBoxNew_KeyDown);

        newMessageBox.BackColor = System.Drawing.Color.White;

        newMessageBox.Activated += new System.EventHandler(MessageBoxNew.MessageBoxNew_Activated);

        TableLayoutPanel tlp = new TableLayoutPa
4000
nel();

        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("宋体", 12, FontStyle.Bold);

        frmMessage = new Label();

        frmMessage.Dock = System.Windows.Forms.DockStyle.Fill;

        frmMessage.BackColor = System.Drawing.Color.White;

        frmMessage.Font = new Font("宋体", 14, FontStyle.Regular);

        frmMessage.Text = "hiii";

        pIcon = new PictureBox();

        if (!init)

        {

            largeIcon = new IntPtr[250];

            smallIcon = new IntPtr[250];

            ExtractIconEx("shell32.dll", 0, largeIcon, smallIcon, 250);

            init = true;

        }

        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);

    }

    protected override bool ProcessDialogKey(Keys keyData)

    {

        switch (keyData)

        {

            case Keys.Escape:

                CYReturnButton = DialogResult.Cancel;

                this.Close();

                break;

        }

        return base.ProcessDialogKey(keyData);

    }

    /// <summary>

    /// Message: Text to display in the message box.

    /// </summary>

    static public DialogResult Show(string Message)

    {

        BuildMessageBox("");

        frmMessage.Text = Message;

        ReSizeWindow();

        ButtonStatements(MessageBoxButtons.OK);

        IconStatements(MessageBoxIcon.Warning);

        Image imageIcon = new Bitmap(frmIcon.ToBitmap(), 38, 38);

        pIcon.Image = imageIcon;

        newMessageBox.ShowDialog();

        return CYReturnButton;

    }

    private static void ReSizeWindow()

    {

        Graphics g = newMessageBox.CreateGraphics();

        SizeF sizeF = g.MeasureString(frmMessage.Text, new Font("宋体", 12));

        sizeF = new Size((int)(sizeF.Width * 1.8), (int)(sizeF.Height * 2));

        sizeF.Height = sizeF.Height > maxHeihgt ? maxHeihgt : sizeF.Height;

        sizeF.Width = sizeF.Width > maxWidth ? maxWidth : sizeF.Width;

        sizeF.Height = sizeF.Height < minHeight ? minHeight : sizeF.Height;

        sizeF.Width = sizeF.Width < minWidth ? minWidth : sizeF.Width;

        newMessageBox.Size = new System.Drawing.Size((int)sizeF.Width, (int)sizeF.Height);

        g.Dispose();

    }

    /// <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;

        ReSizeWindow();

        ButtonStatements(MessageBoxButtons.OK);

        IconStatements(MessageBoxIcon.Warning);

        Image imageIcon = new Bitmap(frmIcon.ToBitmap(), 38, 38);

        pIcon.Image = imageIcon;

        newMessageBox.ShowDialog();

        return CYReturnButton;

    }

    /// <summary>

    /// MButtons: Display CYButtons on the message box.

    /// </summary>

    static public DialogResult Show(string Message, string Title, MessageBoxButtons 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

        ReSizeWindow();

        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 CYIcon on the message box.

    /// </summary>

    static public DialogResult Show(string Message, string Title, MessageBoxButtons MButtons, MessageBoxIcon MIcon)

    {

        BuildMessageBox(Title);

        frmTitle.Text = Title;

        frmMessage.Text = Message;

        ReSizeWindow();

        ButtonStatements(MButtons);

        IconStatements(MIcon);

        Image imageIcon = new Bitmap(frmIcon.ToBitmap(), 38, 38);

        pIcon.Image = imageIcon;

        newMessageBox.ShowDialog();

        return CYReturnButton;

    }

    /// <summary>

    /// MIcon: Display CYIcon on the message box.

    /// </summary>

    static public DialogResult Show(string Message, string Title, MessageBoxButtons MButtons, MessageBoxIcon MIcon, MessageBoxDefaultButton button)

    {

        BuildMessageBox(Title);

        frmTitle.Text = Title;

        frmMessage.Text = Message;

        ReSizeWindow();

        ButtonStatements(MButtons);

        IconStatements(MIcon);

        Image imageIcon = new Bitmap(frmIcon.ToBitmap(), 38, 38);

        pIcon.Image = imageIcon;

        defaultButton = button;

        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 = "确认";

        btnOK.Size = new System.Drawing.Size(80, 25);

        btnOK.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);

        btnOK.Font = new Font("宋体", 12, FontStyle.Regular);

        btnOK.Click += new EventHandler(btnOK_Click);

        flpButtons.Controls.Add(btnOK);

    }

    static private void ShowAbortButton()

    {

        btnAbort = new Button();

        btnAbort.Text = "退出";

        btnAbort.Size = new System.Drawing.Size(80, 25);

        btnAbort.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);

        btnAbort.Font = new Font("宋体", 12, FontStyle.Regular);

        btnAbort.Click += new EventHandler(btnAbort_Click);

        flpButtons.Controls.Add(btnAbort);

    }

    static private void ShowRetryButton()

    {

        btnRetry = new Button();

        btnRetry.Text = "重试";

        btnRetry.Size = new System.Drawing.Size(80, 25);

        btnRetry.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);

        btnRetry.Font = new Font("宋体", 12, FontStyle.Regular);

        btnRetry.Click += new EventHandler(btnRetry_Click);

        flpButtons.Controls.Add(btnRetry);

    }

    static private void ShowIgnoreButton()

    {

        btnIgnore = new Button();

        btnIgnore.Text = "忽略";

        btnIgnore.Size = new System.Drawing.Size(80, 25);

        btnIgnore.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);

        btnIgnore.Font = new Font("宋体", 12, FontStyle.Regular);

        btnIgnore.Click += new EventHandler(btnIgnore_Click);

        flpButtons.Controls.Add(btnIgnore);

    }

    static private void ShowCancelButton()

    {

        btnCancel = new Button();

        btnCancel.Text = "取消";

        btnCancel.Size = new System.Drawing.Size(80, 25);

        btnCancel.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);

        btnCancel.Font = new Font("宋体", 12, FontStyle.Regular);

        btnCancel.Click += new EventHandler(btnCancel_Click);

        flpButtons.Controls.Add(btnCancel);

    }

    static private void ShowYesButton()

    {

        btnYes = new Button();

        btnYes.Text = "是";

        btnYes.Size = new System.Drawing.Size(80, 25);

        btnYes.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);

        btnYes.Font = new Font("宋体", 12, FontStyle.Regular);

        btnYes.Click += new EventHandler(btnYes_Click);

        flpButtons.Controls.Add(btnYes);

    }

    static private void ShowNoButton()

    {

        btnNo = new Button();

        btnNo.Text = "否";

        btnNo.Size = new System.Drawing.Size(80, 25);

        btnNo.BackColor = System.Drawing.Color.FromArgb(255, 255, 255);

        btnNo.Font = new Font("宋体", 12, FontStyle.Regular);

        btnNo.Click += new EventHandler(btnNo_Click);

        flpButtons.Controls.Add(btnNo);

    }

    static private void ButtonStatements(MessageBoxButtons MButtons)

    {

        MessageBoxNew.MButtons = MButtons;

        if (MButtons == MessageBoxButtons.AbortRetryIgnore)

        {

            ShowRetryButton();

            ShowAbortButton();

            ShowIgnoreButton();

        }

        if (MButtons == MessageBoxButtons.OK)

        {

            ShowOKButton();

        }

        if (MButtons == MessageBoxButtons.OKCancel)

        {

            ShowCancelButton();

            ShowOKButton();

        }

        if (MButtons == MessageBoxButtons.RetryCancel)

        {

            ShowCancelButton();

            ShowRetryButton();

        }

        if (MButtons == MessageBoxButtons.YesNo)

        {

            ShowNoButton();

            ShowYesButton();

        }

        if (MButtons == MessageBoxButtons.YesNoCancel)

        {

            ShowCancelButton();

            ShowNoButton();

            ShowYesButton();

        }

    }

    static private void IconStatements(MessageBoxIcon MIcon)

    {

        if (MIcon == MessageBoxIcon.Error)

        {

            MessageBeep(30);

            frmIcon = Icon.FromHandle(largeIcon[109]);

        }

        if (MIcon == MessageBoxIcon.Information)

        {

            MessageBeep(0);

            frmIcon = Icon.FromHandle(largeIcon[221]);

        }

        if (MIcon == MessageBoxIcon.Question)

        {

            MessageBeep(0);

            frmIcon = Icon.FromHandle(largeIcon[23]);

        }

        if (MIcon == MessageBoxIcon.Stop)

        {

            MessageBeep(0);

            frmIcon = Icon.FromHandle(largeIcon[27]);

        }

        if (MIcon == MessageBoxIcon.Warning)

        {

            MessageBeep(30);

            frmIcon = Icon.FromHandle(largeIcon[233]);

        }

    }

    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,
a298
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);

    }

    public static void MessageBoxNew_KeyPress(object sender, KeyPressEventArgs e)

    {

        switch (e.KeyChar)

        {

            case '1':

                CYReturnButton = DialogResult.Cancel;

                break;

        }

    }

    private static void MessageBoxNew_KeyDown(object sender, KeyEventArgs e)

    {

        switch (e.KeyCode)

        {

            case Keys.Escape:

                CYReturnButton = DialogResult.Cancel;

                break;

        }

    }

    private void InitializeComponent()

    {

        this.SuspendLayout();

        // 

        // MessageBoxNew

        // 

        this.ClientSize = new System.Drawing.Size(286, 221);

        this.Name = "MessageBoxNew";

        this.ResumeLayout(false);

    }

    static void MessageBoxNew_Activated(object sender, EventArgs e)

    {

        if (MButtons == MessageBoxButtons.OKCancel

            || MButtons == MessageBoxButtons.YesNo

            || MButtons == MessageBoxButtons.RetryCancel)

        {

            switch (defaultButton)

            {

                case MessageBoxDefaultButton.Button1:

                    flpButtons.Controls[1].Focus();

                    break;

                case MessageBoxDefaultButton.Button2:

                    flpButtons.Controls[0].Focus();

                    break;

            }

        }

        if (MButtons == MessageBoxButtons.AbortRetryIgnore

            || MButtons == MessageBoxButtons.YesNoCancel)

        {

            switch (defaultButton)

            {

                case MessageBoxDefaultButton.Button1:

                    flpButtons.Controls[2].Focus();

                    break;

                case MessageBoxDefaultButton.Button2:

                    flpButtons.Controls[1].Focus();

                    break;

                case MessageBoxDefaultButton.Button3:

                    flpButtons.Controls[0].Focus();

                    break;

            }

        }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  MessageBox