如何通过调整宽高比来锁定表单以进一步调整大小

时间:2013-06-28 01:39:40

标签: vb.net resize flicker aspect-ratio

我目前使用此代码,它可以完美地运行

我的问题是如何修改WndProc以达到我的首选宽度和高度限制。好的我通过设置MinimumSize解决了这个问题,但是新的当窗体的宽高比达到windows桌面maximum right大小的限制时,会出现问题,它开始变得混乱,宽高比开始拉伸而不是锁定。

需要以某种方式修复WndProc SystemInformation.VirtualScreen.Width,以便在达到限制宽度时停止增加两种尺寸。

我添加了这个有效,但它仍然只是为了我的解决方案我如何使它普遍支持所有的决议。

        If r.right - r.left > SystemInformation.VirtualScreen.Width Then
            r.bottom = 900 'quick fix (not good) how to calculate this value?
        End If

代码来源: http://www.vb-helper.com/howto_net_form_fixed_aspect.html

Imports System.Runtime.InteropServices
...
Public Structure Rect
    Public left As Integer
    Public top As Integer
    Public right As Integer
    Public bottom As Integer
End Structure

Protected Overrides Sub WndProc(ByRef m As _
    System.Windows.Forms.Message)
    Static first_time As Boolean = True
    Static aspect_ratio As Double
    Const WM_SIZING As Long = &H214
    Const WMSZ_LEFT As Integer = 1
    Const WMSZ_RIGHT As Integer = 2
    Const WMSZ_TOP As Integer = 3
    Const WMSZ_TOPLEFT As Integer = 4
    Const WMSZ_TOPRIGHT As Integer = 5
    Const WMSZ_BOTTOM As Integer = 6
    Const WMSZ_BOTTOMLEFT As Integer = 7
    Const WMSZ_BOTTOMRIGHT As Integer = 8

    If m.Msg = WM_SIZING And m.HWnd.Equals(Me.Handle) Then
        ' Turn the message's lParam into a Rect.
        Dim r As Rect
        r = DirectCast( _
            Marshal.PtrToStructure(m.LParam, _
                GetType(Rect)), _
            Rect)

        ' The first time, save the form's aspect ratio.
        If first_time Then
            first_time = False
            aspect_ratio = (r.bottom - r.top) / (r.right - _
                r.left)
        End If

        ' Get the current dimensions.
        Dim wid As Double = r.right - r.left
        Dim hgt As Double = r.bottom - r.top

        ' Enlarge if necessary to preserve the aspect ratio.
        If hgt / wid > aspect_ratio Then
            ' It's too tall and thin. Make it wider.
            wid = hgt / aspect_ratio
        Else
            ' It's too short and wide. Make it taller.
            hgt = wid * aspect_ratio
        End If

        ' See if the user is dragging the top edge.
        If m.WParam.ToInt32 = WMSZ_TOP Or _
           m.WParam.ToInt32 = WMSZ_TOPLEFT Or _
           m.WParam.ToInt32 = WMSZ_TOPRIGHT _
        Then
            ' Reset the top.
            r.top = r.bottom - CInt(hgt)
        Else
            ' Reset the height to the saved value.
            r.bottom = r.top + CInt(hgt)
        End If

        ' See if the user is dragging the left edge.
        If m.WParam.ToInt32 = WMSZ_LEFT Or _
           m.WParam.ToInt32 = WMSZ_TOPLEFT Or _
           m.WParam.ToInt32 = WMSZ_BOTTOMLEFT _
        Then
            ' Reset the left.
            r.left = r.right - CInt(wid)
        Else
            ' Reset the width to the saved value.
            r.right = r.left + CInt(wid)
        End If

        ' Update the Message object's LParam field.
        Marshal.StructureToPtr(r, m.LParam, True)
    End If

    MyBase.WndProc(m)
End Sub

1 个答案:

答案 0 :(得分:0)

您可以使用Screen.PrimaryScreen.Bounds.BottomScreen.PrimaryScreen.Bounds.Right

找出用户的桌面分辨率