如何显示深色背景的弹出消息

时间:2016-01-22 13:09:33

标签: c# .net winforms panel

我将在我的程序中显示错误消息。

我希望我的消息如下图所示,

enter image description here

正如您所看到的,当弹出消息时,我需要显示一个暗影。

我遵循两个解决方案来做到这一点:

1 - 我拍摄了程序的截图(我将它与黑色混合,有点暗)然后我将它附加到面板上,然后显示面板,然后弹出消息表单。它不起作用,因为有时它会截取屏幕上其他程序的截图(例如电报通知)

2 - 我使用一个丰富的面板(我从互联网上获得)它可以具有不透明度属性,然后我将面板的颜色设置为黑色,不透明度设置为0.5。然后我弹出消息。 它不起作用,因为这个新的面板不包括所有元素(IDK为什么!)

enter image description here

这两种解决方案都存在一些问题而且没有用。 是否有任何解决方案可以显示此类消息?

即时使用win表单而不是WPF

这是我丰富的小组:

public class ExtendedPanel : Panel
{
    private const int WS_EX_TRANSPARENT = 0x20;
    public ExtendedPanel()
    {
        SetStyle(ControlStyles.Opaque, true);
    }

    private int opacity = 50;
    [DefaultValue(50)]
    public int Opacity
    {
        get
        {
            return this.opacity;
        }
        set
        {
            if (value < 0 || value > 100)
                throw new ArgumentException("value must be between 0 and 100");
            this.opacity = value;
        }
    }
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
            return cp;
        }
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        using (var brush = new SolidBrush(Color.FromArgb(this.opacity * 255 / 100, this.BackColor)))
        {
            e.Graphics.FillRectangle(brush, this.ClientRectangle);
        }
        base.OnPaint(e);
    }
}

这是我如何使用它:

using (ExtendedPanel p = new ExtendedPanel())
{
  p.Location = new Point(0, 0);
  p.Size = f.ClientRectangle.Size;
  p.BackgroundImage = bmp;
  e.f.Controls.Add(p);
  //e.p = p;
  p.BringToFront();
  e.StartPosition = FormStartPosition.CenterParent;
  e.lblTitr.Text = header;
  e.lblText.Text = text;
  e.ShowDialog(f);
  // p.Visible = false;
  // e.f.Controls.Remove(p);
  e.f.Controls.Remove(p);
  e.f.Refresh();

}

2 个答案:

答案 0 :(得分:3)

您可以使用两个 Forms来达到效果:

enter image description here

private void button_Click(object sender, EventArgs e)
{
    Enabled = false;
    Form shadow = new Form();
    shadow.MinimizeBox = false;
    shadow.MaximizeBox = false;
    shadow.ControlBox = false;

    shadow.Text = "";
    shadow.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
    shadow.Size = Size;
    shadow.BackColor = Color.Black;
    shadow.Opacity = 0.3;
    shadow.Show();
    shadow.Location = Location;
    shadow.Enabled = false;

    // here you should use your own messageBox class!
    Form msg = new Form();
    Button btn = new Button() { Text = "OK"};
    btn.Click += (ss, ee) => { msg.Close(); };
    msg.Controls.Add(btn);
    msg.FormClosed += (ss, ee) => { shadow.Close(); Enabled = true; };

    msg.Size = new System.Drawing.Size(200, 100);
    msg.StartPosition = FormStartPosition.Manual;
    msg.Location = new Point(shadow.Left + (shadow.Width - msg.Width) / 2, 
                             shadow.Top + (shadow.Height - msg.Height) / 2);
    msg.ShowDialog();
}

我对msg做的大多数事情都应该进入你自己的自定义消息框表单类中,当然..

一个问题是shadow表单显示在任务栏中,但您可以将ShowInTaskbar设置为false ..

答案 1 :(得分:1)

这不是一项微不足道的任务。最好的方法是创建自己的自定义控件。您可以使用附加的项目作为基础,虽然它正在完成工作,但如果它直接从Control而不是UserControl继承,则会好得多:)

Download Project

你需要7zip来解压缩它。

祝你好运