如何让软件界面的布局随着显示器分辨率的变化而自动变化!

水族杰纶 2010-11-09 04:31:27
RT:
找到这几个过程
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
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 Double
If FormOldWidth = 0 Then
Exit Sub
End If
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 0
End Sub
但是有缺点就是组合框不能自动适用!
...全文
910 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongsedigua 2011-12-26
  • 打赏
  • 举报
回复
有没有C#的啊?
zdingyun 2010-11-10
  • 打赏
  • 举报
回复
关注此帖.
水族杰纶 2010-11-10
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lxq19851204 的回复:]
水哥,最近押宝战况如何.......
[/Quote]
输的一塌糊涂
水族杰纶 2010-11-10
  • 打赏
  • 举报
回复
谢谢楼上各位大大
你们太热情了
呵呵
我好好看看你们的代码
dbcontrols 2010-11-10
  • 打赏
  • 举报
回复
"针对不同的分辨率"谁能预料下一代显示器的分辨率是多少?

[Quote=引用 26 楼 veron_04 的回复:]
个人觉得,针对不同的分辨率加载时设置各个控件的位置和大小,这个办法虽然麻烦些,但绝对有效。只需要在加载前判断分辨率即可。
[/Quote]
bcrun 2010-11-10
  • 打赏
  • 举报
回复
其实比较而言,随分辨率变化布局还算小事,随系统字体大小变化才算麻烦事,君不见,很多朋友就是受困于这个,一边使用着1920像素的高分辨率显示器,一边系统字体还使用的是96dpi的小字体,因为不少程序不是这个字体就显示很不正常.
咸清 2010-11-09
  • 打赏
  • 举报
回复
学习了~~
rkdrc 2010-11-09
  • 打赏
  • 举报
回复
貌似没有完美解决方案
叶子 2010-11-09
  • 打赏
  • 举报
回复
VB6.0 不熟悉,友情up
lxq19851204 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 veron_04 的回复:]
个人觉得,针对不同的分辨率加载时设置各个控件的位置和大小,这个办法虽然麻烦些,但绝对有效。只需要在加载前判断分辨率即可。
[/Quote]
+1
贝隆 2010-11-09
  • 打赏
  • 举报
回复
个人觉得,针对不同的分辨率加载时设置各个控件的位置和大小,这个办法虽然麻烦些,但绝对有效。只需要在加载前判断分辨率即可。
cbm6666 2010-11-09
  • 打赏
  • 举报
回复
这个题目问的有点别扭, 应该要问窗体内部控件自适应窗体大小, 因为分辨率变化, 只是像素颗粒大小的变化,人眼感觉大小不同, 其实尺寸是完全一样的


Dim FrmW!, FrmH!, RatioX!, RatioY!
Private Sub Form_Load()
FrmW = Me.Width: FrmH = Me.Height
End Sub

Private Sub Form_Resize()
Dim MyCon As Object
RatioX = Me.Width / FrmW: RatioY = Me.Height / FrmH
For Each MyCon In Me.Controls
With MyCon
.Left = Int(.Left * RatioX)
.Top = Int(.Top * RatioY)
.Width = Int(.Width * RatioX)
If Not TypeOf MyCon Is ComboBox And Not TypeOf MyCon Is DriveListBox Then .Height = Int(.Height * RatioY)
End With
Next MyCon
FrmW = Me.Width: FrmH = Me.Height
End Sub

jhone99 2010-11-09
  • 打赏
  • 举报
回复
这个是自动缩放,和lz的有些区别
jhone99 2010-11-09
  • 打赏
  • 举报
回复
参考一下,看是否有启发


Option Explicit
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
If TypeOf Obj Is ComboBox Then
Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.FontSize & " "
ElseIf TypeOf Obj Is CommandButton Then
Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " " & Obj.FontSize & " "
ElseIf TypeOf Obj Is Line Then
Obj.Tag = Obj.X1 & " " & Obj.X2 & " " & Obj.Y1 & " " & Obj.Y2 & " " & Obj.BorderWidth & " "
Else
Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " "

End If
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 Double
ScaleX = FormName.ScaleWidth / FormOldWidth '保存窗体宽度缩放比例
ScaleY = FormName.ScaleHeight / FormOldHeight '保存窗体高度缩放比例
On Error Resume Next
For Each Obj In FormName
StartPos = 1
For i = 0 To 5
'读取控件的原始位置与大小
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
'根据控件的原始位置及窗体改变大小的比例对控件重新定位与改变大小
Next i

If TypeOf Obj Is ComboBox Then
Obj.FontSize = Pos(3) * ScaleY
Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX
ElseIf TypeOf Obj Is CommandButton Then
Obj.FontSize = Pos(4) * ScaleY
Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY
ElseIf TypeOf Obj Is Line Then
Obj.X1 = Pos(0) * ScaleX
Obj.X2 = (Pos(1) - Pos(0)) * ScaleX + Obj.X1
Obj.Y1 = Pos(2) * ScaleY
Obj.Y2 = (Pos(3) - Pos(2)) * ScaleY + Obj.Y1
Obj.BorderWidth = Pos(4) * Sqr(ScaleX * ScaleX + ScaleY * ScaleY)
Else
Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY
End If
Next Obj
On Error GoTo 0
End Sub

Private Sub Form_Initialize()
Call ResizeInit(Me)
End Sub

Private Sub Form_Resize()
Call ResizeForm(Me)
End Sub


venice888 2010-11-09
  • 打赏
  • 举报
回复
这个有兴趣。先顶再看
dbcontrols 2010-11-09
  • 打赏
  • 举报
回复
各位,友情提示,这是技术贴,别扯淡。
lxq19851204 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 dbcontrols 的回复:]
你把我当做什么人了?我能干那缺德事?


引用 18 楼 sysdzw 的回复:
引用 15 楼 dbcontrols 的回复:

不懂阁下在说啥
我说的推荐是给LZ推荐了篇文章,点击能打开的

引用 13 楼 sysdzw 的回复:
引用 9 楼 dbcontrols 的回复:

推荐
本来还蓝色高亮的,现在都取消了,还推荐呢。。
我以为你说让版主推荐的呢。.
[/Quote]
dbcontrols是大胡子吗?
dbcontrols 2010-11-09
  • 打赏
  • 举报
回复
你把我当做什么人了?我能干那缺德事?

[Quote=引用 18 楼 sysdzw 的回复:]
引用 15 楼 dbcontrols 的回复:

不懂阁下在说啥
我说的推荐是给LZ推荐了篇文章,点击能打开的

引用 13 楼 sysdzw 的回复:
引用 9 楼 dbcontrols 的回复:

推荐
本来还蓝色高亮的,现在都取消了,还推荐呢。。
我以为你说让版主推荐的呢。.
[/Quote]
无·法 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 dbcontrols 的回复:]

不懂阁下在说啥
我说的推荐是给LZ推荐了篇文章,点击能打开的

引用 13 楼 sysdzw 的回复:
引用 9 楼 dbcontrols 的回复:

推荐
本来还蓝色高亮的,现在都取消了,还推荐呢。。
[/Quote]我以为你说让版主推荐的呢。.
lxq19851204 2010-11-09
  • 打赏
  • 举报
回复
水哥,最近押宝战况如何.......
加载更多回复(16)

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧