Масштабирование элементов управления в соответствии с разрешением экрана - PullRequest
0 голосов
/ 02 декабря 2011

Я пытаюсь написать программу в vb 2010, которая не зависит от разрешения экрана.

Я проектирую программу в 1920 * 1080, и когда я изменяю разрешение, например, на 800 * 600, все взрывается, иПрограмма не помещается на экран.Как я могу это исправить?

Я пробовал три разных подхода:

  1. перебрать все элементы управления и масштабировать их положение и размеры

    Friend Sub ResizeControl(ByRef ctl As Control)
    
        '---------------------------- GET SCALES -------------------------
        Dim DesignScreenWidth As Integer = 1920
        Dim DesignScreenHeight As Integer = 1080
        Dim CurrentScreenWidth As Integer = Screen.PrimaryScreen.Bounds.Width
        Dim CurrentScreenHeight As Integer = Screen.PrimaryScreen.Bounds.Height
    
        'Ratios
        Dim ratioX As Double = CurrentScreenWidth / DesignScreenWidth        ' e.g.  800/1920
        Dim ratioY As Double = CurrentScreenHeight / DesignScreenHeight
    
        With ctl
            Dim height As Integer = Math.Min(.Height, CurrentScreenHeight)
            Dim width As Integer = Math.Min(.Width, CurrentScreenWidth)
            'Position
            If (.GetType.GetProperty("Top").CanRead) Then .Top = CInt(.Top * ratioY)
            If (.GetType.GetProperty("Left").CanRead) Then .Left = CInt(.Left * ratioX)
            'Size
            If (.GetType.GetProperty("Width").CanRead) Then .Width = CInt(width * ratioX)
            If (.GetType.GetProperty("Height").CanRead) Then .Height = CInt(height * ratioY)
    
        End With
    
        '---------------------- RESIZE SUB CONTROLS -------------------------------
        For Each subCtl As Control In ctl.Controls
            ResizeControl(subCtl)
        Next subCtl
    End Sub
    
  2. Прикрепите каждый элемент управления к основной форме и измените размер только основной формы

  3. пытался перейти в режим AutoScale

    Dim factorX As Double = ratioX * 96.0F 
    Dim factorY As Double = ratioY * 96.0F 
    Dim newSize As SizeF = New SizeF(factorX, factorY)
    
    AutoScaleDimensions = newSize
    AutoScaleMode = AutoScaleMode.Dpi
    
    Scale(newSize)
    Font = New Font(Font.FontFamily, Font.Size * factorX)
    

Ни один из этих методов не сработал для меня.Что я делаю неправильно?Одна вещь, которую я понял, заключалась в том, что моя основная форма больше 800 * 600 пикселей, поэтому, когда я запускаю конструктор с разрешением 800 * 600, VS сокращает значение с до 812 пикселей, поэтому мои вычисления с и, соответственно, коэффициент масштабирования становятся неверными.Эта ошибка применима ко всем трем методам.

Посоветуйте, пожалуйста, лучший метод и если я что-то не так делаю.

1 Ответ

1 голос
/ 05 декабря 2011

В качестве дополнения к моему первому комментарию, взгляните на некоторые лучшие практики из мира UX (пользовательского опыта). В интерфейсах, которые работают, много науки и размышлений.

Есть отличный сайт SE - ux.stackexchange.com, который, как вы можете найти, может отвечать на ваши вопросы лучше, чем SO. Вот некоторые вопросы, которые вы можете найти полезными: https://ux.stackexchange.com/questions/3414/desktop-software-design-patterns (см. MS и Apple имеют свои собственные правила, в том числе такие, как ширина кнопок)

https://ux.stackexchange.com/questions/11361/responsive-web-design-technique-in-desktop-application

Отзывчивый веб-дизайн, кажется, параллелен тому, что вы делаете. Идея заключается в том, чтобы ваш веб-сайт мог обрабатывать любое клиентское устройство, что становится очень важным из-за мобильного взрыва. Я предлагаю немного изучить эти области, чтобы найти хорошее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...