出现新表单时创建深色背景

这对我来说很难实际解释所以我为我想要的东西创建了一个模型。

Mockuk的例子

有人可以解释我怎么做到这一点? 也许一些代码可能有所帮助,但我认为一般的想法或方向就足够了。

每当在它前面打开一个新窗口时,我想让父背景变暗。

获取表单的屏幕截图并在其上绘制一个半透明矩形。 将该图像添加到表单大小的面板中并将其放在前面。 显示您的对话框。 摆脱面板:

  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... } 

我不知道有什么方法可以使控件变暗。 而且由于半透明控件也是一团糟,这里有一种方法可以通过将另一个空表单覆盖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); 

在此之后,您打开辅助表单,当您关闭它时,再次隐藏此叠加表单..

看起来你需要创建一个事件(可能包括Start,Completed的枚举或使它成为bool,因此它可以在同一事件中发出Start / Completed信号)。 让您的大窗口订阅此活动。 当需要显示/创建新表单时,触发事件(事件arg设置为Start)。 当大窗口看到“开始”事件时,它会做任何需要的事情并使自己变暗。 当新表单消失时,触发Completed事件。 当大表格看到“已完成”事件时,它会自行恢复。