C# 当新窗体出现时创建暗背景

C# 当新窗体出现时创建暗背景,c#,winforms,visual-studio,C#,Winforms,Visual Studio,这对我来说很难解释,所以我为我想要的东西创建了一个模型 有人能解释一下我是怎么做到的吗?也许一些代码会有所帮助,但我认为一个大致的想法或方向就足够了 每当在父背景前面打开一个新窗口时,我想将其变暗 看起来您需要创建一个事件,该事件可能包括一个开始、完成枚举,或者将其设置为bool,以便在同一事件中发出开始/完成信号。让您的大窗口订阅此活动。当显示/创建新表单时,触发事件,并将事件参数设置为Start。当大窗口看到开始事件时,它会根据需要执行任何操作并使自身变暗。当新表单消失时,触发已完成的事件。

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

有人能解释一下我是怎么做到的吗?也许一些代码会有所帮助,但我认为一个大致的想法或方向就足够了


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

看起来您需要创建一个事件,该事件可能包括一个开始、完成枚举,或者将其设置为bool,以便在同一事件中发出开始/完成信号。让您的大窗口订阅此活动。当显示/创建新表单时,触发事件,并将事件参数设置为Start。当大窗口看到开始事件时,它会根据需要执行任何操作并使自身变暗。当新表单消失时,触发已完成的事件。当大窗体看到已完成的事件时,它会自动恢复。

看起来您需要创建一个事件,可能包括开始、完成枚举,或者将其设置为bool,以便在同一事件中发出开始/完成信号。让您的大窗口订阅此活动。当显示/创建新表单时,触发事件,并将事件参数设置为Start。当大窗口看到开始事件时,它会根据需要执行任何操作并使自身变暗。当新表单消失时,触发已完成的事件。当大窗体看到已完成的事件时,它会自动恢复。

我不知道有什么方法可以使控件自身变暗。由于半透明控件也是一团糟,这里有一种方法可以通过将窗体覆盖到另一个半透明的空窗体来获得效果:

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);

在此之后,您打开辅助窗体,当您关闭它时,您将再次隐藏此覆盖窗体。

我不知道如何使控件自身变暗。由于半透明控件也是一团糟,这里有一种方法可以通过将窗体覆盖到另一个半透明的空窗体来获得效果:

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);

在此之后,您将打开次窗体,当您关闭它时,您将再次隐藏此覆盖窗体。

拍摄窗体的屏幕截图,并在其上绘制一个半透明的矩形。将该图像添加到窗体大小的面板中,并将其置于前面。显示您的对话框。清除面板:

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

拍摄表单的屏幕截图,并在其上绘制一个半透明的矩形。将该图像添加到窗体大小的面板中,并将其置于前面。显示您的对话框。清除面板:

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

控件是否位于面板上?如果是,则只需更改面板背景色即可。。你能至少展示一些代码来更好地表达你所拥有的吗?那么关于具体的编码问题,你的问题恰恰是哪一个不适合这里。有人能解释一下我是怎么做到的吗?也许一些代码可以帮上忙,但我认为一个大致的想法或方向就足够了。你可以在其他控件上显示一个图标。控件是否位于面板上?如果是这样,只需更改面板背景色即可。。你能至少展示一些代码来更好地表达你所拥有的吗?那么关于具体的编码问题,你的问题恰恰是哪一个不适合这里。有人能解释一下我是怎么做到的吗?也许一些代码可以帮上忙,但我认为一个大致的想法或方向就足够了。你可以在其他控件上显示一个…它可以做任何需要的事情,并使自己变暗。我想这就是OP想要弄明白的部分。@LarsTech-如果这是他想问的,那么他应该简单地问这个问题。在我看来,他问的似乎是活动顺序,而不是如何在winforms中使客户端区域变暗60%,或者如何使用覆盖层使客户端区域变暗。至于使屏幕变暗,有几种方法。就在我脑海中,他可以抓住他的客户区域,创建一个新的面板,其大小设置为与之匹配,并将其透明度设置为40%或60%左右。当他想恢复正常时,他只需删除面板或将其大小设置为0,0,1,1并将其设置为不可见。制作视觉效果的方法很多。这就是为什么他应该询问效果,而不显示其他形式。我理解混乱,应该更具体。我确实在问如何将客户端区域变暗x%,但我想不出正确的词。谢谢你的意见!很抱歉。只是今天要更直白一点,更专注一点。祝你好运,找到一个好的解决方案!。。。它做它需要的任何事情,并使自己变暗。我想这就是OP想要弄明白的部分。@LarsTech-如果这是他想问的,那么他应该简单地问这个问题。在我看来,他问的似乎是活动顺序,而不是如何在winforms中使客户端区域变暗60%,或者如何使用覆盖层使客户端区域变暗。至于使屏幕变暗,有几种方法。就在我脑子里,他是
uld抓住他的客户区域,创建一个新面板,其大小设置为与之匹配,并将其透明度设置为40%或60%左右。当他想恢复正常时,他只需删除面板或将其大小设置为0,0,1,1并将其设置为不可见。制作视觉效果的方法很多。这就是为什么他应该询问效果,而不显示其他形式。我理解混乱,应该更具体。我确实在问如何将客户端区域变暗x%,但我想不出正确的词。谢谢你的意见!很抱歉。只是今天要更直白一点,更专注一点。祝你好运,找到一个好的解决方案!这可能是解决问题的方法。我确实认为这有点肮脏,但我想不出任何其他可能的方式来实现这样的目标。谢谢这可能是解决问题的方法。我确实认为这有点肮脏,但我想不出任何其他可能的方式来实现这样的目标。谢谢