Solved

Resize, lock at minimum size

Posted on 2004-04-12
12
1,024 Views
Last Modified: 2008-02-01
how to disable resize in order to have a minimum size for the window, just like paint.exe, without flashing ?
i'm in VB6.
0
Comment
Question by:ennixo
  • 6
  • 2
  • 2
  • +2
12 Comments
 
LVL 19

Expert Comment

by:BrianGEFF719
ID: 10811082
The only way to do this is by subclassing.


-Brian
0
 
LVL 19

Expert Comment

by:BrianGEFF719
ID: 10811086
0
 
LVL 19

Expert Comment

by:BrianGEFF719
ID: 10811090
Taken from the above link:

'===============Bas module code============
Type POINTAPI
     x As Long
     y As Long
End Type

Type MINMAXINFO
     ptReserved As POINTAPI
     ptMaxSize As POINTAPI
     ptMaxPosition As POINTAPI
     ptMinTrackSize As POINTAPI
     ptMaxTrackSize As POINTAPI
End Type

Public 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 Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)

Public Const GWL_WNDPROC = (-4)
Const WM_GETMINMAXINFO = &H24

Public OldProc As Long
Public MinWidth As Long
Public MinHeight As Long
Dim MMinfo As MINMAXINFO

Public Function WndProc(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  Select Case wMsg
    Case WM_GETMINMAXINFO
         CopyMemory MMinfo, ByVal lParam, LenB(MMinfo)
       ' Max/Min size when tracking
         MMinfo.ptMinTrackSize.x = MinWidth
         MMinfo.ptMinTrackSize.y = MinHeight
'         MMinfo.ptMaxTrackSize.x = MaxWidth
'         MMinfo.ptMaxTrackSize.y = MaxHeight
         CopyMemory ByVal lParam, MMinfo, LenB(MMinfo)
         Exit Function
    End Select
    WndProc = CallWindowProc(OldProc, hwnd, wMsg, wParam, lParam)
End Function

'===========Form code===========
Private Sub Form_Load()
   MinWidth = 128
   MinHeight = 128
   Me.AutoRedraw = True
   Me.Print "Minimum size of this form" & vbCrLf & "is limited to 128x128 pixels"
   OldProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WndProc)
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Call SetWindowLong(hwnd, GWL_WNDPROC, OldProc)
End Sub
'=================================
Note: this code use subclassing, so don't stop it with IDE stop button, use form [x] button to close form.








Good Luck
-Brian
0
ScreenConnect 6.0 Free Trial

Discover new time-saving features in one game-changing release, ScreenConnect 6.0, based on partner feedback. New features include a redesigned UI, app configurations and chat acknowledgement to improve customer engagement!

 
LVL 4

Expert Comment

by:ChenChen
ID: 10811227
I think you can use the Resize event, have a function there to test if the height and width is greater then your minimum size, otherwise set it to the minimum values, something like this:

private sub form_resize()

if me.width<MINIMUM_WIDTH then
me.width=MINIMUM_WIDTH
end if

'same to the form height

end sub
0
 
LVL 19

Expert Comment

by:BrianGEFF719
ID: 10811354
ChenChen: The flicker he is refering to in his question is because he is doing it like that.

When you resize like that you will see a flicker, subclassing allows the resize event to not be passed to the form if the dimensions are smaller than specified. So therefore, no flicker.


-Brian
0
 
LVL 5

Author Comment

by:ennixo
ID: 10811439
BrianGEFF719: your code works great but :

- if i add "End" on query unload it crashes and i must add it to end the app if other windows are opened.
- i removed AutoRedraw = true because i draw everything with api, so this is faster a lot ! is it good or bad ?
0
 
LVL 1

Expert Comment

by:prgmrdave
ID: 10814468
ennixo,

Don't use End until you've done the SetWindowLong in the Form_Unload() event. End will work just as well if you put it in Form_Unload as in Form_QueryUnload.

David
0
 
LVL 5

Author Comment

by:ennixo
ID: 10815460
in my Form_QueryUnload sub i added End after the Call SetWindowLong(Me.hWnd, GWL_WNDPROC, OldProc) and it crashes...
if i comment the End, it doesn't crashes...

(it's not really a crash, it's just that the VB-IDE is closed... is it normal ? is it because in "debug mode" the subclass is made by VB ?)

is there another way ?
0
 
LVL 19

Expert Comment

by:BrianGEFF719
ID: 10816946
ennixo: This is normal, subclassed programs FUNCTION WEIRD in the IDE.


Always make sure to close the program with the "X" and not "End"


-Brian
0
 
LVL 19

Accepted Solution

by:
BrianGEFF719 earned 500 total points
ID: 10816966
AutoRedrew is fine. Secondly, wait on adding the "END" until you are done testing in the IDE. Then add it just before you compile and test.


-Brian
0
 
LVL 1

Expert Comment

by:prgmrdave
ID: 10817090
If you are using End because your application has other windows open, do something like this rather than using End:

Dim frm As Form
For Each frm In Forms
    If Not frm Is Me Then Unload frm
Next frm

That way, when this form unloads, it will be the last one, and the app will exit.
0
 
LVL 1

Expert Comment

by:wd006451
ID: 11131907
Hello, i have a question, what if i have 2 forms, im limiting the size, and i want the sizes of them both to be diffrent.  There child mdi forms.
0

Featured Post

Windows Server 2016: All you need to know

Learn about Hyper-V features that increase functionality and usability of Microsoft Windows Server 2016. Also, throughout this eBook, you’ll find some basic PowerShell examples that will help you leverage the scripts in your environments!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

When designing a form there are several BorderStyles to choose from, all of which can be classified as either 'Fixed' or 'Sizable' and I'd guess that 'Fixed Single' or one of the other fixed types is the most popular choice. I assume it's the most p…
You can of course define an array to hold data that is of a particular type like an array of Strings to hold customer names or an array of Doubles to hold customer sales, but what do you do if you want to coordinate that data? This article describes…
Get people started with the process of using Access VBA to control Excel using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Excel. Using automation, an Access application can laun…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question