School Assignment? Project Due Tomorrow? Chat LIVE With A Programming Expert!

Welcome to Dream.In.Code
Become an Expert!

Join 307,149 Programmers for FREE! Get instant access to thousands of experts, tutorials, code snippets, and more! There are 1,709 people online right now. Registration is fast and FREE... Join Now!




Resize Form & Controls For Screen Size - VB6

2 Pages V < 1 2  
Reply to this topicStart new topic

> Resize Form & Controls For Screen Size - VB6

Rating  5
PsychoCoder
Group Icon



post 23 Feb, 2009 - 08:11 PM
Post #21
@DocType That's because this code is for Visual Basic 6, not VB.NET
Go to the top of the page
+Quote Post

DocType
*



post 23 Feb, 2009 - 08:41 PM
Post #22
QUOTE(PsychoCoder @ 23 Feb, 2009 - 08:11 PM) *

@DocType That's because this code is for Visual Basic 6, not VB.NET


Then why does it say this?

REM for Visual Basic Express 2005/2008 to fit large forms to smaller screen res.
Go to the top of the page
+Quote Post

tylrwb
*



post 26 Feb, 2009 - 10:43 AM
Post #23
Hey PsychoCoder - could you take a stab at my question i am kinda stuck here. The topic is above a bit. I am looking for the answers to where the refernce is for the font resize! biggrin.gif
Go to the top of the page
+Quote Post

PsychoCoder
Group Icon



post 26 Feb, 2009 - 10:54 AM
Post #24
QUOTE(DocType @ 23 Feb, 2009 - 07:41 PM) *

Then why does it say this?

REM for Visual Basic Express 2005/2008 to fit large forms to smaller screen res.


If you look at that line it's in someone's comment who converted this for VB.NET. This tutorial if for VB6 (as it says in the title and in the tutorial itself smile.gif )
Go to the top of the page
+Quote Post

cyber_sam
*



post 26 Mar, 2009 - 09:41 PM
Post #25
I ve used this tutorial n this is workin fine
but when i added image control it was giving error invalid object , i ve solved
this problem by using
CODE
if not typeof obj is object
n it is workin fine

but when i added the menu control it is giving error, pls tel me how to solve this problem. is there any alternative way?

This post has been edited by cyber_sam: 26 Mar, 2009 - 09:43 PM
Go to the top of the page
+Quote Post

vegitz
*



post 31 May, 2009 - 07:51 PM
Post #26
Hi Sam,
I have my own resizing codes and I think it could help you on your problem; actually it's a generic approach so you can apply it on the tutorial here or on any solution:

Here is the code:

Private Sub Form_Resize()
Dim objControl As Control

If Me.WindowState = vbMinimized Then
' we have to check this. if not, your program will crash when minimized
Exit Sub
End If

' iterate through all the controls on the form to determine
' which to resize and which not to

' OPTION 1: determine via the type of control
For Each objControl In Me.Controls
If TypeOf objControl Is Menu Then
' ignore menu controls
Else
' do the resize here of other controls
End If
Next

' OPTION 2: determine via the "tag" property
' you can set the TAG during design via the properties window
' or programatically by setting it (ex. Text1.Tag="resize_me")
' the TAG value can be anything you like of course
For Each objControl In Me.Controls
If LCase(objControl.Tag) = LCase("resize_me") Then
' resize this
Else
' dont resize
End If
Next
End Sub



End of code:

Hope this helps you and the others.


QUOTE(cyber_sam @ 26 Mar, 2009 - 09:41 PM) *

I ve used this tutorial n this is workin fine
but when i added image control it was giving error invalid object , i ve solved
this problem by using
CODE
if not typeof obj is object
n it is workin fine

but when i added the menu control it is giving error, pls tel me how to solve this problem. is there any alternative way?

Go to the top of the page
+Quote Post

paperclipmuffin
Group Icon



post 10 Jun, 2009 - 03:56 PM
Post #27
Ho. Ly. Crap. That's long.

Well done!
Go to the top of the page
+Quote Post

MistralRider
*



post 31 Jul, 2009 - 02:35 AM
Post #28
QUOTE(PsychoCoder @ 6 Oct, 2007 - 03:14 PM) *

Welcome to this tutorial on resizing a form based on screen size in Visual Basic 6. In this tutorial I will discuss a couple issues:
  • Resize a form based on screen size
  • Resize the controls on the form based on the form size
  • Resize the font size of all controls based on the above 2 items
I have received this question for many years, and in my time in </dream.in.code> I have also been asked this question several times, so I thought it would be a good idea to write a tutorial based on this question. THought there are many commercial products out there that will accomplish this, how many students and everyday Joe's actually have the money to be buying these solutions? Not many I can assure you, so after getting this question numerous time, I decided it was time to write my own solution to this problem, and give it back to the programming community.

The code I'm about to show you I have in a Code Module, names FormControl that I include in all VB6 projects I create. This comes in real handy because as developers we don't know what screen resolution a client, or anyone else using our software, will be using. The first thing I have in my module is some Global variables that will be used through out the module, so I, of course, make them Global and accessible to the entire module. Here are the Globals you need to add to your Code Module:

CODE

Private List() As Control
Private curr_obj As Object
Private iHeight As Integer
Private iWidth As Integer
Private x_size As Double
Private y_size As Double


As you will see, the Globals are Private, I don't want them to be accessed from outside this Code Module. The first Global is an Array or type Control. This is a private Type I have created to hold all the properties of the controls on the form. Creating your own user defined type saves a lot of headaches down the road, and allows for resizing all controls in a single loop, referencing your type:

CODE

Private Type Control
    Index As Integer
    Name As String
    Left As Integer
    Top As Integer
    width As Integer
    height As Integer
End Type


As you can see, this Type holds all the information needed about a control: Index, Name, Left, Top, Width and Height, these items will come in use later, when we write the procedure to resize all the controls at once. Now lets talk about resizing a form based on the current screen resolution we will be referencing the Screen Object available to us in Visual Basic 6.

The 2 properties we're concerned with are Width and Height. These properties of the Screen Object give us access to the screen size available to us. So, to set the Forms size in relationship to the Screen size, we will be accessing the properties of the Form Object, mainly the width and height properties. In my Module I set the forms size to the screen's size divided by 2, you may want to test and find your own resolution. Here's the simple procedure for resizing your form in relationship to the available screen resolution:

CODE

Public Sub ResizeForm(frm As Form)
    'Set the forms height
    frm.height = Screen.height / 2
    'Set the forms width
    frm.width = Screen.width / 2
    'Resize all of the controls
    'based on the forms new size
    ResizeControls frm
End Sub


Simple isn't it, we change the forms size based on the screen size, then we reference a procedure called ResizeControls, we do this because resizing the form alone isn't what we're after. Well doing only this will cause some pretty ugly user interfaces, simply because you may be resizing your form, but the controls are staying the same size, which isn't a good thing.

So, you can either write a really long and ugly procedure to resize each control individually,not very maintainable, especially if you rename or add controls, or you can write a nice neat little procedure, based on a user defined type, which we have in our Code Module, and loop through them like this:

CODE

Public Sub ResizeControls(frm As Form)
Dim i As Integer
'   Get ratio of initial form size to current form size
x_size = frm.height / iHeight
y_size = frm.width / iWidth

'Loop though all the objects on the form
'Based on the upper bound of the # of controls
For i = 0 To UBound(List)
    'Grad each control individually
    For Each curr_obj In frm
        'Check to make sure its the right control
        If curr_obj.TabIndex = List(i).Index Then
            'Then resize the control
             With curr_obj
                .Left = List(i).Left * y_size
                .width = List(i).width * y_size
                .height = List(i).height * x_size
                .Top = List(i).Top * x_size
             End With
        End If
    'Get the next control
    Next curr_obj
Next i
End Sub


Here we use the UBound Function To get the highest index on the form, which gives us the last control's index. We then loop through all the controls, stopping at the highest index, and change the size of the control. Before this procedure can actually work, we need to know the current location of each control, well I have a solution for that as well.

In this Module is a method called GetLocation. What this method does is it logs the current position of each control, looping through all the controls located in our List() Array, which is populated with the controls on the form. On each iteration of the loop, we use the ReDim Statement and the Preserve keyword to increment the size of the array by 1 and preserve the objects already in the array. The code for that method is as follows:

CODE

Public Sub GetLocation(frm As Form)
Dim i As Integer
'   Load the current positions of each object into a user defined type array.
'   This information will be used to rescale them in the Resize function.

'Loop through each control
For Each curr_obj In frm
'Resize the Array by 1, and preserve
'the original objects in the array
    ReDim Preserve List(i)
    With List(i)
        .Name = curr_obj
        .Index = curr_obj.TabIndex
        .Left = curr_obj.Left
        .Top = curr_obj.Top
        .width = curr_obj.width
        .height = curr_obj.height
    End With
    i = i + 1
Next curr_obj
    
'   This is what the object sizes will be compared to on rescaling.
    iHeight = frm.height
    iWidth = frm.width
End Sub


Our Code Module is almost complete, there is but one thing we need to think about resizing, and that is the font size used in the application. Resizing, say a Label, and not resizing the font being used on the label will make for an ugly User Interface as well. So what we do is, we get the value of x_size, which is one of our Globals, and set in the ResizeControls method, we multiply that by 8 and that gives the font size I'm looking for, you needs may vary. Here is the code for resizing the font size:

CODE

Public Function SetFontSize() As Integer
    'Make sure x_size is greater than 0
    If Int(x_size) > 0 Then
    'Set the font size
        SetFontSize = Int(x_size * 8)
    End If
End Function


That's all the code you need for your form and control resizing based on the users screen resolution. It's all a matter of getting the mathematics right, then resetting the size of everything on the form to fit nicely in the current screen.

Now for how to use it, in the Form_Load Event you add a call to:
  • GetLocation
  • ResizeForm
And set the FontSize property of your controls, like this:

CODE

Private Sub Form_Load()
    GetLocation Me
    CenterForm Me
    ResizeForm Me
    
    lblInstructions.Font = SetFontSize()
End Sub


This Code Module also offers another feature. If someone were the resize your form while havin the application running, if you put a call to ResizeControls in the Form_Resize Event, this will take care of resizing everthing:

CODE

Private Sub Form_Resize()
     ResizeControls Me
     lblInstructions.FontSize = SetFontSize()
End Sub


I am providing the Code Module this code is in, this Module and code is under the GNU General Public License, so you can use, modify or distribute as you see fit, but the license header must stay intact. I hope you have found this tutorial informative and useful. For all your Visual Basic 6 Reference Needs go to the Visual Basic 6.0 Resource Center. Thank you for reading.

Happy Coding smile.gif




I cannot unzip the file FormContro.zip, any suggestions?


Go to the top of the page
+Quote Post

firebolt
Group Icon



post 1 Aug, 2009 - 05:54 PM
Post #29
Make sure you are using VB6, not VB.NET
Go to the top of the page
+Quote Post

MistralRider
*



post 4 Aug, 2009 - 01:25 PM
Post #30
QUOTE(firebolt @ 1 Aug, 2009 - 05:54 PM) *

Make sure you are using VB6, not VB.NET

I am using vb6 but when I try and unzip the file "FormControl.zip" I get a message saying that it is not a zip type file.

Go to the top of the page
+Quote Post

f_htn
*



post 19 Aug, 2009 - 11:19 PM
Post #31
QUOTE(Jabber @ 21 Jun, 2008 - 02:05 PM) *

Google'n help for my game - resize form this looks just like what I need.
So I signed up in hope of help.
I got vb6 and loaded this module and added code to form_load()

I get a err.num 438
"Run-time error '438' Object doesn't support this property or method"
It don't like tab.index

I tried a few changes but nothing helped.

Any clues to why I am getting this error?



QUOTE(f_htn @ 19 Aug, 2009 - 11:16 PM) *

QUOTE(Jabber @ 21 Jun, 2008 - 02:05 PM) *

Google'n help for my game - resize form this looks just like what I need.
So I signed up in hope of help.
I got vb6 and loaded this module and added code to form_load()

I get a err.num 438
"Run-time error '438' Object doesn't support this property or method"
It don't like tab.index

I tried a few changes but nothing helped.

Any clues to why I am getting this error?



I got the same error when I tried it, did you ever find out why.
Go to the top of the page
+Quote Post

l_steiner
*



post 10 Nov, 2009 - 06:09 PM
Post #32
The Zip file seems to be corrupt. Does anyone have the original? smile.gif
LS

QUOTE(Louisda16th @ 6 Oct, 2007 - 04:55 PM) *

Finally a solution. Thanks a lot PsychoCoder!!! smile.gif
EDIT:
I noticed something however. Suppose you resize your form (manually by click and drag), the SetFontSize() function runs. Now when the screen size reaches a particular lower limit, the font size returned will not be a valid value. So an error is generated. Basically this happens when Font Size becomes zero.

Go to the top of the page
+Quote Post

firebolt
Group Icon



post 11 Nov, 2009 - 02:06 AM
Post #33
Why use the .zip file? This is a tutorial, so you should learn it, rather a simple copy paste and compile.
Go to the top of the page
+Quote Post

l_steiner
*



post 11 Nov, 2009 - 07:56 AM
Post #34
QUOTE(firebolt @ 11 Nov, 2009 - 02:06 AM) *

Why use the .zip file? This is a tutorial, so you should learn it, rather a simple copy paste and compile.


I have tried, but could not get the code to work. If I saw it in a project file, I could replicate it. Do you have it working?
Go to the top of the page
+Quote Post

l_steiner
*



post 12 Nov, 2009 - 06:05 PM
Post #35
I got it working biggrin.gif

However I get an error when running when the program tries to resize the form menu. Any ideas how to put this into an If statement?

Thanks in Advance. LS
Go to the top of the page
+Quote Post


2 Pages V < 1 2
Reply to this topicStart new topic
4 User(s) are reading this topic (4 Guests and 0 Anonymous Users)
0 Members:

 


Lo-Fi Version Time is now: 11/21/09 04:22PM

Live Help!

Be Social

Dream.In.Code RSS Feed Dream.In.Code LinkedIn Group Follow Us On Twitter Fan Us On Facebook

Tutorials

Programming

Web Development

Reference Sheets

Code Snippets

DIC Chatroom

Bye Bye Ads

Monthly Drawing

Thumb Drive

Top Contributors

Top 10 Kudos This Month