控件随窗体大小变化?

kyzh 2003-12-26 05:44:28
sstab控件里有两行选择,里面都有很多控件,我在Form_Load的时候改变控件的大小时,只能改变sstab控件第一个选择里的控件大小,当我选择第行时,里面的控件都不见了,页面都是空白,为什么?
...全文
35 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jornet 2003-12-26
  • 打赏
  • 举报
回复
在Private Sub Form_Resize()事件里做吧
jian_aa 2003-12-26
  • 打赏
  • 举报
回复
楼上的对,用个RESIZE32.OCX控件就搞掂了,我有要吗?
billpower 2003-12-26
  • 打赏
  • 举报
回复
我有个RESIZE32.OCX,直接放进FORM就行了,要的留EMAIL
kyzh 2003-12-26
  • 打赏
  • 举报
回复
我是用以下这种方法改变的:
Option Explicit
Public Xtwips As Integer, Ytwips As Integer
Public Xpixels As Integer, Ypixels As Integer
Type FRMSIZE
Height As Long
Width As Long
End Type
Public RePosForm As Boolean
Public DoResize As Boolean
Dim MyForm As FRMSIZE
Dim DesignX As Integer
Dim DesignY As Integer
Dim ScaleFactorX As Single, ScaleFactorY As Single
Sub Resize_For_Resolution(ByVal SFX As Single, ByVal SFY As Single, MyForm As Form)
Dim i As Integer
Dim SFFont As Single
SFFont = (SFX + SFY) / 2
On Error Resume Next
With MyForm
For i = 0 To .Count - 1
If TypeOf .Controls(i) Is ComboBox Then
.Controls(i).Left = .Controls(i).Left * SFX
.Controls(i).Top = .Controls(i).Top * SFY
.Controls(i).Width = .Controls(i).Width * SFX
Else
.Controls(i).Move .Controls(i).Left * SFX, _
.Controls(i).Top * SFY, _
.Controls(i).Width * SFX, _
.Controls(i).Height * SFY
End If
.Controls(i).FontSize = .Controls(i).FontSize * SFFont
Next i
If RePosForm Then
.Move .Left * SFX, .Top * SFY, .Width * SFX, .Height * SFY
End If
End With
End Sub

Public Sub FormResize(TheForm As Form)
Dim ScaleFactorX As Single, ScaleFactorY As Single
If Not DoResize Then
DoResize = True
Exit Sub
End If
RePosForm = False
ScaleFactorX = TheForm.Width / MyForm.Width
ScaleFactorY = TheForm.Height / MyForm.Height
Resize_For_Resolution ScaleFactorX, ScaleFactorY, TheForm
MyForm.Height = TheForm.Height
MyForm.Width = TheForm.Width
End Sub

Public Sub AdjustForm(TheForm As Form)
Dim Res As String ' Returns resolution of system
' Put the design time resolution in here
DesignX = 640
DesignY = 480
RePosForm = True
DoResize = False
Xtwips = Screen.TwipsPerPixelX
Ytwips = Screen.TwipsPerPixelY
Ypixels = Screen.Height / Ytwips
Xpixels = Screen.Width / Xtwips
ScaleFactorX = (Xpixels / DesignX)
ScaleFactorY = (Ypixels / DesignY)
TheForm.ScaleMode = 1
Resize_For_Resolution ScaleFactorX, ScaleFactorY, TheForm
Res = Str$(Xpixels) + " by " + Str$(Ypixels)
Debug.Print Res
MyForm.Height = TheForm.Height
MyForm.Width = TheForm.Width
End Sub

Private Sub Form_Load()
Call AdjustForm(Me)
End Sub

Private Sub Form_Resize()
Call FormResize(Me)
End Sub
其他控件都可以,就是sstab控件第二个选行里的控件不行
hxy2003 2003-12-26
  • 打赏
  • 举报
回复
有这样的控件下载的
daisy8675 2003-12-26
  • 打赏
  • 举报
回复
Dim a(), g(1) As Single
Dim t As Integer, dt As Integer
Private Sub Check1_Click()
Form_Resize
End Sub
Private Sub Command1_Click()
If t = 0 Then t = 0: dt = 100: Timer1.Enabled = True
End Sub

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: Timer1.Enabled = True
End If
End Sub

Private 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
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



你可以試下這個﹐但是我沒有在sstab.中測試
leolan 2003-12-26
  • 打赏
  • 举报
回复
我只知道用代碼來控制,呵呵
fox100 2003-12-26
  • 打赏
  • 举报
回复
有没有简单的方法:实现控件随Form的大小变化而变化啊(位置也相对变化)?
MichaelSoft 2003-12-26
  • 打赏
  • 举报
回复
原因是你改变大小之前没有设置Tab值。你必须这样:
sstab.tab=0
'处理第一页的控件大小
sstab.tab=1
'处理第二页的控件大小

1,451

社区成员

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

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