在所有屏幕上加载表格

瓦拉基克

会员
已加入
2020年11月8日
留言内容
9
编程经验
Beginner
您好
很久以前,我提到我现在正在制作父母控制应用程序,但我坚持做一件事。
我试图用透明的黑色形式遮盖屏幕,以便孩子们在时间到时不能使用笔记本电脑。

在加载表单事件中获得此代码之前:

C#:
 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:
                TimeEndedForm timended = new TimeEndedForm();
                timended.Show();
            }

之后是这样的:

C#:
 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())
            {
                int height = 0;
                int width = 0;
                foreach (Screen screen in Screen.AllScreens)
                {
                    //take smallest height
                    height = (screen.Bounds.Height <= height) ? screen.Bounds.Height : height;
                    width += screen.Bounds.Width;
                }

                p.Location = new Point(0, 0);
                this.Size = new Size(width, height);
                // p.Size = this.ClientRectangle.Size;
                p.Size = new Size(width, height);
                p.BackgroundImage = bmp;
                this.Controls.Add(p);
                p.BringToFront();

                // display your dialog somehow:
                TimeEndedForm timended = new TimeEndedForm();
                timended.Show();
            }

两种方法都不能帮助我在所有屏幕上显示透明的黑色表单(如果有多个屏幕,笔记本电脑屏幕和单独的屏幕)。
该表格仅显示在主屏幕上。

如何在两个屏幕上都显示?

注意:TimeEndedForm仅用于在我不在家的情况下请求更多时间,以便孩子们在需要做的事情时可以做一些事情。在TimeEndedForm的后面出现黑色的透明表单/面板。

预先感谢您所有的答案。
 
Solution
好的。
我对整个星期使用GetDesktopBoundse函数后得到的结果感到满意:

C#:
private static Rectangle GetDesktopBoundse(Form main)
            {
                Rectangle result = new Rectangle();
            for (int i = 0; i < Screen.AllScreens.Length; i++)
                {
                Screen screen = Screen.AllScreens[i];
                result = Rectangle.Union(result, screen.Bounds);
            }

            main.Top = result.Top;
            main.Left = result.Left;
            main.Width = result.Width;
            main.Height = result.Height;
            return result;
        }

如果有人要制作类似的应用,我希望其他人也可以使用。

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,486
地点
悉尼,澳大利亚
编程经验
10+
C#:
Dim allBounds = Screen.AllScreens.Select(Function(s) s.Bounds).ToArray()
Dim minX = allBounds.Min(Function(s) s.X)
Dim minY = allBounds.Min(Function(s) s.Y)
Dim maxX = allBounds.Max(Function(s) s.X)
Dim maxY = allBounds.Max(Function(s) s.Y)
我将留给您了解如何使用该信息。
 

瓦拉基克

会员
已加入
2020年11月8日
留言内容
9
编程经验
Beginner
1607860073855.png


如果我贴标签看尺寸,那是正确的。我在两个屏幕上都具有1920x1080的屏幕设置,但是表单不想最大化到两个屏幕,而只停留在主屏幕上。
我现在将其更改为我的代码:

C#:
private void Background_Load(object sender, EventArgs e)
        {
            Rectangle desktopRect = GetDesktopBoundse();

            Bitmap bmp = new Bitmap(desktopRect.Width, desktopRect.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), desktopRect.Size);
                double percent = 0.60;
                Color darken = Color.FromArgb((int)(255 * percent), Color.Black);
                using (Brush brsh = new SolidBrush(darken))
                {
                        G.FillRectangle(brsh, desktopRect);
                }

            }
            

            // put the darkened screenshot into a Panel and bring it to the front:
            using (Panel p = new Panel())
            {
                 最佳Level = true;
                Size = new Size(desktopRect.Width, desktopRect.Height);
                p.Location = desktopRect.Location;
                //p.Size = this.ClientRectangle.Size;
                p.Size = desktopRect.Size;
                p.BackgroundImage = bmp;
                this.Controls.Add(p);
                p.BringToFront();

                // display your dialog somehow:
                TimeEndedForm timended = new TimeEndedForm();
                timended.TopMost = true;
                timended.Show();
            }
        }

        private static Rectangle GetDesktopBoundse()
            {
                Rectangle result = new Rectangle();
            for (int i = 0; i < Screen.AllScreens.Length; i++)
                {
                Screen screen = Screen.AllScreens[i];
                result = Rectangle.Union(result, screen.Bounds);
            }
                return result;
        }

我将表单属性的开始位置更改为“手动”,并将windowstate更改为“正常”。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,474
地点
弗吉尼亚州切萨皮克
编程经验
10+
如果每个屏幕都需要一个表单,则需要在每个屏幕上放置一个表单。 (了解无模式对话框的时间。)这是因为您不应该尝试在多个屏幕上最大化,因为不能保证屏幕对称放置,具有相同的点距并且没有间隙。想象一个用户以横向显示一个屏幕,以纵向模式显示第二个屏幕的用户。除非一台显示器的高度等于另一台显示器的宽度,否则某个地方将缺少矩形块。
 

瓦拉基克

会员
已加入
2020年11月8日
留言内容
9
编程经验
Beginner
好的。
我对整个星期使用GetDesktopBoundse函数后得到的结果感到满意:

C#:
private static Rectangle GetDesktopBoundse(Form main)
            {
                Rectangle result = new Rectangle();
            for (int i = 0; i < Screen.AllScreens.Length; i++)
                {
                Screen screen = Screen.AllScreens[i];
                result = Rectangle.Union(result, screen.Bounds);
            }

            main.Top = result.Top;
            main.Left = result.Left;
            main.Width = result.Width;
            main.Height = result.Height;
            return result;
        }

如果有人要制作类似的应用,我希望其他人也可以使用。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,486
地点
悉尼,澳大利亚
编程经验
10+
You should not be setting those four properties separately. As you already have a Rectangle, you should simply set the Bounds property. If you had individual values then you'd call SetBounds.
 

瓦拉基克

会员
已加入
2020年11月8日
留言内容
9
编程经验
Beginner
哦好的。谢谢。
现在,它可以正常工作,但是如果我将应用程序放到儿童笔记本电脑上时无法正常工作,那么我会按照您的建议进行操作。谢谢。 :)
 
最佳 底部