呵呵,查了一下资料,还是找到了。 ------------------------------------------------------------- 屏幕分辨率改变的响应 作者: ZDNet China Friday, December 12 2003 11:31 AM 对于运行于整个屏幕方式的程序,最重要的是能够正确识别和响应屏幕分辨率的改变。在VB程序中可以通过引用微软的SysInfo控件实现这一功能。 SysInfo控件提供了系统设置的信息,当系统设置更改时其能够激活响应事件。为了使用这一控件,可以参见于“Microsoft SysInfo Control 6.0”,并将控件添加到窗体中。WorkArea属性提供了有关屏幕分辨率的信息:Debug.Print "Height : " & SysInfo1.WorkAreaHeight Debug.Print "Width : " & SysInfo1.WorkAreaWidth Debug.Print "Top : " & SysInfo1.WorkAreaTop Debug.Print "Left : " & SysInfo1.WorkAreaLeft 为了能够捕捉屏幕分辨率的更改,在DisplayChanged事件中添加如下的代码。这一代码段改变了窗体以适合于可用的屏幕区域。Private Sub SysInfo1_DisplayChanged() Me.Move SysInfo1.WorkAreaLeft, SysInfo1.WorkAreaTop, _ SysInfo1.WorkAreaWidth, SysInfo1.WorkAreaHeight End Sub SysInfo控件能够让你很容易地对屏幕分辨率的改变作出反应,它也提供了有关设备驱动程序改变,电源设置等方面的信息。
Option ExplicitPrivate Sub Form_Load() Me.Left = 0 Me.Top = 0 Me.Width = Screen.Width Me.Height = Screen.Height End Sub其实最难的是根据窗体大小变化来调整控件位置。如果需要这样的代码,可以给我发短信。
'----------------------------------------------------------------------- '有时窗体变化后,如改变分辨率后控件大小却不能随之改变。 '手工代码调整实在麻烦,下面的模块实现自动查找窗体上控件 '并使其改变大小以适应窗体变化。'在Form的Resize事件中调用函数Resize_All就能实现控件自动调整大小,如: '----------------------------------------------------------------------- 'Private Sub Form_Resize() ' Resize_ALL Me 'Me是窗体名,Form1,Form2等等都可以 '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 TypePrivate 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 IfEnd 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 IfEnd Function Function AddForm(pfrmIn As Form) As Long Dim FormControl As Control Dim i As Long ReDim Preserve FormRecord(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 Function FindControl(inControl As Control, inName As String) As LongDim i As Long FindControl = -1For 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 iEnd 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 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 Sub Public 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 Sub Public 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 IfEnd Sub Public Sub Resize_ALL(Form_Name As Form) Dim OBJ As Object For Each OBJ In Form_Name ResizeControl OBJ, Form_Name Next OBJEnd SubPublic Sub DragForm(frm As Form) On Local Error Resume Next Call ReleaseCapture Call SendMessage(frm.hwnd, WM_NCLBUTTONDOWN, 2, 0)End Sub
Dim a(), g(1) As Single Dim t As Integer, dt As IntegerPrivate 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: 'Timer1.Enabled = True 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 If TypeOf b Is PictureBox Then ' If Check1.Value = 1 Then b.PaintPicture b.Picture, 0, 0, b.ScaleWidth, b.ScaleHeight Else b.Cls End If Set b = Nothing Next i End If End Sub 偶比較喜歡這段代碼,但是是講隨這表單變化,控制控件變化不是你說的分辨率問題一般可以用api判斷分辨率,然後寫2組不同的數據進入ini文件,在讀出應該顯示的大小
screen.width
screen.height然后再改变窗体大小,但是如果再运行期间随时检测屏幕分辨率有没有改变的话会比较麻烦,要么用Timer,要么要用API捕获系统消息。呵呵,本人才疏学浅,时间也不多,楼主自己去查一下吧。
-------------------------------------------------------------
屏幕分辨率改变的响应 作者: ZDNet China
Friday, December 12 2003 11:31 AM 对于运行于整个屏幕方式的程序,最重要的是能够正确识别和响应屏幕分辨率的改变。在VB程序中可以通过引用微软的SysInfo控件实现这一功能。
SysInfo控件提供了系统设置的信息,当系统设置更改时其能够激活响应事件。为了使用这一控件,可以参见于“Microsoft SysInfo Control 6.0”,并将控件添加到窗体中。WorkArea属性提供了有关屏幕分辨率的信息:Debug.Print "Height : " & SysInfo1.WorkAreaHeight
Debug.Print "Width : " & SysInfo1.WorkAreaWidth
Debug.Print "Top : " & SysInfo1.WorkAreaTop
Debug.Print "Left : " & SysInfo1.WorkAreaLeft 为了能够捕捉屏幕分辨率的更改,在DisplayChanged事件中添加如下的代码。这一代码段改变了窗体以适合于可用的屏幕区域。Private Sub SysInfo1_DisplayChanged()
Me.Move SysInfo1.WorkAreaLeft, SysInfo1.WorkAreaTop, _
SysInfo1.WorkAreaWidth, SysInfo1.WorkAreaHeight
End Sub SysInfo控件能够让你很容易地对屏幕分辨率的改变作出反应,它也提供了有关设备驱动程序改变,电源设置等方面的信息。
Me.Left = 0
Me.Top = 0
Me.Width = Screen.Width
Me.Height = Screen.Height
End Sub其实最难的是根据窗体大小变化来调整控件位置。如果需要这样的代码,可以给我发短信。
'有时窗体变化后,如改变分辨率后控件大小却不能随之改变。
'手工代码调整实在麻烦,下面的模块实现自动查找窗体上控件
'并使其改变大小以适应窗体变化。'在Form的Resize事件中调用函数Resize_All就能实现控件自动调整大小,如:
'-----------------------------------------------------------------------
'Private Sub Form_Resize()
' Resize_ALL Me 'Me是窗体名,Form1,Form2等等都可以
'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 TypePrivate 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 IfEnd 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 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
Function FindControl(inControl As Control, inName As String) As LongDim i As Long
FindControl = -1For 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 iEnd 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
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 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 Sub
Public 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 Sub
Public 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 IfEnd Sub
Public Sub Resize_ALL(Form_Name As Form) Dim OBJ As Object
For Each OBJ In Form_Name
ResizeControl OBJ, Form_Name
Next OBJEnd SubPublic Sub DragForm(frm As Form) On Local Error Resume Next
Call ReleaseCapture
Call SendMessage(frm.hwnd, WM_NCLBUTTONDOWN, 2, 0)End Sub
Dim t As Integer, dt As IntegerPrivate 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: 'Timer1.Enabled = True
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
If TypeOf b Is PictureBox Then
' If Check1.Value = 1 Then b.PaintPicture b.Picture, 0, 0, b.ScaleWidth, b.ScaleHeight Else b.Cls
End If
Set b = Nothing
Next i
End If
End Sub
偶比較喜歡這段代碼,但是是講隨這表單變化,控制控件變化不是你說的分辨率問題一般可以用api判斷分辨率,然後寫2組不同的數據進入ini文件,在讀出應該顯示的大小