简单测试了一下,觉得还是比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); } }
效果:有很多种选择,