不改变显示器分辨率和使用最大化屏幕选项的情况下,根据屏幕分辨率更改表单的分辨率。

4

我在论坛上搜索了一些内容,并尝试了一些方法,但它们似乎并没有真正起作用。让我来说明一下我的问题。

我在笔记本电脑上有非常高的屏幕分辨率:1400x1050。我正在设计我的应用程序。

我的同事在他的笔记本电脑上尝试了一下(分辨率较低),但该应用程序无法适应他的笔记本电脑。按钮超出了屏幕空间。

因此,我希望我的应用程序可以根据屏幕分辨率自动调整大小/调整。我找到了一些类似的论坛,并尝试了一些开发人员建议的方法,但对我来说并没有真正起作用。

我尝试了: 解决方案1 :但是它会更改用户的屏幕分辨率而不是调整表单。

我不想使用最大化屏幕选项,也不想更改用户的电脑设置。 不幸的是,我没有使用表格布局面板。

请为我提供一个简单的解决方案。


你能添加一个表单的截图吗?我需要看看你是否可以拉伸任何控件。有根据字体大小等比例缩放表单的选项,但这取决于你想要的最终效果是什么。 - John Alexiou
我无法在这里放置截图。但是可以告诉您一些表单细节:表单大小:1130、863,起始位置:CenterScreen,窗口状态:正常(包含近80个UI组件)。 - Preeti
你尝试过将AutoScaleMode属性设置为Dpi吗?http://msdn.microsoft.com/zh-cn/library/system.windows.forms.autoscalemode.aspx - Maxim Gueivandov
我的方法是设计最小实用窗口,并允许事物以有用的方式增长。不幸的是,我的代码是用C++编写的,可能对你没有帮助。 - Mark Ransom
7个回答

3
我知道这可能有点傻,但是...你试过设置控件"锚点"吗?
它们允许你的控件在调整窗体大小时进行调整大小,也许可以帮助你,同时考虑使用滚动条。

我不想调整控件的大小,而是重新定位它们;我希望它们位于窗体的中心。你知道怎么做吗?当我们只想调整位置而不是调整大小时,你的解决方案很好。 - manooooh
我使用了 Top,但是当我最大化窗口时,所有控件都会相对于 Top 更改其位置。我希望它们位于中心(我不能使用 TopBottom,因为控件将被调整大小)。 - manooooh

3

好的,这很简单。只需遍历VB控件并根据新屏幕分辨率与设计屏幕分辨率的比例调整它们的大小。例如:

    Dim DesignScreenWidth As Integer = 1600
    Dim DesignScreenHeight As Integer = 1200
    Dim CurrentScreenWidth As Integer = Screen.PrimaryScreen.Bounds.Width
    Dim CurrentScreenHeight As Integer = Screen.PrimaryScreen.Bounds.Height
    Dim RatioX as Double = CurrentScreenWidth / DesignScreenWidth
    Dim RatioY as Double = CurrentScreenHeight / DesignScreenHeight
    For Each iControl In Me.Controls
        With iControl
            If (.GetType.GetProperty("Width").CanRead) Then .Width = CInt(.Width * RatioX)
            If (.GetType.GetProperty("Height").CanRead) Then .Height = CInt(.Height * RatioY)
            If (.GetType.GetProperty("Top").CanRead) Then .Top = CInt(.Top * RatioX)
            If (.GetType.GetProperty("Left").CanRead) Then .Left = CInt(.Left * RatioY)
        End With
    Next

请注意,我正在使用反射来查看每个控件是否具有我们需要调整的属性。 我所做的方式很干净,但使用了“后期绑定”,并且需要关闭Option Strict。 经过测试和批准。


最近我被要求找出如何动态调整窗体及其控件的大小。我成功地采用了几乎相似的技术,即遍历所有组件,然后根据比例设置它们的大小,我也对字体做了同样的处理。 - DareDevil

1

简单的解决方案?

以最低预期分辨率(例如800x600)设计您的应用程序,以便可以进行放大。


1
您可以使用以下代码获取主屏幕的高度和宽度:
Dim intX As Integer = Screen.PrimaryScreen.Bounds.Width
Dim intY As Integer = Screen.PrimaryScreen.Bounds.Height

鉴于此,当表单加载时,您应该执行检查以确保表单的宽度小于屏幕的宽度:

// This is pseudocode, as I usually do C#:
MyForm.Width = Min(ScreenWidth, MyForm.Width)
MyForm.Height = Min(ScreenHeight, MyForm.Height)

在大多数情况下,这应该可以解决问题了(只要您的表格已经处理好了调整大小的情况)——如果您想要适应多个屏幕,那么需要一些额外的逻辑来获取您的表格所在屏幕的尺寸,但是对于您想要的结果而言,这似乎有点过度。


这个解决方案对Kragen不起作用。 - Preeti
@Jene - 你能具体一点吗?你不能检索到屏幕宽度/高度吗?你是否在努力确定如何设置表单的宽度/高度? - Justin
1
我可以动态地更改窗体大小,但窗体控件不会随之调整大小,这将导致一些控件的丢失。 - Preeti
1
@Jene - 你需要使用 Anchor 和 Dock 设置来配置表单控件,以便在调整表单大小时它们可以正确移动和调整大小。当你做对了,你就可以在表单设计器中调整表单大小并观察所有控件适当地调整大小。 - Jason Williams

0

vb.net 2013发现一些代码在这个网站上,现在找不到了,无法给予信用! :-( 将15.5英寸笔记本电脑分辨率改为1780x760,更改为用户主屏幕工作区。调整控件以匹配表单的新大小,如果超过原始分辨率,则也调整字体。试试它,玩玩它。

Option Strict On
Option Explicit On
Public Class Form1
    ' For screen size changes. 
    Dim cw As Integer ' Forms current Width.
    Dim ch As Integer ' Forms current Height.
    Dim iw As Integer = 1280 ' Forms initial width.
    Dim ih As Integer = 760 ' Forms initial height.
    ' Retrieve the working rectangle from the Screen class using the        PrimaryScreen and the WorkingArea properties.  
    Dim workingRectangle As System.Drawing.Rectangle =     Screen.PrimaryScreen.WorkingArea

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' Set the size of the form slightly less than size of working rectangle. 
    Me.Size = New System.Drawing.Size(workingRectangle.Width - 5, workingRectangle.Height - 5)
    ' Set the location so the entire form is visible. 
    Me.Location = New System.Drawing.Point(3, 3)
End Sub

Private Sub Main_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
    ' Change controls size and fonts to fit screen working area..
    Dim rw As Double = (Me.Width - cw) / cw ' Ratio change of original form width.
    Dim rh As Double = (Me.Height - ch) / ch ' Ratio change of original form height.
    ' Change controls size to fit users screen working area.
    For Each Ctrl As Control In Controls
        Ctrl.Width += CInt(Ctrl.Width * rw)
        Ctrl.Height += CInt(Ctrl.Height * rh)
        Ctrl.Left += CInt(Ctrl.Left * rw)
        Ctrl.Top += CInt(Ctrl.Top * rh)
    Next
    cw = Me.Width
    ch = Me.Height
    ' Change all the forms controls font size.
    Dim nfsize As Single
    If cw > iw + 500 Then
        For Each Ctrl As Control In Controls
            ' Get the forms controls font size's property and increase it. Reset the font to the new size. 
            nfsize = Me.Font.Size + 3
            Ctrl.Font = New Font(Ctrl.Font.Name, nfsize, FontStyle.Bold, Ctrl.Font.Unit)
        Next
    Else
        Exit Sub
    End If
End Sub

0

如果您无法或不愿意缩小某些控件,您可能可以使用一些面板,这些面板可以根据用户的意愿固定/显示/隐藏。这将为您提供更多的灵活性。

看看这些。


0

我认为在VB.Net中有更简单的方法来实现这个,只需要改变窗体属性的两个值。

  1. AutoSize = True

  2. AutoScaleMode = Dpi

谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接