仅在一些具有“奇怪”视频大小的PC上,WinForm应用程序无法正确设置锚定控件的大小。奇怪,例如用作VGA设备的电视。调整大小在Win7桌面上运行正常,但我需要该应用程序在会议室中工作相同。
Private Sub frmSearch2_ResizeEnd(sender As Object, e As EventArgs) Handles Me.ResizeEnd
Dim s As String = ""
s &= "me.size " & Me.Size.ToString & vbNewLine
s &= "Me.ClientSize " & Me.ClientSize.ToString & vbNewLine
s &= "dgv size: " & dgv01.Size.ToString & vbNewLine ' initially incorrect
s &= "panel size: " & Panel1.Size.ToString ' initially incorrect
Clipboard.SetText(s)
dgv01.Width = Me.ClientSize.Width - (dgv01.Left * 2) ' manually set width based on ClientSize
End Sub
在问题PC上执行:
me.size {Width=941, Height=578}
Me.ClientSize {Width=925, Height=540}
dgv size: {Width=939, Height=361}
panel size: {Width=964, Height=52}
请注意,dgv比客户端区域宽,即使它固定在所有方面。高度正在调整大小。我添加了一个停靠在左右边缘的面板,看它是否会正确调整大小 - 不。更改AutoScaleMode似乎没有帮助 - 没有尝试所有可能性。请记住:缩放适用于大多数PC。
手动设置DGV宽度的最后一行代码在视觉上是正常的。这对于一个非常简单的表单来说没问题,但是我有很多控件,其中一些控件需要同样的注意。
可能是视频驱动程序问题,但代码显示WinForm具有正确的ClientSize,它只是没有使用该值来调整控件的大小。
我可以调用强制WinForm使用有效的ClientSize重新处理锚点吗?或??
答案 0 :(得分:0)
这是一个奇怪的问题......有些WinForms会遇到问题而有些则没有。我无法确定相关的差异。
下面的代码对我们来说效率为90 +%,因为我们在需要在问题PC上调整大小的表单上有重要控件的常用名称和位置。 Panel-pnlResizer - 被添加到一些必须在问题PC上运行的表单中 - 它包含大多数其他重要控件。
Try
' try to deal with bad video drivers
Dim ctl() As Control = frm.Controls.Find("TabControl1", False)
If ctl.Length = 1 AndAlso (ctl(0).Width + ctl(0).Left) > frm.ClientSize.Width Then
ctl(0).Width = frm.ClientSize.Width - ctl(0).Left - 5
End If
ctl = frm.Controls.Find("StatusStrip1", False)
If ctl.Length = 1 AndAlso (ctl(0).Width + ctl(0).Left) > frm.ClientSize.Width Then
ctl(0).Width = frm.ClientSize.Width
End If
ctl = frm.Controls.Find("ToolStrip1", False)
If ctl.Length = 1 AndAlso (ctl(0).Width + ctl(0).Left) > frm.ClientSize.Width Then
ctl(0).Width = frm.ClientSize.Width - ctl(0).Left - 5
End If
ctl = frm.Controls.Find("pnlResizer", False)
If ctl.Length = 1 AndAlso (ctl(0).Width + ctl(0).Left) > frm.ClientSize.Width Then
ctl(0).Width = frm.ClientSize.Width - ctl(0).Left - 5
End If
Catch ex As Exception
End Try