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

时间:2014-12-04 21:56:07

标签: c# winforms visual-studio

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

Mockuk example

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

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

3 个答案:

答案 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事件。当大型表格看到"已完成"事件,它恢复了自己。