Hello everybody, I have a form with lots of controls. This form can be used on several user machines each with their own screen résolutions. Instead of manually adding code in the Resize event for each individual control I decided instead to go for 2 procedures. A SaveSizes in the Form Load event and a ResizeControls in the Resize event. This works on about half of screen résolutions I tested. Several controls get resized wrong in the other half of screen résolutions (bigger sizes). Please see my code below if anybody has a suggestion on improving it or a better way of doing this. Thank you.
Declarations
Save Sizes called in the Form LoadCode:Private Type ControlPositionType Left As Single Top As Single Width As Single Height As Single FontSize As Single End Type Private m_ControlPositions() As ControlPositionType Private m_FormWid As Single Private m_FormHgt As Single
ResizeControls called in the Resize eventCode:Private Sub SaveSizes() Dim i As Integer Dim ctl As Control ' Save the controls' positions and sizes. ReDim m_ControlPositions(1 To Controls.Count) i = 1 For Each ctl In Controls With m_ControlPositions(i) If TypeOf ctl Is Line Then .Left = ctl.X1 .Top = ctl.Y1 .Width = ctl.X2 - ctl.X1 .Height = ctl.Y2 - ctl.Y1 Else .Left = ctl.Left .Top = ctl.Top .Width = ctl.Width .Height = ctl.Height On Error Resume Next .FontSize = ctl.Font.Size On Error GoTo 0 End If End With i = i + 1 Next ctl ' Save the form's size. m_FormWid = ScaleWidth m_FormHgt = ScaleHeight End Sub
Code:Private Sub ResizeControls() Dim i As Integer Dim ctl As Control Dim x_scale As Single Dim y_scale As Single ' Don't bother if we are minimized. If WindowState = vbMinimized Then Exit Sub ' Get the form's current scale factors. x_scale = ScaleWidth / m_FormWid y_scale = ScaleHeight / m_FormHgt ' Position the controls. i = 1 For Each ctl In Controls With m_ControlPositions(i) If TypeOf ctl Is Line Then ctl.X1 = x_scale * .Left ctl.Y1 = y_scale * .Top ctl.X2 = ctl.X1 + x_scale * .Width ctl.Y2 = ctl.Y1 + y_scale * .Height Else If ctl.Name <> "picClose" Then ctl.Left = x_scale * .Left ctl.Top = y_scale * .Top ctl.Width = x_scale * .Width If Not (TypeOf ctl Is ComboBox) Then ' Cannot change height of ComboBoxes. ctl.Height = y_scale * .Height End If On Error Resume Next ctl.Font.Size = y_scale * .FontSize * 0.75 End If On Error GoTo 0 End If End With i = i + 1 Next ctl End Sub




Reply With Quote