【问题标题】:MessageBox.Show() Custom Icon?MessageBox.Show() 自定义图标?
【发布时间】:2011-07-03 01:07:17
【问题描述】:

我想在MessageBox.Show("Message", "Title", MessageBoxButton.OK, MeesageBoxIcon.myIcon) 方法中使用自定义图标。

有什么建议吗?

【问题讨论】:

    标签: c# .net icons messagebox


    【解决方案1】:

    我不久前写了一个,它的工作方式与常规消息框类完全一样。

    CustomMessageBox(类):http://pastebin.com/m8evBmZi

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public static class CustomMessageBox
    {
        public static DialogResult Show(string Text, string Title, eDialogButtons Buttons, Image Image)
        {
            MessageForm message = new MessageForm();
            message.Text = Title;
    
            if (Image.Height < 0 || Image.Height > 64)
                throw new Exception("Invalid image height. Valid height ranges from 0 to 64.");
            else if (Image.Width < 0 || Image.Width > 64)
                throw new Exception("Invalid image width. Valid width ranges from 0 to 64.");
            else
            {
                message.picImage.Image = Image;
                message.lblText.Text = Text;
    
                switch (Buttons)
                {
                    case eDialogButtons.OK:
                        message.btnYes.Visible = false;
                        message.btnNo.Visible = false;
                        message.btnCancel.Visible = false;
                        message.btnOK.Location = message.btnCancel.Location;
                        break;
                    case eDialogButtons.OKCancel:
                        message.btnYes.Visible = false;
                        message.btnNo.Visible = false;
                        break;
                    case eDialogButtons.YesNo:
                        message.btnOK.Visible = false;
                        message.btnCancel.Visible = false;
                        message.btnYes.Location = message.btnOK.Location;
                        message.btnNo.Location = message.btnCancel.Location;
                        break;
                    case eDialogButtons.YesNoCancel:
                        message.btnOK.Visible = false;
                        break;
                }
    
                if (message.lblText.Height > 64)
                    message.Height = (message.lblText.Top + message.lblText.Height) + 78;
    
                return (message.ShowDialog());
            }
        }
    
        public enum eDialogButtons { OK, OKCancel, YesNo, YesNoCancel }
    }
    

    MessageForm(表单):http://pastebin.com/jawHZDzY

    using System;
    using System.Windows.Forms;
    
    internal partial class MessageForm : Form
    {
        internal MessageForm() => InitializeComponent();
    
        private void btnYes_Click(object sender, EventArgs e) =>
            DialogResult = DialogResult.Yes;
    
        private void btnNo_Click(object sender, EventArgs e) =>
            DialogResult = DialogResult.No;
    
        private void btnCancel_Click(object sender, EventArgs e) =>
            DialogResult = DialogResult.Cancel;
    
        private void btnOK_Click(object sender, EventArgs e) =>
            DialogResult = DialogResult.OK;
    }
    

    MessageForm(设计师代码):http://pastebin.com/CRXjeUFN

    partial class MessageForm
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
    
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
    
        #region Windows Form Designer generated code
    
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.picImage = new System.Windows.Forms.PictureBox();
            this.lblText = new System.Windows.Forms.Label();
            this.btnYes = new Dark.WinForms.Controls.dButton();
            this.btnNo = new Dark.WinForms.Controls.dButton();
            this.btnCancel = new Dark.WinForms.Controls.dButton();
            this.btnOK = new Dark.WinForms.Controls.dButton();
            ((System.ComponentModel.ISupportInitialize)(this.picImage)).BeginInit();
            this.SuspendLayout();
            //
            // picImage
            //
            this.picImage.ErrorImage = null;
            this.picImage.InitialImage = null;
            this.picImage.Location = new System.Drawing.Point(15, 15);
            this.picImage.Name = "picImage";
            this.picImage.Size = new System.Drawing.Size(64, 64);
            this.picImage.TabIndex = 0;
            this.picImage.TabStop = false;
            //
            // lblText
            //
            this.lblText.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.lblText.AutoSize = true;
            this.lblText.Location = new System.Drawing.Point(85, 15);
            this.lblText.MaximumSize = new System.Drawing.Size(294, 0);
            this.lblText.Name = "lblText";
            this.lblText.Size = new System.Drawing.Size(28, 13);
            this.lblText.TabIndex = 0;
            this.lblText.Text = "Text";
            //
            // btnYes
            //
            this.btnYes.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
            this.btnYes.FocusDuesEnabled = false;
            this.btnYes.Location = new System.Drawing.Point(139, 88);
            this.btnYes.Name = "btnYes";
            this.btnYes.Size = new System.Drawing.Size(75, 23);
            this.btnYes.TabIndex = 2;
            this.btnYes.Text = "Yes";
            this.btnYes.Tooltip = "";
            this.btnYes.UseVisualStyleBackColor = true;
            this.btnYes.Click += new System.EventHandler(this.btnYes_Click);
            //
            // btnNo
            //
            this.btnNo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
            this.btnNo.FocusDuesEnabled = false;
            this.btnNo.Location = new System.Drawing.Point(220, 88);
            this.btnNo.Name = "btnNo";
            this.btnNo.Size = new System.Drawing.Size(75, 23);
            this.btnNo.TabIndex = 3;
            this.btnNo.Text = "No";
            this.btnNo.Tooltip = "";
            this.btnNo.UseVisualStyleBackColor = true;
            this.btnNo.Click += new System.EventHandler(this.btnNo_Click);
            //
            // btnCancel
            //
            this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
            this.btnCancel.FocusDuesEnabled = false;
            this.btnCancel.Location = new System.Drawing.Point(301, 88);
            this.btnCancel.Name = "btnCancel";
            this.btnCancel.Size = new System.Drawing.Size(75, 23);
            this.btnCancel.TabIndex = 1;
            this.btnCancel.Text = "Cancel";
            this.btnCancel.Tooltip = "";
            this.btnCancel.UseVisualStyleBackColor = true;
            this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click);
            //
            // btnOK
            //
            this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
            this.btnOK.FocusDuesEnabled = false;
            this.btnOK.Location = new System.Drawing.Point(220, 88);
            this.btnOK.Name = "btnOK";
            this.btnOK.Size = new System.Drawing.Size(75, 23);
            this.btnOK.TabIndex = 4;
            this.btnOK.Text = "OK";
            this.btnOK.Tooltip = "";
            this.btnOK.UseVisualStyleBackColor = true;
            this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
            //
            // MessageForm
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(394, 129);
            this.Controls.Add(this.btnYes);
            this.Controls.Add(this.btnNo);
            this.Controls.Add(this.btnCancel);
            this.Controls.Add(this.picImage);
            this.Controls.Add(this.lblText);
            this.Controls.Add(this.btnOK);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.Name = "MessageForm";
            this.Padding = new System.Windows.Forms.Padding(15);
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "Title";
            ((System.ComponentModel.ISupportInitialize)(this.picImage)).EndInit();
            this.ResumeLayout(false);
            this.PerformLayout();
    
        }
    
        #endregion
    
        internal Dark.WinForms.Controls.dButton btnCancel;
        internal Dark.WinForms.Controls.dButton btnNo;
        internal Dark.WinForms.Controls.dButton btnYes;
        internal Dark.WinForms.Controls.dButton btnOK;
        internal System.Windows.Forms.PictureBox picImage;
        internal System.Windows.Forms.Label lblText;
    }
    

    【讨论】:

    • 嗯……是这样吗? :) 我在想我会在某个地方做“添加新图像”,瞧,但这是一项真正的工作:) 好吧,我现在有机会做一些自定义的东西,阅读并理解你的代码一段时间以掌握它...谢谢
    【解决方案2】:

    您不能覆盖MessageBox 的这种行为。解决方案是使用一些自定义消息框,勾选this,或者实现您自己的MessageBoxForm 并将您的自定义设置添加到其中,勾选this

    【讨论】:

      【解决方案3】:

      您可以使用 Microsoft 的 Task Dialog Indirect API,它将帮助您显示自定义对话框。

      【讨论】:

      • 如果你是 Rube Goldberg,否则我可能会创建自己的表单...
      • @Ed S 为什么要重新发明轮子,如果有可用的 API,它很容易使用,而不是创建一个新的 :)
      • 我不认为在这里使用 PInvoke 是有保证的。这不是重新发明轮子,这更像是重新发明……回形针。一个简单的任务。
      • @EdS.- 我知道你在说什么,但是使用系统控件(与滚动你自己的控件相比)有一些容易被忽视的优点。有很多您通常不会想到的功能(例如,屏幕阅读器的行为、可访问性选项的行为等)。您可以自己轻松近似它,但您可能会发现越来越多的情况表明您的行为与真实事物不同。
      【解决方案4】:

      您不能直接更改 MessageBox 的图标,所以我搜索了它并找到了解决方案。我们可以使用窗口挂钩更改消息框的图标。

      听到的是 MSDN 杂志的链接。

      MSDN on the Internet archive

      【讨论】:

        猜你喜欢
        • 2021-11-18
        • 2015-02-19
        • 2016-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多