【问题标题】:Change Resolution Of Form Based On Screen Resolution ( without changing monitor resolution and using Maximized screen option )根据屏幕分辨率更改表单分辨率(不更改显示器分辨率并使用最大化屏幕选项)
【发布时间】:2011-01-10 04:29:10
【问题描述】:

我在论坛上进行了搜索,并尝试了一些方法......但它们似乎并没有真正起作用。让我列出我的问题。

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

我的同事在他的笔记本电脑(分辨率较低)上试用了它,但该应用程序不适合他的笔记本电脑。按钮被拖出屏幕空间。

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

我试过了: Solution 1 : 但是正在改变用户的屏幕分辨率而不是调整表单。

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

请给我一个简单的解决方案。

【问题讨论】:

  • 能否添加表格截图。我需要看看你是否可以拉伸任何控件。有选项可以根据字体大小等来缩放表单,但这取决于您想要的最终效果。
  • 我不能在这里放截图。但是可以告诉你一些表单细节:表单大小:1130、863,开始位置:CenterScreen 和窗口状态:正常(包含近 80 个 UI 组件)。跨度>
  • 您是否尝试过将AutoScaleMode 属性设置为Dpimsdn.microsoft.com/en-us/library/…
  • 我的方法是设计最小的实用窗口,让事物以有用的方式增长。不幸的是,我的代码是用 C++ 编写的,对你没有帮助。

标签: .net vb.net visual-studio-2005 screen-resolution


【解决方案1】:

好的,这很简单。只需遍历 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 Off。经过测试和批准。

【讨论】:

  • 最近有人要求我弄清楚如何动态调整表单及其控件的大小。我用几乎类似的技术成功地完成了遍历所有组件然后根据比例设置它们的大小,我做到了也可以使用字体。
【解决方案2】:

我知道这很愚蠢,但是...您是否尝试设置控制“锚点”

当您调整表单大小时,它们允许您的控件调整大小,也许可以帮助您,还可以考虑使用滚动条

【讨论】:

  • 我不想调整控件的大小但是重新定位它们;我希望它们位于表格的中心。你知道怎么做吗?当我们想要调整控件的大小而不是仅调整位置时,您的解决方案很好。
  • 我使用了Top,但是当我最大化窗口时,所有控件都改变了它的位置 wrt 顶部。我希望它们位于中心(我不能使用顶部和底部,因为控件将被调整大小)。
【解决方案3】:

您可以使用以下代码获取主屏幕的高度和宽度:

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。
  • @Jene - 你能更具体一点吗?您无法检索屏幕宽度/高度吗?您是否正在努力解决如何设置表单宽度/高度?
  • 我可以动态更改表单大小,但表单控件无法调整大小。这会导致失去一些控制。
  • @Jene - 您需要使用 Anchor 和 Dock 设置配置表单控件,以便它们在您调整表单大小时正确移动和调整大小。当您拥有此权限时,您将能够在表单设计器中调整表单大小并观察所有控件的大小是否适当调整。
【解决方案4】:

简单的解决方案?

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

【讨论】:

    【解决方案5】:

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

    Have a look at these.

    【讨论】:

      【解决方案6】:

      vb.net 2013 在此站点上找到了一些此代码,现在找不到它以给予信任!:-( 以 1780x760 的 15.5 笔记本电脑分辨率制作,更改用户主屏幕工作区域。调整控件大小以匹配表单新的尺寸,如果它比原来的分辨率达到一定的分辨率,字体也一样。试试吧,玩吧。

      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
      

      【讨论】:

        【解决方案7】:

        我认为在 VB.Net 中有更简单的方法来做到这一点,通过更改表单属性的两个值。

        1. AutoSize = True

        2. AutoScaleMode = Dpi

        谢谢。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-28
          相关资源
          最近更新 更多