这是一个类模块:
1. 建立一个新的类模块,加入下列代码,并给类模块起名(例:autosize)
2. 加入一个窗口并且加入:Private el as new autosize
3. 在 Form_Load 事件中加入 el.init me
4. 在 Form_Resize 事件中加入 el.formresize me
Option ExplicitPrivate nFormHeightAs IntegerPrivate nFormWidth As IntegerPrivate nNumOfControlsAs IntegerPrivate nTop()As IntegerPrivate nLeft() As IntegerPrivate nHeight()As IntegerPrivate nWidth()As IntegerPrivate nFontSize()As IntegerPrivate nRightMargin()As IntegerPrivate bFirstTime As Boolean
Sub Init(frm As Form, Optional nWindState As Variant)Dim I As IntegerDim bWinMax As BooleanbWinMax = Not IsMissing(nWindState)nFormHeight = frm.HeightnFormWidth = frm.WidthnNumOfControls = frm.Controls.Count - 1bFirstTime = TrueReDim nTop(nNumOfControls)ReDim nLeft(nNumOfControls)ReDim nHeight(nNumOfControls)ReDim nWidth(nNumOfControls)ReDim nFontSize(nNumOfControls)ReDim nRightMargin(nNumOfControls)On Error Resume NextFor I = 0 To nNumOfControlsIf TypeOf frm.Controls(I) Is Line ThennTop(I) = frm.Controls(I).Y1nLeft(I) = frm.Controls(I).X1nHeight(I) = frm.Controls(I).Y2nWidth(I) = frm.Controls(I).X2ElsenTop(I) = frm.Controls(I).TopnLeft(I) = frm.Controls(I).LeftnHeight(I) = frm.Controls(I).HeightnWidth(I) = frm.Controls(I).WidthnFontSize(I) = frm.FontSizenRightMargin(I) = frm.Controls(I).RightMarginEnd IfNextIf bWinMax Or frm.WindowState = 2 Thenfrm.Height = Screen.Heightfrm.Width = Screen.WidthElsefrm.Height = frm.Height * Screen.Height / 7290frm.Width = frm.Width * Screen.Width / 9690End IfbFirstTime = TrueEnd Sub
Sub FormResize(frm As Form)Dim I As IntegerDim nCaptionSizeAs IntegerDim dRatioX As DoubleDim dRatioY As DoubleDim nSaveRedrawAs LongOn Error Resume NextnSaveRedraw = frm.AutoRedrawfrm.AutoRedraw = TrueIf bFirstTime ThenbFirstTime = FalseExit SubEnd IfIf frm.Height < nFormHeight / 2 Then frm.Height = nFormHeight / 2EndifIf frm.Width < nFormWidth / 2 Thenfrm.Width = nFormWidth / 2EndifnCaptionSize = 400dRatioY = 1# * (nFormHeight - nCaptionSize) _ / (frm.Height - nCaptionSize)dRatioX = 1# * nFormWidth / frm.WidthOn Error Resume NextFor I = 0 To nNumOfControlsIf TypeOf frm.Controls(I) Is Line Thenfrm.Controls(I).Y1 = Int(nTop(I) / dRatioY)frm.Controls(I).X1 = Int(nLeft(I) / dRatioX)frm.Controls(I).Y2 = Int(nHeight(I) / dRatioY)frm.Controls(I).X2 = Int(nWidth(I) / dRatioX)Elsefrm.Controls(I).Top = Int(nTop(I) / dRatioY)frm.Controls(I).Left = Int(nLeft(I) / dRatioX)frm.Controls(I).Height = Int(nHeight(I) / dRatioY)frm.Controls(I).Width = Int(nWidth(I) / dRatioX)frm.Controls(I).FontSize = Int(nFontSize(I) / _dRatioX) + Int(nFontSize(I) / dRatioX) Mod 2frm.Controls(I).RightMargin = Int(nRightMargin(I) / dRatioY)End IfNextfrm.AutoRedraw = nSaveRedrawEnd Sub