我将在我的程序中显示错误消息。
我希望我的消息如下图所示,
正如您所看到的,当弹出消息时,我需要显示一个暗影。
我遵循两个解决方案来做到这一点:
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();
}
答案 0 :(得分:3)
您可以使用两个 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
做的大多数事情都应该进入你自己的自定义消息框表单类中,当然..
一个问题是shadow
表单显示在任务栏中,但您可以将ShowInTaskbar
设置为false ..
答案 1 :(得分:1)
这不是一项微不足道的任务。最好的方法是创建自己的自定义控件。您可以使用附加的项目作为基础,虽然它正在完成工作,但如果它直接从Control
而不是UserControl
继承,则会好得多:)
你需要7zip来解压缩它。
祝你好运