gbzhhu
asked on
Flicker free form resize
I have a form and a few controls(a ListView, 3 command buttons,an activex control(mine) and an ImageList)
When the form is resized, I have a module that resizes all controls on the form, proportionately (I mean they are resized the same percentage as the form)
My problem that hwen the form is resized it causes a lot of flickering. Does anyone have a remedy to this or has any pointers to sources.
Thank you all
When the form is resized, I have a module that resizes all controls on the form, proportionately (I mean they are resized the same percentage as the form)
My problem that hwen the form is resized it causes a lot of flickering. Does anyone have a remedy to this or has any pointers to sources.
Thank you all
ASKER
I am still getting flickering and decided that the module was doing too much calculation and redrawing and if I minimize the form the program crashes with a message out of memory
If you or anyone has code that can resize the controls on the form I would appreciate it
Thanks
If you or anyone has code that can resize the controls on the form I would appreciate it
Thanks
I use this function in all my applications. It greatly speed up.
Add this function and encapsulate your work like this.
SetRedraw Me, False
' *** Do work
SetRedraw Me, True
' *** Preserve the refresh of a window
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
Public Sub SetRedraw(frm As Form, bRedraw As Boolean)
' #VBIDEUtils#************** ********** ********** ********** ********** ******
' * Programmer Name : Waty Thierry
' * Web Site : www.geocities.com/ResearchTriangle/6311/
' * E-Mail : waty.thierry@usa.net
' * Date : 19/11/98
' * Time : 16:43
' * Module Name : Lib_Module
' * Module Filename : Lib.bas
' * Procedure Name : SetRedraw
' * Parameters :
' * frm As Form
' * bRedraw As Boolean
' ************************** ********** ********** ********** ********** ****
' * Comments : Enabled/Disable Window redraw
' *
' *
' ************************** ********** ********** ********** ********** ****
If (bRedraw = True) Then
LockWindowUpdate 0
frm.Refresh
Else
LockWindowUpdate frm.hWnd
End If
End Sub
Add this function and encapsulate your work like this.
SetRedraw Me, False
' *** Do work
SetRedraw Me, True
' *** Preserve the refresh of a window
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
Public Sub SetRedraw(frm As Form, bRedraw As Boolean)
' #VBIDEUtils#**************
' * Programmer Name : Waty Thierry
' * Web Site : www.geocities.com/ResearchTriangle/6311/
' * E-Mail : waty.thierry@usa.net
' * Date : 19/11/98
' * Time : 16:43
' * Module Name : Lib_Module
' * Module Filename : Lib.bas
' * Procedure Name : SetRedraw
' * Parameters :
' * frm As Form
' * bRedraw As Boolean
' **************************
' * Comments : Enabled/Disable Window redraw
' *
' *
' **************************
If (bRedraw = True) Then
LockWindowUpdate 0
frm.Refresh
Else
LockWindowUpdate frm.hWnd
End If
End Sub
ASKER
Waty your solution uses the same API as David Lavine and it does not solve my problem.
Thanks
Thanks
Add the call in the form_Resize
ASKER
Waty your answer works how can I give you the points
thanks
thanks
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks waty
The reason it might be flickering is because you are doing lengthy operation that have to do with the window every time it resizes. To minimize flickering in such situations insert the LockWindowUpdate function in the beggining of the resize event passing the hwnd of the form and putting the lockWindowupdate at the end with a 0 as its parameter. The LockWindowUpdate can be found in your API Viewer that came with Visual Basic.
--------------------------
You might want to try looking at the LockWindowUpdate API ... pass it the hwnd of the window you want to freeze, and then pass a 0 in to unlock the update. Eg.,
Public Declare Function LockWindowUpdate Lib "user32" Alias _
"LockWindowUpdate" (ByVal hwndLock As Long) As Long
LockWindowUpdate Form1.Hwnd
' do stuff
LockWindowUpdate 0
Depending on what you are doing, it may help. If your code takes a second or two while the screen is frozen, you probably should change the mousepointer as well so the user doesn't think it's locked.
Sometimes it may also be worth it to subclass the form and get the messages so you can discard some redraws in case they are unnecessary.