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

标签 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();

最佳答案

可以使用两个 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..

关于c# - 如何显示深色背景的弹出消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34947504/

相关文章:

c# - 有没有办法使用 Mage/MageUI 为 ClickOnce 应用程序 list 指定应用程序图标?

c# - Linq to XML 具有 n 个动态 where 条件

.net - Wf 4 接收事件 : Difference between Messages and Parameters

c# - 为什么没有捕获异常?

c# - 使用 MediaPlayer 控件自动播放下一个文件(AxWindowsMediaPlayer)

c# - 等待 HttpWebRequest.BeginGetRequestStream 结束

c# - 自定义 WPF 绑定(bind)

javascript - Visual Studio - javascript 自定义对象的智能感知

winforms - 当子列表更改时,我应该如何处理 INotifyPropertyChanged

.net - WinForms:对象数据源使用最佳实践