我知道有一个form_resize()事件,可以实现这种效果,,
但是搞了半天,还是没有搞定...
望高手给个提示呀....
谢了先...
如能给一段小的代码那就更好呀...
但是搞了半天,还是没有搞定...
望高手给个提示呀....
谢了先...
如能给一段小的代码那就更好呀...
解决方案 »
- 怎么写一个批处理命令打开光驱啊 求代码 谢谢
- 怎样将一个接口设为NULL? Public Interface ICogRegion Dim i As ICogRegion = NULL会报错
- 请问哪里有win2000 server 版下载?
- 如何捕获VB并口直接打印的错误?
- 在2000下编的VB程序 打包,怎么不能安装阿
- 很着急,关于彩票中奖的规矩??????一道题。(急)
- 用过activereport报表的朋友请进,我有个简单的问题不明白!!!!
- 突破950软件怎么 下载不了
- 怎样访问frame对象
- 关于window剪贴版问题
- VB如何实现ASP网站的登陆??比如论坛
- 请问怎么把一个VB写的NTService安装的时候带上参数?
Private Sub Form_Resize()
Me.Text1.Width = Me.Width / 2
Me.Text1.Height = Me.Height / 2
Me.Text1.Left = (Me.Width - Me.Text1.Width) / 2
Me.Text1.Top = (Me.Height - Me.Text1.Height) / 2
End Sub
但是..在这个form上有好多的控件...
都需要这样设置吗?
大家平时在做开发的时候是怎么做到的呀....
等比缩放效果并不好,而且不适合所有情况
在ReSize事件中自己计算控件的坐标的效果最好注意:
计算坐标的时候应该使用容器的ScaleWidth、ScaleHeight属性
Width、Height属性是算上窗口外框的大小,对于Form只能是Twip
ScaleWidth、ScaleHeight属性是客户区(能摆放控件的区域,不包括标题栏、菜单栏、边框、滚动条等)的大小
为什么要在ReSzie事件中改变大小
这是为了能让用户可以在运行时改变窗口大小
而“运行时改变窗口大小”的功能是窗口的基本功能
如果你的程序无法做到这一点
就给人一种不专业的感觉(至少我将绝不用那样的软件)
所以一定要锻炼在ReSzie事件中调整控件坐标的能力
对于控件之间有间隙
可以先定义一个常数来说明控件之间的标准间隙大小
然后在计算控件坐标的时候也算上该常数
只是数学运算稍微麻烦了一点而已其实一般的界面都是分成几块的
如资源管理器分为上面的工具栏区域(ReBar控制项)和下面的TreeView、ListView区域
它在处理ReSzie事件时只需修改ReBar控制项的宽度以及下面的TreeView、ListView控制项的位置
由于ReBar控制项会自动修改其中的工具栏的位置,于是程序员不需要操心从上面那个例子可看出
由于一般的界面都是分成几块区域的
只有区域本身需要修改位置
区域中的控件大多不需要修改位置
所以其实在窗口中真正需要手动算坐标的其实很少可以在VB中利用这种思想
可将控件放入不同的PictureBox中
特别是PictureBox有Align属性
可以进一步的减少代码量假若PictureBox中的控件需要定位
则应在PictureBox的ReSize事件中定位控件(注意此时别在Form的ReSize事件定位,那是人为制造难度)
区域大小也应根据PictureBox的ScaleHeight、ScaleWidth属性
此时With语句的作用就很重要了(如在“With PicLeft”块中写定位代码)
注意这时为了减少PictureBox所占资源
应将其AutoRedraw、HasDC属性都设为False
'
' 控件随窗体大小改变而改变
'
'*****************************************************************Private Sub Form_Resize()
Dim H, i As Integer
On Error Resume Next
Resize_ALL frmmain 'Me是窗体名,Form1,Form2等等都可以End SubFunction ActualPos(plLeft As Long) As Long If plLeft < 0 Then
ActualPos = plLeft + 75000
Else
ActualPos = plLeft
End IfEnd FunctionFunction 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 IfEnd 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 FormControlEnd Function
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 FunctionFunction 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 FunctionFunction 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 FunctionFunction 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 FunctionPublic 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 IfEnd SubPublic Sub ResizeForm(pfrmIn As Form) Dim FormControl As Control
Dim isVisible As Boolean
Dim StartX, StartY, MaxX, MaxY As Long
Dim bNew As Boolean If Not bRunning Then
bRunning = True If FindForm(pfrmIn) < 0 Then
bNew = True
Else
bNew = False
End If
If pfrmIn.Top < 30000 Then
isVisible = pfrmIn.Visible
On Error Resume Next
If Not pfrmIn.MDIChild Then
On Error GoTo 0
' ' pfrmIn.Visible = False
Else If bNew Then
StartY = pfrmIn.Height
StartX = pfrmIn.Width
On Error Resume Next
For Each FormControl In pfrmIn
If FormControl.Left + FormControl.Width + 200 > MaxX Then
MaxX = FormControl.Left + FormControl.Width + 200
End If If FormControl.Top + FormControl.Height + 500 > MaxY Then
MaxY = FormControl.Top + FormControl.Height + 500
End If If FormControl.X1 + 200 > MaxX Then
MaxX = FormControl.X1 + 200
End If If FormControl.Y1 + 500 > MaxY Then
MaxY = FormControl.Y1 + 500
End If If FormControl.X2 + 200 > MaxX Then
MaxX = FormControl.X2 + 200
End If If FormControl.Y2 + 500 > MaxY Then
MaxY = FormControl.Y2 + 500
End If Next FormControl On Error GoTo 0
pfrmIn.Height = MaxY
pfrmIn.Width = MaxX
End If On Error GoTo 0
End If For Each FormControl In pfrmIn
ResizeControl FormControl, pfrmIn
Next FormControl On Error Resume Next If Not pfrmIn.MDIChild Then
On Error GoTo 0
pfrmIn.Visible = isVisible
Else If bNew Then
pfrmIn.Height = StartY
pfrmIn.Width = StartX For Each FormControl In pfrmIn
ResizeControl FormControl, pfrmIn
Next FormControl End If
End If
On Error GoTo 0
End If
bRunning = False
End IfEnd SubPublic Sub SaveFormPosition(pfrmIn As Form) Dim i As Long If MaxForm > 0 Then For i = 0 To (MaxForm - 1) If FormRecord(i).Name = pfrmIn.Name Then FormRecord(i).Top = pfrmIn.Top
FormRecord(i).Left = pfrmIn.Left
FormRecord(i).Height = pfrmIn.Height
FormRecord(i).Width = pfrmIn.Width
Exit Sub
End If
Next i AddForm (pfrmIn)
End If
End SubPublic Sub RestoreFormPosition(pfrmIn As Form) Dim i As Long
If MaxForm > 0 Then
For i = 0 To (MaxForm - 1)
If FormRecord(i).Name = pfrmIn.Name Then
If FormRecord(i).Top < 0 Then
pfrmIn.WindowState = 2
ElseIf FormRecord(i).Top < 30000 Then
pfrmIn.WindowState = 0
pfrmIn.Move FormRecord(i).Left, FormRecord(i).Top, FormRecord(i).Width, FormRecord(i).Height
Else
pfrmIn.WindowState = 1
End If
Exit Sub
End If
Next i
End If
End SubPublic Sub Resize_ALL(Form_Name As Form) Dim OBJ As Object
For Each OBJ In Form_Name
ResizeControl OBJ, Form_Name
Next OBJ
End SubPublic Sub DragForm(frm As Form) On Local Error Resume Next
Call ReleaseCapture
Call SendMessage(frm.hwnd, WM_NCLBUTTONDOWN, 2, 0)End Sub
'重新分配控件的大小End Sub
例如,你要使用text1和From1窗口的大小相同
在Resize事件中插入代码
Private Sub Form_Resize()
text1.width = form1.width '设置文本框的宽度与窗口相同
text1.hight = form1.hight '设置文本框的高度相同
如果你觉的太大了,你可以在后面减掉一些,他的单位是 “缇”
例如:
text1.width = form1.width -1000