这对我来说很难解释,所以我为我想要的东西创建了一个模型。
有人可以解释我怎么做到这一点?也许一些代码可能有所帮助,但我认为一般的想法或方向就足够了。
每当在它前面打开一个新窗口时,我想让父背景变暗。
答案 0 :(得分:9)
获取表单的屏幕截图并在其上绘制一个半透明的矩形。将该图像添加到表单大小的面板中并将其放在前面。显示您的对话框。摆脱面板:
private void button1_Click(object sender, EventArgs e)
{
// take a screenshot of the form and darken it:
Bitmap bmp = new Bitmap(this.ClientRectangle.Width, this.ClientRectangle.Height);
using (Graphics G = Graphics.FromImage(bmp))
{
G.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
G.CopyFromScreen(this.PointToScreen(new Point(0, 0)), new Point(0, 0), this.ClientRectangle.Size);
double percent = 0.60;
Color darken = Color.FromArgb((int)(255 * percent), Color.Black);
using (Brush brsh = new SolidBrush(darken))
{
G.FillRectangle(brsh, this.ClientRectangle);
}
}
// put the darkened screenshot into a Panel and bring it to the front:
using (Panel p = new Panel())
{
p.Location = new Point(0, 0);
p.Size = this.ClientRectangle.Size;
p.BackgroundImage = bmp;
this.Controls.Add(p);
p.BringToFront();
// display your dialog somehow:
Form frm = new Form();
frm.StartPosition = FormStartPosition.CenterParent;
frm.ShowDialog(this);
} // panel will be disposed and the form will "lighten" again...
}
答案 1 :(得分:2)
我不知道如何让控件变暗自己。而且由于半透明控件也很混乱,这里有一种方法可以通过将Form转换为另一个半透明的空Form来获得效果:
Form fff;
fff = new Form();
fff.ControlBox = false;
fff.MinimizeBox = false;
fff.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
fff.Text = "";
fff.Size = Size;
fff.BackColor = Color.DarkSlateBlue;
fff.Opacity = 0.2f;
fff.Show();
fff.Location = this.Location;
如果您只希望ClientRectangle显示为黑暗,请更改这些行:
fff.Size = ClientSize;
fff.Location = PointToScreen(Point.Empty);
在此之后,您打开辅助表单,当您关闭它时,再次隐藏此叠加表单。
答案 2 :(得分:0)
看起来您需要创建一个事件(可能包含Start,Completed的枚举或使其成为bool,因此它可以在同一事件中发出Start / Completed信号)。让您的大窗口订阅此活动。当显示/创建新表单时,触发事件(事件arg设置为Start)。当大窗口看到"开始"事件,它做任何它需要的东西,并使自己变暗。当新表单消失时,触发Completed事件。当大型表格看到"已完成"事件,它恢复了自己。