Sunteți pe pagina 1din 4

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 com mercial products out there that will accomplish this, how many students and ever yday 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 co mmunity. 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 devel opers we don't know what screen resolution a client, or anyone else using our so ftware, will be using. The first thing I have in my module is some Global variab les 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 you r Code Module: 1 2 3 4 5 6 Private Private Private Private Private Private List() As Control curr_obj As Object iHeight As Integer iWidth As Integer x_size As Double 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: 1 2 3 4 5 6 7 8 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: Inde x, Name, Left, Top, Width and Height, these items will come in use later, when w e write the procedure to resize all the controls at once. Now lets talk about re sizing 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 prop erties 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: 1 2 3 4 5 6 7 8 9 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 refe rence a procedure called ResizeControls, we do this because resizing the form al one isn't what we're after. Well doing only this will cause some pretty ugly use r 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, o r you can write a nice neat little procedure, based on a user defined type, whic h we have in our Code Module, and loop through them like this: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 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 give s us the last control's index. We then loop through all the controls, stopping a t the highest index, and change the size of the control. Before this procedure c an actually work, we need to know the current location of each control, well I h ave 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 i n our List() Array, which is populated with the controls on the form. On each it

eration of the loop, we use the ReDim Statement and the Preserve keyword to incr ement the size of the array by 1 and preserve the objects already in the array. The code for that method is as follows: 01 02 03 rray. 04 . 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 Public Sub GetLocation(frm As Form) Dim i As Integer ' Load the current positions of each object into a user defined type a ' 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 abou t resizing, and that is the font size used in the application. Resizing, say a L abel, and not resizing the font being used on the label will make for an ugly Us er 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: 1 2 3 4 5 6 7 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 use rs screen resolution. It's all a matter of getting the mathematics right, then r esetting 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:

1 2 3 4 5 6 7

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 fo rm while havin the application running, if you put a call to ResizeControls in t he Form_Resize Event, this will take care of resizing everthing: 1 2 3 4 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 th e GNU General Public License, so you can use, modify or distribute as you see fi t, 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 Vi sual Basic 6.0 Resource Center. Thank you for reading. Happy Coding :) Attached File FormControl.zip (12.7K) Number of downloads: 18663

S-ar putea să vă placă și