【问题标题】:Check if Form is in bounds of all screens检查表单是否在所有屏幕的范围内
【发布时间】:2013-01-17 16:22:22
【问题描述】:

我正在尝试详细说明完整的表单是否在屏幕上可见。为了澄清这一点:我不在乎表单是否被另一个表单部分或完全隐藏,我只想知道表单是否完全在屏幕上。

在 Windows 中,可以移动表单,使它们隐藏到一半。那是因为您可以将它们移动到任何监视器的实际边界之外。 (进一步向左、向右或向下。)如何以简单的方式检查是否是这种情况?

我想我可以做的是检查表单是否在SystemInformation.VirtualScreen 的范围内。这里的问题是,并非虚拟屏幕的每个像素实际上都是可见的。当然,如果SystemInformation.MonitorCount = 1

我仍然对此并不满意。

【问题讨论】:

    标签: vb.net winforms


    【解决方案1】:
    Public Function IsOnScreen(ByVal form As Form) As Boolean
        Dim screens() As Screen = Screen.AllScreens
    
        For Each scrn As Screen In screens
            Dim formRectangle As Rectangle = New Rectangle(form.Left, form.Top, form.Width, form.Height)
    
            If scrn.WorkingArea.Contains(formRectangle) Then
                Return True
            End If
        Next
    
        Return False
    End Function
    

    【讨论】:

    • 你到底为什么要使用 DoEvents?
    • 如果窗口最大化则返回False
    【解决方案2】:

    我能想到的最好方法是检查表单的所有四个角是否都在屏幕上。像这样:

        public bool FormOnScreen(Form frm) {
            if (frm.IsHandleCreated) throw new InvalidOperationException();
            if (!frm.Visible || frm.WindowState == FormWindowState.Minimized) return false;
            return PointVisible(new Point(frm.Left, frm.Top)) &&
                   PointVisible(new Point(frm.Right, frm.Top)) &&
                   PointVisible(new Point(frm.Right, frm.Bottom)) &&
                   PointVisible(new Point(frm.Left, frm.Bottom));
        }
    
        private static bool PointVisible(Point p) {
            var scr = Screen.FromPoint(p);
            return scr.Bounds.Contains(p);
        }
    

    【讨论】:

    • 好吧,我只需要在这里构建一个不起眼的例子。想象三台显示器并排排列,每台宽 800 像素。显示器 1 和 3 高 600 像素,显示器 2(中间的那个)高 400 像素。虚拟屏幕空间为 1800px*600px。如果监视器 2 将在其他监视器的顶部对齐,那么虚拟屏幕空间的底部将有 200 像素不可见。现在我可以将一个窗口从监视器 1 跨越到监视器 3,整个窗体将不可见,监视器 2 上的底部会丢失。
    • 好吧,您需要编写更多代码来处理这种情况。祝你好运。
    • 我知道,这只是一个非常构建的示例。我希望它永远不会变成那样。
    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 2023-04-03
    • 2017-07-13
    • 1970-01-01
    • 2021-03-30
    • 2016-05-03
    • 2015-11-28
    • 1970-01-01
    相关资源
    最近更新 更多