ne of the more common questions here at Ask the VB Pro has always been how to automatically handle the resizing of forms and controls. Unfortunately, the short answer is that there isn't a fully automatic way to resize the controls that are built into Visual Basic. However, this 10-Minute Solution will give you some tips on how to handle this with just a little bit of code.
For starters, it's not always necessary to provide the ability to resize a form. For example let's examine a form like the one shown in Figure 1, an Options dialog from Microsoft Word.
This particular dialog can't be resized. The primary reason is that there is no reason to allow resizing. The picture shows a dialog with more than 20 controls, none of which are text boxes that allow for multiple lines of text. The user just needs to mark the checkboxes and get on with his or her typing. A good rule of thumb to follow is that if your dialog doesn't have any freeform entry fields or large lists, there's normally not a reason to resize it.
If you do want to resize a form, you have to handle a few things. Have a look at, for instance, the form shown in Figure 2.
This particular form has three controls: the large text area, and a pair of buttons. If you want to resize this form, you have to move and/or resize all the controls, not just the text area. Here's the steps I followed which allow this form to be resized:
1. Put the text box in the upper left-hand corner of the form with a small (60 twip) margin on the left and top of it.
2. Draw a PictureBox on the form. Set the Align property to Align Bottom, set the Appearance to Flat, and set the BackColor to the Menu Bar color. This provides a place for your Command buttons.
3. Draw your OK and Cancel buttons in the PictureBox and center them (roughly) in the PictureBox. I put a small margin between the buttons.
The reason we use a PictureBox is that the PictureBox will automatically move itself to the bottom of the form. Since it does this automatically, we don't have to adjust the Top properties of the Command buttonswe just have to move them left and right, as necessary.
With the controls drawn, we just have to add the necessary code to make this thing work. All the resizing code goes in the Form_Resize event. Add:
Private Sub Form_Resize()
On Error Resume Next
Dim lngSpacing As Long
Dim lngBtnWidth As Long
lngSpacing = cmdCancel.Left - cmdOK.Left - cmdOK.Width
lngBtnWidth = lngSpacing + cmdCancel.Width + cmdOK.Width
txtComments.Height = picButtonPanel.Top - (2 * txtComments.Top)
txtComments.Width = Me.ScaleWidth - (2 * txtComments.Left)
cmdOK.Left = (picButtonPanel.Width - lngBtnWidth) / 2
cmdCancel.Left = cmdOK.Left + cmdOK.Width + lngSpacing
We first figure out the spacing between the OK and Cancel buttons, since we'll need this later. Remember that you can't just subtract the Left propertiesyou have to account for the width of the OK button. We then figure out how much space the buttons (including the space between them) take up in the PictureBox.
We then turn our attention to the text area at the top of the page. The text box should fill up the rest of the space on the page, minus the space taken by the PictureBox at the bottom of the page. The text box should maintain a small margin around itself. The calculation subtracts twice the value of the Top property from the available space, which will give us the margin we need. We do the same thing for the width, but we use the Form's ScaleWidth property, which gives the available space within the form. The Width property gives the total size of the form, including any borders, so we don't want to use that one.
Once the text box is resized, we have to move the command buttons. They will automatically be moved vertically because they are within the PictureBox. However, we first need to move the OK button to the left. Subtracting the total space required for both buttons from the total width of the PictureBox gives us the available space. Dividing that by two gets us the space available on the left. The Cancel button is moved to the right of the button.
You should notice that On Error Resume Next is set at the top of this subroutine. This takes care of any negative values that might have been stored in the Height or Width properties. If the user minimizes your window or resizes it so the controls can't be seen, the On Error Resume Next simply sends the program to the next line.
It's a little bit of work to do this, but useful on forms where resizing makes for a better user experience. There are commercial resizing controls available that can do some of this work for you, but once you get the hang of it, it's not difficult to write the code required to resize your forms. Plus, you can download examples here