首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

跪求一款能让VB控件随着窗口放大缩小自动适应的第三方控件,该如何解决

2012-02-26 
跪求一款能让VB控件随着窗口放大缩小自动适应的第三方控件跪求一款能让VB控件随着窗口放大缩小自动适应的

跪求一款能让VB控件随着窗口放大缩小自动适应的第三方控件
跪求一款能让VB控件随着窗口放大缩小自动适应的第三方控件,或者具体点的方法,代码,说清楚点,小弟是小白。。。

[解决办法]
没有,要自己写,其实也不难,在Form_Resize()事件里加代码,那么当窗体的大小改变时就会引发这个事件,你就能改变控件的大小适应窗体。
例如:

VB code
Private Sub Form_Resize()'先放一个按钮在窗体上Command1.Left=120'设置按钮的左距离是120Command1.Width=Me.Width-480'设置按钮一的宽度,Me代表窗体Command1.Top=120'设置按钮的顶距离是120Command1.Height=Me.Height-800'设置按钮一的宽度,Me代表窗体End Sub
[解决办法]
不知道哪抓到的?写成模块再去调用就好了?

VB code
Option ExplicitPrivate FormOldWidth As Long'保存窗体的原始宽度Private FormOldHeight As Long'保存窗体的原始高度'在调用ResizeForm前先调用本函数Private Sub ResizeInit(FormName As Form)Dim Obj As Control    FormOldWidth = FormName.ScaleWidth    FormOldHeight = FormName.ScaleHeight    On Error Resume Next        For Each Obj In FormName        Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " "    Next Obj On Error GoTo 0End Sub'按比例改变表单内各元件的大小,在调用ReSizeForm前先调用ReSizeInit函数Private Sub ResizeForm(FormName As Form)Dim Pos(4) As DoubleDim i As Long, TempPos As Long, StartPos As LongDim Obj As ControlDim ScaleX As Double, ScaleY As Double    ScaleX = FormName.ScaleWidth / FormOldWidth    '保存窗体宽度缩放比例    ScaleY = FormName.ScaleHeight / FormOldHeight    '保存窗体高度缩放比例    On Error Resume Next    For Each Obj In FormName            StartPos = 1                For i = 0 To 4                    '读取控件的原始位置与大小            TempPos = InStr(StartPos, Obj.Tag, " ", vbTextCompare)                        If TempPos > 0 Then                Pos(i) = Mid(Obj.Tag, StartPos, TempPos - StartPos)                StartPos = TempPos + 1            Else                Pos(i) = 0            End If                        '根据控件的原始位置及窗体改变大小的比例对控件重新定位与改变大小            Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY                    Next i            Next Obj    On Error GoTo 0End SubPrivate Sub Form_Load()    Call ResizeInit(Me) '在程序装入时必须加入End SubPrivate Sub Form_Resize()    Call ResizeForm(Me) '确保窗体改变时控件随之改变End Sub
[解决办法]
Public Type ctrObj
name As String
Index As Long
Parrent As String
Top As Long
Left As Long
Height As Long
Width As Long
ScaleHeight As Long
ScaleWidth As Long
End Type

Private FormRecord() As ctrObj
Private ControlRecord() As ctrObj
Private bRunning As Boolean
Private MaxForm As Long
Private MaxControl As Long
Private Const WM_NCLBUTTONDOWN = &HA1
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Function ActualPos(plLeft As Long) As Long


If plLeft < 0 Then
ActualPos = plLeft + 75000
Else
ActualPos = plLeft
End If

End Function


Function FindForm(pfrmIn As Form) As Long

Dim i As Long

FindForm = -1

If MaxForm > 0 Then

For i = 0 To (MaxForm - 1)

If FormRecord(i).name = pfrmIn.name Then
FindForm = i
Exit Function
End If

Next i

End If



End Function


Function AddForm(pfrmIn As Form) As Long

Dim FormControl As Control
Dim i As Long
ReDim Preserve FormRecord(MaxForm + 1)

FormRecord(MaxForm).name = pfrmIn.name

FormRecord(MaxForm).Top = pfrmIn.Top

FormRecord(MaxForm).Left = pfrmIn.Left

FormRecord(MaxForm).Height = pfrmIn.Height

FormRecord(MaxForm).Width = pfrmIn.Width

FormRecord(MaxForm).ScaleHeight = pfrmIn.ScaleHeight

FormRecord(MaxForm).ScaleWidth = pfrmIn.ScaleWidth
AddForm = MaxForm
MaxForm = MaxForm + 1

For Each FormControl In pfrmIn
i = FindControl(FormControl, pfrmIn.name)

If i < 0 Then
i = AddControl(FormControl, pfrmIn.name)
End If

Next FormControl

End Function
Function FindControl(inControl As Control, inName As String) As Long

Dim i As Long
FindControl = -1

For i = 0 To (MaxControl - 1)

If ControlRecord(i).Parrent = inName Then
If ControlRecord(i).name = inControl.name Then
On Error Resume Next

If ControlRecord(i).Index = inControl.Index Then
FindControl = i
Exit Function

End If

On Error GoTo 0
End If

End If

Next i

End Function


Function AddControl(inControl As Control, inName As String) As Long

ReDim Preserve ControlRecord(MaxControl + 1)
On Error Resume Next
ControlRecord(MaxControl).name = inControl.name
ControlRecord(MaxControl).Index = inControl.Index
ControlRecord(MaxControl).Parrent = inName

If TypeOf inControl Is Line Then
ControlRecord(MaxControl).Top = inControl.Y1
ControlRecord(MaxControl).Left = ActualPos(inControl.X1)

ControlRecord(MaxControl).Height = inControl.Y2


ControlRecord(MaxControl).Width = ActualPos(inControl.X2)
Else
ControlRecord(MaxControl).Top = inControl.Top
ControlRecord(MaxControl).Left = ActualPos(inControl.Left)
ControlRecord(MaxControl).Height = inControl.Height
ControlRecord(MaxControl).Width = inControl.Width
End If

inControl.IntegralHeight = False
'on error GoTo 0
AddControl = MaxControl
MaxControl = MaxControl + 1
End Function


Function PerWidth(pfrmIn As Form) As Long

Dim i As Long
i = FindForm(pfrmIn)

If i < 0 Then
i = AddForm(pfrmIn)
End If

PerWidth = (pfrmIn.ScaleWidth * 100) \ FormRecord(i).ScaleWidth

End Function


Function PerHeight(pfrmIn As Form) As Double

Dim i As Long
i = FindForm(pfrmIn)

If i < 0 Then
i = AddForm(pfrmIn)
End If

PerHeight = (pfrmIn.ScaleHeight * 100) \ FormRecord(i).ScaleHeight
End Function


Public Sub ResizeControl(inControl As Control, pfrmIn As Form)

On Error Resume Next
Dim i As Long
Dim widthfactor As Single, heightfactor As Single
Dim minFactor As Single
Dim yRatio, xRatio, lTop, lLeft, lWidth, lHeight As Long
yRatio = PerHeight(pfrmIn)
xRatio = PerWidth(pfrmIn)
i = FindControl(inControl, pfrmIn.name)

If inControl.Left < 0 Then
lLeft = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000)
Else
lLeft = CLng((ControlRecord(i).Left * xRatio) \ 100)
End If

lTop = CLng(((ControlRecord(i).Top) * yRatio) \ 100)

lWidth = CLng((ControlRecord(i).Width * xRatio) \ 100)
lHeight = CLng((ControlRecord(i).Height * yRatio) \ 100)
If TypeOf inControl Is Line Then

If inControl.X1 < 0 Then
inControl.X1 = CLng(((ControlRecord(i).Left * xRatio) \ 100) - 75000)
Else
inControl.X1 = CLng((ControlRecord(i).Left * xRatio) \ 100)
End If

inControl.Y1 = CLng((ControlRecord(i).Top * yRatio) \ 100)

If inControl.X2 < 0 Then
inControl.X2 = CLng(((ControlRecord(i).Width * xRatio) \ 100) - 75000)

Else
inControl.X2 = CLng((ControlRecord(i).Width * xRatio) \ 100)
End If

inControl.Y2 = CLng((ControlRecord(i).Height * yRatio) \ 100)
Else
inControl.Move lLeft, lTop, lWidth, lHeight
inControl.Move lLeft, lTop, lWidth
inControl.Move lLeft, lTop
End If

End Sub

热点排行