Results 1 to 4 of 4

Thread: Prevent Form Resize Below Specific Size

  1. #1

    Thread Starter
    Hyperactive Member
    Join Date
    Jul 2005
    Posts
    400

    Prevent Form Resize Below Specific Size

    How can I restrict a form from getting any smaller than a certain size? I've been using:

    Code:
    Option Explicit
    
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Const GWL_WNDPROC = (-4)
    
    Private Const WM_SIZING = &H214
    
    Private Const WMSZ_LEFT = 1
    Private Const WMSZ_RIGHT = 2
    Private Const WMSZ_TOP = 3
    Private Const WMSZ_TOPLEFT = 4
    Private Const WMSZ_TOPRIGHT = 5
    Private Const WMSZ_BOTTOM = 6
    Private Const WMSZ_BOTTOMLEFT = 7
    Private Const WMSZ_BOTTOMRIGHT = 8
    
    Private MIN_WIDTH As Long  'The minimum width in pixels
    Private MIN_HEIGHT As Long  'The minimum height in pixels
    Private MAX_WIDTH As Long   'The maximum width in pixels
    Private MAX_HEIGHT As Long  'The maximum height in pixels
    
    Private Type RECT
        Left   As Long
        Top    As Long
        RIGHT  As Long
        Bottom As Long
    End Type
    
    Private mPrevProc As Long
    
    Public Sub Hook(hWnd As Long)
        mPrevProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf NewWndProc)
    End Sub
    
    Public Sub Unhook(hWnd As Long)
        Call SetWindowLong(hWnd, GWL_WNDPROC, mPrevProc)
        mPrevProc = 0&
    End Sub
    
    Public Function NewWndProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    On Error Resume Next
    
    MIN_WIDTH = 200
    MIN_HEIGHT = 200
    MAX_WIDTH = Screen.Width
    MAX_HEIGHT = Screen.Height
    
    Dim r As RECT
    
        If uMsg = WM_SIZING Then
            Call CopyMemory(r, ByVal lParam, Len(r))
        
            'Keep the form only at least as wide as MIN_WIDTH
            If (r.RIGHT - r.Left < MIN_WIDTH) Then
                Select Case wParam
                    Case WMSZ_LEFT, WMSZ_BOTTOMLEFT, WMSZ_TOPLEFT
                        r.Left = r.RIGHT - MIN_WIDTH
                    Case WMSZ_RIGHT, WMSZ_BOTTOMRIGHT, WMSZ_TOPRIGHT
                        r.RIGHT = r.Left + MIN_WIDTH
                End Select
            End If
            
            'Keep the form only at least as tall as MIN_HEIGHT
            If (r.Bottom - r.Top < MIN_HEIGHT) Then
                Select Case wParam
                    Case WMSZ_TOP, WMSZ_TOPLEFT, WMSZ_TOPRIGHT
                        r.Top = r.Bottom - MIN_HEIGHT
                    Case WMSZ_BOTTOM, WMSZ_BOTTOMLEFT, WMSZ_BOTTOMRIGHT
                        r.Bottom = r.Top + MIN_HEIGHT
                End Select
            End If
            
            'Keep the form only as wide as MAX_WIDTH
            If (r.RIGHT - r.Left > MAX_WIDTH) Then
                Select Case wParam
                    Case WMSZ_LEFT, WMSZ_BOTTOMLEFT, WMSZ_TOPLEFT
                        r.Left = r.RIGHT - MAX_WIDTH
                    Case WMSZ_RIGHT, WMSZ_BOTTOMRIGHT, WMSZ_TOPRIGHT
                        r.RIGHT = r.Left + MAX_WIDTH
                End Select
            End If
            
            'Keep the form only as tall as MAX_HEIGHT
            If (r.Bottom - r.Top > MAX_HEIGHT) Then
                Select Case wParam
                    Case WMSZ_TOP, WMSZ_TOPLEFT, WMSZ_TOPRIGHT
                        r.Top = r.Bottom - MAX_HEIGHT
                    Case WMSZ_BOTTOM, WMSZ_BOTTOMLEFT, WMSZ_BOTTOMRIGHT
                        r.Bottom = r.Top + MAX_HEIGHT
                End Select
            End If
        
            Call CopyMemory(ByVal lParam, r, Len(r))
            
            NewWndProc = 0&
            Exit Function
        End If
        
    
        If mPrevProc > 0& Then
            NewWndProc = CallWindowProc(mPrevProc, hWnd, uMsg, wParam, lParam)
        Else
            NewWndProc = DefWindowProc(hWnd, uMsg, wParam, lParam)
        End If
    
    End Function
    but for some reason, when I unload the form and reload it, the window stops responding to anything. I use the "Call Unhook(Me.hWnd)" function when I unload the form but the form still stops responding when I load it, unload it, and load it again.

  2. #2
    Fanatic Member Mxjerrett's Avatar
    Join Date
    Apr 2006
    Location
    Oklahoma
    Posts
    939

    Re: Prevent Form Resize Below Specific Size

    couldn't you just do something like:
    Code:
    Private Sub Form_Resize()
    If Me.Width < 2000 Then
    Me.Width = 2000
    ElseIf Me.Height < 2000 Then
    Me.Height = 2000
    End If
    End Sub
    it worked on my computer just fine.

    If a post has been helpful please rate it.
    If your question has been answered, pull down the tread tools and mark it as resolved.

  3. #3
    I'm about to be a PowerPoster! Joacim Andersson's Avatar
    Join Date
    Jan 1999
    Location
    Sweden
    Posts
    14,649

    Re: Prevent Form Resize Below Specific Size

    The way this code is designed you can only use it at one Form at the time, are you using for more then one Form?

  4. #4
    Ex-Super Mod RobDog888's Avatar
    Join Date
    Apr 2001
    Location
    LA, Calif. Raiders #1 AKA:Gangsta Yoda™
    Posts
    60,709

    Re: Prevent Form Resize Below Specific Size

    Quote Originally Posted by Mxjerrett
    couldn't you just do something like:
    Code:
    Private Sub Form_Resize()
    If Me.Width < 2000 Then
    Me.Width = 2000
    ElseIf Me.Height < 2000 Then
    Me.Height = 2000
    End If
    End Sub
    it worked on my computer just fine.
    You could use something like tht but it creates allot of flickering. With subclassing its flicker-free since it handles it before it draws the form changes.
    VB/Office Guru™ (AKA: Gangsta Yoda®)
    I dont answer coding questions via PM. Please post a thread in the appropriate forum.

    Microsoft MVP 2006-2011
    Office Development FAQ (C#, VB.NET, VB 6, VBA)
    Senior Jedi Software Engineer MCP (VB 6 & .NET), BSEE, CET
    If a post has helped you then Please Rate it!
    Reps & Rating PostsVS.NET on Vista Multiple .NET Framework Versions Office Primary Interop AssembliesVB/Office Guru™ Word SpellChecker™.NETVB/Office Guru™ Word SpellChecker™ VB6VB.NET Attributes Ex.Outlook Global Address ListAPI Viewer utility.NET API Viewer Utility
    System: Intel i7 6850K, Geforce GTX1060, Samsung M.2 1 TB & SATA 500 GB, 32 GBs DDR4 3300 Quad Channel RAM, 2 Viewsonic 24" LCDs, Windows 10, Office 2016, VS 2019, VB6 SP6

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width