如何显示深色背景的弹出消息
How to show a pop up message with dark background
我将在我的程序中显示一条错误消息。
我希望我的消息如下图所示,
如您所见,我需要在弹出消息时显示一个黑色阴影。
我遵循两个解决方案来做到这一点:
1 - 我截取了程序的屏幕截图(并将其与黑色混合,有点暗)然后将其附加到面板并显示面板,然后弹出消息表单。它不起作用,因为有时它会截取屏幕上其他程序的屏幕截图(例如电报通知)
2 - 我使用了一个丰富的面板(我从互联网上获得),它可以具有不透明度 属性,然后我将面板的颜色设置为黑色,将不透明度设置为 0.5。然后我弹出消息。
它不起作用,因为这个新面板没有涵盖所有元素(IDK 为什么!)
这两个解决方案都存在一些问题并且没有奏效。
是否有任何解决方案来显示此类消息?
我使用的是 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();
}
这不是一项简单的任务。最好的方法是创建您自己的自定义控件。您可以使用附加的项目作为基础,虽然它正在做这项工作,但如果它继承自 Control
而不是直接继承 UserControl
会更好 :)
您需要 7zip 来解压它。
祝你好运
可以用两个Forms
达到效果:
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
所做的大多数事情都应该进入您自己的自定义消息框表单 class,当然..
一个问题是 shadow
表单显示在任务栏中,但您可以将 ShowInTaskbar
设置为 false..
我将在我的程序中显示一条错误消息。
我希望我的消息如下图所示,
如您所见,我需要在弹出消息时显示一个黑色阴影。
我遵循两个解决方案来做到这一点:
1 - 我截取了程序的屏幕截图(并将其与黑色混合,有点暗)然后将其附加到面板并显示面板,然后弹出消息表单。它不起作用,因为有时它会截取屏幕上其他程序的屏幕截图(例如电报通知)
2 - 我使用了一个丰富的面板(我从互联网上获得),它可以具有不透明度 属性,然后我将面板的颜色设置为黑色,将不透明度设置为 0.5。然后我弹出消息。 它不起作用,因为这个新面板没有涵盖所有元素(IDK 为什么!)
这两个解决方案都存在一些问题并且没有奏效。 是否有任何解决方案来显示此类消息?
我使用的是 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();
}
这不是一项简单的任务。最好的方法是创建您自己的自定义控件。您可以使用附加的项目作为基础,虽然它正在做这项工作,但如果它继承自 Control
而不是直接继承 UserControl
会更好 :)
您需要 7zip 来解压它。
祝你好运
可以用两个Forms
达到效果:
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
所做的大多数事情都应该进入您自己的自定义消息框表单 class,当然..
一个问题是 shadow
表单显示在任务栏中,但您可以将 ShowInTaskbar
设置为 false..