我的程序的主窗体是一个满屏的窗体,可以适应不同的分辨率,这个没有问题,但是我的主窗体上有一个菜单栏、一个工具条、一个状态条,窗体的其他部分(即中间)是一个Picture Box,分辨率变化的时候它总是不行。不知道大家如何解决这个问题?
解决方案 »
- 在VB中生成一个表格,我想双击表格中的某一条记录,则这一条记录的内容会在一个新窗口中显示出来,应怎样做呀
- 考试系统
- 我用s = InputBox("请输入第几课")语句,运行后输入的课文数,如输入1,则打开1.ppt怎么把输入的字符串变成整形变量
- split函数问题
- 别嫌弃呀,帮忙详尽注释一个VB程序~~~~!最好详尽一点。刚刚在基础类发了别彻底鄙视了~
- 如何给文件重命名!如a.bsd 改为b.yu
- 100分求助!SQL查询!谢谢
- DLL函数中的“char *”变量,VB如何带入?(在线给分)
- listview中的数字怎么排序
- 关于VB中的窗口切分技术?
- 如何将简体中文的软件换成繁体中文的
- 一个问题,vb6中MDI child form, 怎样disable MaxButton
Dim t As Integer, dt As Integer
Private Sub Form_Activate()
If g(0) = 0 Then '原始值只記錄一次
g(0) = Form1.ScaleWidth: g(1) = Form1.ScaleHeight '一開始表單的大小
ReDim a(Form1.Controls.Count - 1, 5)
j = 0
For Each i In Form1.Controls '記錄每個物件的資料
a(j, 0) = i.Name
On Error Resume Next '避免某些物件沒有指定的屬性而錯誤
a(j, 1) = i.Left: a(j, 2) = i.Top
a(j, 3) = i.Width: a(j, 4) = i.Height
a(j, 5) = i.FontSize
On Error GoTo 0 '取消錯誤處理
j = j + 1
Next i
t = 0: dt = 100
End If
End SubPrivate Sub Form_Resize()
If Form1.WindowState <> 1 And g(0) > 0 And g(1) > 0 Then
'重算物件的新位置
For i = 0 To Form1.Controls.Count - 1
Set b = Controls(a(i, 0))
On Error Resume Next
b.Left = a(i, 1) / g(0) * Form1.ScaleWidth
b.Top = a(i, 2) / g(1) * Form1.ScaleHeight
b.Width = a(i, 3) / g(0) * Form1.ScaleWidth
b.Height = a(i, 4) / g(1) * Form1.ScaleHeight
If Form1.ScaleWidth / g(0) < Form1.ScaleHeight / g(1) Then
b.FontSize = a(i, 5) / g(0) * Form1.ScaleWidth
Else
b.FontSize = a(i, 5) / g(1) * Form1.ScaleHeight
End If
On Error GoTo 0
Set b = Nothing
Next i
End If
End Sub
Private Sub Timer1_Timer()
t = t + Sgn(dt)
If t > 15 Then dt = -dt
If Form1.WindowState = 2 Then Form1.WindowState = 0: Timer1.Interval = 100: GoTo kk
If t = 16 Then Form1.WindowState = 2 - Form1.WindowState: Timer1.Interval = 1000: GoTo kk
Form1.Move (Screen.Width - Form1.Width - dt * 3) / 2, (Screen.Height - Form1.Height - dt) / 2
Form1.Move Form1.Left, Form1.Top, Form1.Width + dt * 3, Form1.Height + dt
kk:
If dt < 0 And t < 1 Then t = 0: Timer1.Enabled = False
End Sub
Private FormOldWidth As Long '保存窗体的原始宽度
Private FormOldHeight As Long '保存窗体的原始高度'在调用ResizeForm前先调用本函数
Public 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 0
End Sub'按比例改变表单内各元件的大小,
在调用ReSizeForm前先调用ReSizeInit函数
Public Sub ResizeForm(FormName As Form)
Dim Pos(4) As Double
Dim i As Long, TempPos As Long, StartPos As Long
Dim Obj As Control
Dim ScaleX As Double, ScaleY As DoubleScaleX = 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 0
End SubPrivate Sub Form_Load()
Call ResizeInit(Me) '在程序装入时必须加入
End SubPrivate Sub Form_Resize()
Call ResizeForm(Me)
'确保窗体改变时控件随之改变
End Sub
’类模块:clsAutoPositioner
Option Explicit
Dim m_oAssignments As New CollectionPublic Function AddAssignment(ctl As Object, _
ctlRelative As Object, _
tPosType As tPOSITION_TYPE)
Dim x As New clsAutoPositionerItem
Set x.oCTL = ctl
Set x.oREL = ctlRelative
x.tPosType = tPosType
Select Case x.tPosType
Case tCONTAINER_RELATIVE_POS_RIGHT:
x.lValue = x.oREL.Width - x.oCTL.Left
Case tCONTAINER_RELATIVE_POS_BOTTOM:
x.lValue = x.oREL.Height - x.oCTL.Top
Case tCONTAINER_WIDTH_DELTA_RIGHT:
x.lValue = x.oREL.Width - (x.oCTL.Left + x.oCTL.Width)
Case tCONTAINER_HEIGHT_DELTA_BOTTOM:
x.lValue = x.oREL.Height - (x.oCTL.Top + x.oCTL.Height)
Case tCONTROL_RELATIVE_SAME_POS_VERTICAL:
x.lValue = x.oCTL.Left - x.oREL.Left
Case tCONTROL_RELATIVE_SAME_POS_HORIZONTAL:
x.lValue = x.oCTL.Top - x.oREL.Top
End Select
m_oAssignments.Add x
End Function
Public Function RefreshPositions()
Dim i As Long
Dim x As clsAutoPositionerItem
Dim erg As Long
For i = 1 To m_oAssignments.Count
Set x = m_oAssignments.Item(i)
Select Case x.tPosType
Case tCONTAINER_RELATIVE_POS_RIGHT:
erg = x.oREL.Width - x.lValue
If (erg > 0) Then x.oCTL.Left = erg
Case tCONTAINER_RELATIVE_POS_BOTTOM:
erg = x.oREL.Height - x.lValue
If (erg > 0) Then x.oCTL.Top = erg
Case tCONTAINER_WIDTH_DELTA_RIGHT:
erg = x.oREL.Width - x.oCTL.Left - x.lValue
If (erg > 0) Then x.oCTL.Width = erg
Case tCONTAINER_HEIGHT_DELTA_BOTTOM:
erg = x.oREL.Height - x.oCTL.Top - x.lValue
If (erg > 0) Then
x.oCTL.Height = erg
Else
erg = erg
End If
Case tCONTROL_RELATIVE_SAME_POS_VERTICAL:
erg = x.oREL.Left + x.lValue
x.oCTL.Left = erg
Case tCONTROL_RELATIVE_SAME_POS_HORIZONTAL:
erg = x.oREL.Top + x.lValue
x.oCTL.Top = erg
End Select
Next
End Function’//////////////////////////////////////////////////////////////////////////////////////////////////////////
’类模块:clsAutoPositionerItem
Public Enum tPOSITION_TYPE
tCONTAINER_RELATIVE_POS_RIGHT
tCONTAINER_RELATIVE_POS_BOTTOM
tCONTAINER_WIDTH_DELTA_RIGHT
tCONTAINER_HEIGHT_DELTA_BOTTOM
tCONTROL_RELATIVE_SAME_POS_VERTICAL
tCONTROL_RELATIVE_SAME_POS_HORIZONTAL
End Enum
Public oCTL As Object
Public oREL As Object
Public tPosType As tPOSITION_TYPE
Public lValue As tPOSITION_TYPE’//////////////////////////////////////////////////////////////////////////////////////////////////////////
’窗体代码:Option Explicit
Dim m_oAutoPos As New clsAutoPositioner
Private Sub Form_Load()
’ Always relative to container’s right border
m_oAutoPos.AddAssignment Me.Command1, Me, tCONTAINER_RELATIVE_POS_RIGHT’ Auto resizing horizontally
m_oAutoPos.AddAssignment Me.Command2, Me, tCONTAINER_WIDTH_DELTA_RIGHT’ Auto resizing vertically
m_oAutoPos.AddAssignment Me.Command3, Me, tCONTAINER_HEIGHT_DELTA_BOTTOM’ Always relative to container’s bottom border
m_oAutoPos.AddAssignment Me.Command4, Me, tCONTAINER_RELATIVE_POS_BOTTOM’ Auto resizing horizontally + Auto resizing vertically
m_oAutoPos.AddAssignment Me.Command5, Me, tCONTAINER_WIDTH_DELTA_RIGHT
m_oAutoPos.AddAssignment Me.Command5, Me, tCONTAINER_HEIGHT_DELTA_BOTTOM
End SubPrivate Sub Form_Resize()
m_oAutoPos.RefreshPositions
End Sub
如果你没什么特殊要求,根本不需要上面那么复杂的代码
简单的定义一下控件的位置为尺寸就行了假定你的picturebox是满窗体显示的,这样写
Private Sub Form_Resize()
Picture1.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
End Sub不管分辨率怎么变,用户如何调整窗体大小,picturebox的大小和位置都可以做出相应变化
Picture1.Align = vbAlignTop
End SubPrivate Sub Form_Resize()
Picture1.Height = ScaleHeight
End Sub
Private Sub Form_Resize()
Picture1.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
End Sub如果不是最大化而是手工(代码)把窗体满屏,稍微麻烦一点
要监视系统的改变,一但发现分辨率改变,即进行调整
可以API实现,也可以试试VB自带的SysInfo控件