8 个解决方案
#1
在Resize事件里写代码调整吧~~
#2
随着显示器和显示卡的价格越来越便宜,我们也享受到了大屏幕、高分辨率彩显带来的高品质画面。然而编程人员却遇到了一个问题:如何使应用程序在不同分辨率下看起来效果一样(窗体在屏幕上的相对位置以及窗体中的控件的相对位置都不变),同时界面中的文字(如各控件的标题以及说明等)也不发生明显的变化。看看我们是如何使应用程序变脸的吧!
一、编程原理
在Visual Basic应用程序中,屏幕(Screen)是一个对象。其Width和Height属性以Twip为单位反映出屏幕的宽度和高度。而TwipsPerPixelX和TwipsPerPixelY这两个属性只与硬件有关,而与屏幕上可设定的分辨率无关。将Width除以TwipsPerPixelX可以计算出屏幕的水平分辨率(像素数),同样将Height除以TwipsPerPixelY也可以计算出屏幕的垂直分辨率。要想保持一个窗口或是控件的物理大小不变,只要计算出设计时的分辨率与实际运行时的分辨率的比值,然后根据这个比值来调节窗口和其中的控件的大小和相对位置,以及显示的字体尺寸,就可以保持同一应用程序的窗口在不同的系统下的物理外观(当然在不同尺寸的显示器上只能保持比例不变,物理大小还是不同的)。根据这一原理,可以编制一个通用的子程序,可放入任意的应用程序的启动过程中调用。
二、示例程序
通用程序的代码如下:(子程序名SetDeviceIndependentWindow)
Sub SetDeviceIndependentWindow(ThisForm As Form)
′ThisForm,就是要改变外观的窗体名
Dim DesignX As Integer ′代表设计系统的水平分辨率
Dim DesignY As Integer ′代表设计系统的垂直分辨率
Dim XFactor As Single ′水平比例因子
Dim YFactor As Single ′垂直比例因子
Dim X As Integer ′ For/Next循环中的变量
DesignX% = 800: DesignY% = 600
′假设设计时的分辨率为800×600
′计算当前屏幕尺寸与设计时使用的屏幕尺寸的比值
XFactor =(Screen.Width / Screen.TwipsPerPixelX)
/ DesignX
YFactor =(Screen.Height / Screen.TwipsPerPixelY)
/ DesignY
′如果这两个比值均为1,则不必调节窗体或控件的大小
If XFactor=1 And YFactor=1
Then Exit Sub
′若这两个比值至少有一个不为1,则应该进行调节,首先调节窗体的大小和位置
ThisForm.Move ThisForm.Left*
XFactor, ThisForm.Top*YFactor,_
ThisForm.Width*XFactor, ThisForm.Height*YFactor
′调节文本框和标签控件的字体尺寸
If TypeOf ThisForm.Controls(X) Is TextBox Then
ThisForm.Controls(X).FontSize=ThisForm.Controls
(X).FontSize * XFactor
ElseIf TypeOf ThisForm.Controls(X) Is Label
Then
ThisForm.Controls(X).FontSize= ThisForm.Controls
(X).FontSize * XFactor
End If
′ 如果窗体上还有其他控件,可在此处加入其他If语句加以判断,以便决定如何处理
End If
Next X
End Sub
以上代码可以放入应用程序的任何代码模块中,然后在启动窗体或是Sub Main中调用,将要控制的窗体名代入子程序的调用参数。
一、编程原理
在Visual Basic应用程序中,屏幕(Screen)是一个对象。其Width和Height属性以Twip为单位反映出屏幕的宽度和高度。而TwipsPerPixelX和TwipsPerPixelY这两个属性只与硬件有关,而与屏幕上可设定的分辨率无关。将Width除以TwipsPerPixelX可以计算出屏幕的水平分辨率(像素数),同样将Height除以TwipsPerPixelY也可以计算出屏幕的垂直分辨率。要想保持一个窗口或是控件的物理大小不变,只要计算出设计时的分辨率与实际运行时的分辨率的比值,然后根据这个比值来调节窗口和其中的控件的大小和相对位置,以及显示的字体尺寸,就可以保持同一应用程序的窗口在不同的系统下的物理外观(当然在不同尺寸的显示器上只能保持比例不变,物理大小还是不同的)。根据这一原理,可以编制一个通用的子程序,可放入任意的应用程序的启动过程中调用。
二、示例程序
通用程序的代码如下:(子程序名SetDeviceIndependentWindow)
Sub SetDeviceIndependentWindow(ThisForm As Form)
′ThisForm,就是要改变外观的窗体名
Dim DesignX As Integer ′代表设计系统的水平分辨率
Dim DesignY As Integer ′代表设计系统的垂直分辨率
Dim XFactor As Single ′水平比例因子
Dim YFactor As Single ′垂直比例因子
Dim X As Integer ′ For/Next循环中的变量
DesignX% = 800: DesignY% = 600
′假设设计时的分辨率为800×600
′计算当前屏幕尺寸与设计时使用的屏幕尺寸的比值
XFactor =(Screen.Width / Screen.TwipsPerPixelX)
/ DesignX
YFactor =(Screen.Height / Screen.TwipsPerPixelY)
/ DesignY
′如果这两个比值均为1,则不必调节窗体或控件的大小
If XFactor=1 And YFactor=1
Then Exit Sub
′若这两个比值至少有一个不为1,则应该进行调节,首先调节窗体的大小和位置
ThisForm.Move ThisForm.Left*
XFactor, ThisForm.Top*YFactor,_
ThisForm.Width*XFactor, ThisForm.Height*YFactor
′调节文本框和标签控件的字体尺寸
If TypeOf ThisForm.Controls(X) Is TextBox Then
ThisForm.Controls(X).FontSize=ThisForm.Controls
(X).FontSize * XFactor
ElseIf TypeOf ThisForm.Controls(X) Is Label
Then
ThisForm.Controls(X).FontSize= ThisForm.Controls
(X).FontSize * XFactor
End If
′ 如果窗体上还有其他控件,可在此处加入其他If语句加以判断,以便决定如何处理
End If
Next X
End Sub
以上代码可以放入应用程序的任何代码模块中,然后在启动窗体或是Sub Main中调用,将要控制的窗体名代入子程序的调用参数。
#3
把 ScaleMode 的属性 Twip(缇) 改为 pixel(象素)
#4
screen.width/15 screen.height/15 用乘号连接就是分辨率
#5
Private Sub Form_Load()
Me.ScaleMode = 3
....
End Sub
Me.ScaleMode = 3
....
End Sub
#6
用这种方法,对于SSTAB控件有问题,并且,效果不好,会出问题.
见意不要用此种方法,还是用控件吧....要做专业的界面的话,最好用ACTIVE BAR...奇爽...
若有需要,可与我联系...
QQ:37059658
feng_zhong_xia@yahoo.com.cn
见意不要用此种方法,还是用控件吧....要做专业的界面的话,最好用ACTIVE BAR...奇爽...
若有需要,可与我联系...
QQ:37059658
feng_zhong_xia@yahoo.com.cn
#7
自己在resize事件中写代码
#8
以下代碼已通過運行,但對picture控件無效,要另外控制。
Option Explicit
Dim record(), firstload(1) As Single
Dim obj As Variant
Dim i As Integer
Dim w As Variant
Private Sub Form_Activate()
If firstload(0) = 0 Then '原始值只記錄一次
firstload(0) = Form1.ScaleWidth
firstload(1) = Form1.ScaleHeight '一開始表單的大小
ReDim record(Form1.Controls.Count - 1, 5)
i = 0
For Each obj In Form1.Controls '記錄每個物件的資料
record(i, 0) = obj.Name
On Error Resume Next '避免某些物件沒有指定的屬性而錯誤
record(i, 1) = obj.Left
record(i, 2) = obj.Top
record(i, 3) = obj.Width
record(i, 4) = obj.Height
record(i, 5) = obj.FontSize
On Error GoTo 0 '取消錯誤處理
i = i + 1
Next obj
End If
End Sub
Private Sub Form_Resize()
If Form1.WindowState <> 1 And firstload(0) > 0 And firstload(1) > 0 Then
'重算物件的新位置
For obj = 0 To Form1.Controls.Count - 1
Set w = Controls(record(obj, 0))
On Error Resume Next
w.Left = record(obj, 1) / firstload(0) * Form1.ScaleWidth
w.Top = record(obj, 2) / firstload(1) * Form1.ScaleHeight
w.Width = record(obj, 3) / firstload(0) * Form1.ScaleWidth
w.Height = record(obj, 4) / firstload(1) * Form1.ScaleHeight
If Form1.ScaleWidth / firstload(0) < Form1.ScaleHeight / firstload(1) Then
w.FontSize = record(obj, 5) / firstload(0) * Form1.ScaleWidth
Else
w.FontSize = record(obj, 5) / firstload(1) * Form1.ScaleHeight
End If
On Error GoTo 0
Set w = Nothing
Next obj
End If
End Sub
Option Explicit
Dim record(), firstload(1) As Single
Dim obj As Variant
Dim i As Integer
Dim w As Variant
Private Sub Form_Activate()
If firstload(0) = 0 Then '原始值只記錄一次
firstload(0) = Form1.ScaleWidth
firstload(1) = Form1.ScaleHeight '一開始表單的大小
ReDim record(Form1.Controls.Count - 1, 5)
i = 0
For Each obj In Form1.Controls '記錄每個物件的資料
record(i, 0) = obj.Name
On Error Resume Next '避免某些物件沒有指定的屬性而錯誤
record(i, 1) = obj.Left
record(i, 2) = obj.Top
record(i, 3) = obj.Width
record(i, 4) = obj.Height
record(i, 5) = obj.FontSize
On Error GoTo 0 '取消錯誤處理
i = i + 1
Next obj
End If
End Sub
Private Sub Form_Resize()
If Form1.WindowState <> 1 And firstload(0) > 0 And firstload(1) > 0 Then
'重算物件的新位置
For obj = 0 To Form1.Controls.Count - 1
Set w = Controls(record(obj, 0))
On Error Resume Next
w.Left = record(obj, 1) / firstload(0) * Form1.ScaleWidth
w.Top = record(obj, 2) / firstload(1) * Form1.ScaleHeight
w.Width = record(obj, 3) / firstload(0) * Form1.ScaleWidth
w.Height = record(obj, 4) / firstload(1) * Form1.ScaleHeight
If Form1.ScaleWidth / firstload(0) < Form1.ScaleHeight / firstload(1) Then
w.FontSize = record(obj, 5) / firstload(0) * Form1.ScaleWidth
Else
w.FontSize = record(obj, 5) / firstload(1) * Form1.ScaleHeight
End If
On Error GoTo 0
Set w = Nothing
Next obj
End If
End Sub
#1
在Resize事件里写代码调整吧~~
#2
随着显示器和显示卡的价格越来越便宜,我们也享受到了大屏幕、高分辨率彩显带来的高品质画面。然而编程人员却遇到了一个问题:如何使应用程序在不同分辨率下看起来效果一样(窗体在屏幕上的相对位置以及窗体中的控件的相对位置都不变),同时界面中的文字(如各控件的标题以及说明等)也不发生明显的变化。看看我们是如何使应用程序变脸的吧!
一、编程原理
在Visual Basic应用程序中,屏幕(Screen)是一个对象。其Width和Height属性以Twip为单位反映出屏幕的宽度和高度。而TwipsPerPixelX和TwipsPerPixelY这两个属性只与硬件有关,而与屏幕上可设定的分辨率无关。将Width除以TwipsPerPixelX可以计算出屏幕的水平分辨率(像素数),同样将Height除以TwipsPerPixelY也可以计算出屏幕的垂直分辨率。要想保持一个窗口或是控件的物理大小不变,只要计算出设计时的分辨率与实际运行时的分辨率的比值,然后根据这个比值来调节窗口和其中的控件的大小和相对位置,以及显示的字体尺寸,就可以保持同一应用程序的窗口在不同的系统下的物理外观(当然在不同尺寸的显示器上只能保持比例不变,物理大小还是不同的)。根据这一原理,可以编制一个通用的子程序,可放入任意的应用程序的启动过程中调用。
二、示例程序
通用程序的代码如下:(子程序名SetDeviceIndependentWindow)
Sub SetDeviceIndependentWindow(ThisForm As Form)
′ThisForm,就是要改变外观的窗体名
Dim DesignX As Integer ′代表设计系统的水平分辨率
Dim DesignY As Integer ′代表设计系统的垂直分辨率
Dim XFactor As Single ′水平比例因子
Dim YFactor As Single ′垂直比例因子
Dim X As Integer ′ For/Next循环中的变量
DesignX% = 800: DesignY% = 600
′假设设计时的分辨率为800×600
′计算当前屏幕尺寸与设计时使用的屏幕尺寸的比值
XFactor =(Screen.Width / Screen.TwipsPerPixelX)
/ DesignX
YFactor =(Screen.Height / Screen.TwipsPerPixelY)
/ DesignY
′如果这两个比值均为1,则不必调节窗体或控件的大小
If XFactor=1 And YFactor=1
Then Exit Sub
′若这两个比值至少有一个不为1,则应该进行调节,首先调节窗体的大小和位置
ThisForm.Move ThisForm.Left*
XFactor, ThisForm.Top*YFactor,_
ThisForm.Width*XFactor, ThisForm.Height*YFactor
′调节文本框和标签控件的字体尺寸
If TypeOf ThisForm.Controls(X) Is TextBox Then
ThisForm.Controls(X).FontSize=ThisForm.Controls
(X).FontSize * XFactor
ElseIf TypeOf ThisForm.Controls(X) Is Label
Then
ThisForm.Controls(X).FontSize= ThisForm.Controls
(X).FontSize * XFactor
End If
′ 如果窗体上还有其他控件,可在此处加入其他If语句加以判断,以便决定如何处理
End If
Next X
End Sub
以上代码可以放入应用程序的任何代码模块中,然后在启动窗体或是Sub Main中调用,将要控制的窗体名代入子程序的调用参数。
一、编程原理
在Visual Basic应用程序中,屏幕(Screen)是一个对象。其Width和Height属性以Twip为单位反映出屏幕的宽度和高度。而TwipsPerPixelX和TwipsPerPixelY这两个属性只与硬件有关,而与屏幕上可设定的分辨率无关。将Width除以TwipsPerPixelX可以计算出屏幕的水平分辨率(像素数),同样将Height除以TwipsPerPixelY也可以计算出屏幕的垂直分辨率。要想保持一个窗口或是控件的物理大小不变,只要计算出设计时的分辨率与实际运行时的分辨率的比值,然后根据这个比值来调节窗口和其中的控件的大小和相对位置,以及显示的字体尺寸,就可以保持同一应用程序的窗口在不同的系统下的物理外观(当然在不同尺寸的显示器上只能保持比例不变,物理大小还是不同的)。根据这一原理,可以编制一个通用的子程序,可放入任意的应用程序的启动过程中调用。
二、示例程序
通用程序的代码如下:(子程序名SetDeviceIndependentWindow)
Sub SetDeviceIndependentWindow(ThisForm As Form)
′ThisForm,就是要改变外观的窗体名
Dim DesignX As Integer ′代表设计系统的水平分辨率
Dim DesignY As Integer ′代表设计系统的垂直分辨率
Dim XFactor As Single ′水平比例因子
Dim YFactor As Single ′垂直比例因子
Dim X As Integer ′ For/Next循环中的变量
DesignX% = 800: DesignY% = 600
′假设设计时的分辨率为800×600
′计算当前屏幕尺寸与设计时使用的屏幕尺寸的比值
XFactor =(Screen.Width / Screen.TwipsPerPixelX)
/ DesignX
YFactor =(Screen.Height / Screen.TwipsPerPixelY)
/ DesignY
′如果这两个比值均为1,则不必调节窗体或控件的大小
If XFactor=1 And YFactor=1
Then Exit Sub
′若这两个比值至少有一个不为1,则应该进行调节,首先调节窗体的大小和位置
ThisForm.Move ThisForm.Left*
XFactor, ThisForm.Top*YFactor,_
ThisForm.Width*XFactor, ThisForm.Height*YFactor
′调节文本框和标签控件的字体尺寸
If TypeOf ThisForm.Controls(X) Is TextBox Then
ThisForm.Controls(X).FontSize=ThisForm.Controls
(X).FontSize * XFactor
ElseIf TypeOf ThisForm.Controls(X) Is Label
Then
ThisForm.Controls(X).FontSize= ThisForm.Controls
(X).FontSize * XFactor
End If
′ 如果窗体上还有其他控件,可在此处加入其他If语句加以判断,以便决定如何处理
End If
Next X
End Sub
以上代码可以放入应用程序的任何代码模块中,然后在启动窗体或是Sub Main中调用,将要控制的窗体名代入子程序的调用参数。
#3
把 ScaleMode 的属性 Twip(缇) 改为 pixel(象素)
#4
screen.width/15 screen.height/15 用乘号连接就是分辨率
#5
Private Sub Form_Load()
Me.ScaleMode = 3
....
End Sub
Me.ScaleMode = 3
....
End Sub
#6
用这种方法,对于SSTAB控件有问题,并且,效果不好,会出问题.
见意不要用此种方法,还是用控件吧....要做专业的界面的话,最好用ACTIVE BAR...奇爽...
若有需要,可与我联系...
QQ:37059658
feng_zhong_xia@yahoo.com.cn
见意不要用此种方法,还是用控件吧....要做专业的界面的话,最好用ACTIVE BAR...奇爽...
若有需要,可与我联系...
QQ:37059658
feng_zhong_xia@yahoo.com.cn
#7
自己在resize事件中写代码
#8
以下代碼已通過運行,但對picture控件無效,要另外控制。
Option Explicit
Dim record(), firstload(1) As Single
Dim obj As Variant
Dim i As Integer
Dim w As Variant
Private Sub Form_Activate()
If firstload(0) = 0 Then '原始值只記錄一次
firstload(0) = Form1.ScaleWidth
firstload(1) = Form1.ScaleHeight '一開始表單的大小
ReDim record(Form1.Controls.Count - 1, 5)
i = 0
For Each obj In Form1.Controls '記錄每個物件的資料
record(i, 0) = obj.Name
On Error Resume Next '避免某些物件沒有指定的屬性而錯誤
record(i, 1) = obj.Left
record(i, 2) = obj.Top
record(i, 3) = obj.Width
record(i, 4) = obj.Height
record(i, 5) = obj.FontSize
On Error GoTo 0 '取消錯誤處理
i = i + 1
Next obj
End If
End Sub
Private Sub Form_Resize()
If Form1.WindowState <> 1 And firstload(0) > 0 And firstload(1) > 0 Then
'重算物件的新位置
For obj = 0 To Form1.Controls.Count - 1
Set w = Controls(record(obj, 0))
On Error Resume Next
w.Left = record(obj, 1) / firstload(0) * Form1.ScaleWidth
w.Top = record(obj, 2) / firstload(1) * Form1.ScaleHeight
w.Width = record(obj, 3) / firstload(0) * Form1.ScaleWidth
w.Height = record(obj, 4) / firstload(1) * Form1.ScaleHeight
If Form1.ScaleWidth / firstload(0) < Form1.ScaleHeight / firstload(1) Then
w.FontSize = record(obj, 5) / firstload(0) * Form1.ScaleWidth
Else
w.FontSize = record(obj, 5) / firstload(1) * Form1.ScaleHeight
End If
On Error GoTo 0
Set w = Nothing
Next obj
End If
End Sub
Option Explicit
Dim record(), firstload(1) As Single
Dim obj As Variant
Dim i As Integer
Dim w As Variant
Private Sub Form_Activate()
If firstload(0) = 0 Then '原始值只記錄一次
firstload(0) = Form1.ScaleWidth
firstload(1) = Form1.ScaleHeight '一開始表單的大小
ReDim record(Form1.Controls.Count - 1, 5)
i = 0
For Each obj In Form1.Controls '記錄每個物件的資料
record(i, 0) = obj.Name
On Error Resume Next '避免某些物件沒有指定的屬性而錯誤
record(i, 1) = obj.Left
record(i, 2) = obj.Top
record(i, 3) = obj.Width
record(i, 4) = obj.Height
record(i, 5) = obj.FontSize
On Error GoTo 0 '取消錯誤處理
i = i + 1
Next obj
End If
End Sub
Private Sub Form_Resize()
If Form1.WindowState <> 1 And firstload(0) > 0 And firstload(1) > 0 Then
'重算物件的新位置
For obj = 0 To Form1.Controls.Count - 1
Set w = Controls(record(obj, 0))
On Error Resume Next
w.Left = record(obj, 1) / firstload(0) * Form1.ScaleWidth
w.Top = record(obj, 2) / firstload(1) * Form1.ScaleHeight
w.Width = record(obj, 3) / firstload(0) * Form1.ScaleWidth
w.Height = record(obj, 4) / firstload(1) * Form1.ScaleHeight
If Form1.ScaleWidth / firstload(0) < Form1.ScaleHeight / firstload(1) Then
w.FontSize = record(obj, 5) / firstload(0) * Form1.ScaleWidth
Else
w.FontSize = record(obj, 5) / firstload(1) * Form1.ScaleHeight
End If
On Error GoTo 0
Set w = Nothing
Next obj
End If
End Sub