如何获取Winforms表单的"true"宽度 - 实际可见像素数?



我有一个WinForms应用程序。它有一个MainWindowForm(创造性地(,名为Form1,其中有一个最大化的子Form,名为fymmapdraw。子窗体是使用以下VB.NET代码段创建的:

fformmapdraw = New fymmapdraw With {
.MdiParent = Form1,
.WindowState = FormWindowState.Maximized
}
fformmapdraw.Show()

我的问题是,在Form1最大化和fymmapdraw最大化的情况下,fymmapdraw.Width报告的值在某些情况下大于屏幕宽度。这是fymmapdraw中图形代码的一个问题,其中某些捕捉功能会错误地捕捉到窗边框之外。

它似乎链接到Aero风格的桌面-宽度在Windows XP上是正确的,如果没有使用Aero风格桌面主题,在Windows 7上也是正确的,但在启用此类主题的Windows 7或10上是不正确的。

我的屏幕分辨率是1920x1080。fymmapdrawMouseMove事件e.X属性报告的鼠标X坐标范围为0到1915,该属性相对于窗体本身进行报告。这些值是合理的——窗框两侧都会丢失几个像素。

但是,表单的Me.Width属性返回1932个像素,超过屏幕宽度。CCD_ 13返回-8并且CCD_ 14返回1924。

该应用程序相当古老,最初可以追溯到Windows XP时代(2006-7(。它目前正在使用.Net Framework 4.0。fymmapdraw的FormBorderStyle设置为Sizable,AutoScaleMode设置为Font(尽管它不包含文本控件或类似控件-所有绘图都由自定义代码处理(。

有没有一种方法可以让Form.Width返回";正确的";值——即可见像素的真实数量——可能是通过更改窗体或应用程序的某些属性?如果不是,Form还有另一个属性可以得到真正的宽度?

下图显示了输出。在左上角;生的";坐标是MouseMove事件报告的坐标,鼠标正好在右手边界内。";"形状尺寸";报道了CCD_ 17和CCD_。小控制条是一个捕捉错误的控制条——它的右手边等于fymmapdraw.Width,但部分不在屏幕上(应该可以看到一个全蓝色的边框(。

表单的图像

如果游戏的目的是确定表单的可见大小,那么当它最大化时,你肯定会对表单所在屏幕的边界而不是表单大小感兴趣?

Dim screenRect = Screen.FromControl(yourForm1).Bounds

这会为屏幕提供一个矩形。。

如果它没有最大化,那么对窗体的位置、宽度/高度以及屏幕的宽度/高度进行一些抖动,以计算窗体有多少在屏幕的可见边界内。。。

不过,多监视器设置可能会相互偏移,所以在计算第二个(和第三个(屏幕上显示的表格部分时,还有另一个曲线球。。。

如果上面的答案没有给你想要的结果,试着沿着x轴检查像素的颜色,找到你的程序颜色在背景上中断的点,然后找到差异。

最新更新