在某form中有若干控件组合,本意想在函数Form_Load()和Form_Resize()中使用move方法使得控件移到合适的位置,这样界面比较美观。但出现如下问题,请教各位高手原因。1、
根据控件间的关系数据进行移动时,运行后的界面总是很混乱,并没有像预想的那样排列整齐。下面是相关代码: famctl.Move picCtl.Width + 50, tlbCtl.Height, Me.ScaleWidth - picCtl.Width - 50, Me.ScaleHeight - tlbCtl.Height
tabctl.Move picCtl.Width + 50, tlbCtl.Height, famctl.Width, famctl.Height - 1500
famcx.Move picCtl.Width + 50, tlbCtl.Height + tabctl.Height, famctl.Width, 1500其中famctl为包含很多控件的Frame;tlbCtl为famctl上方的Toolbar;picCtl为famctl左边的PictureBox;tabctl为famctl内部的TabStrip;
famcx为famctl内部且在tabctl下方的Frame。这三个语句在函数Form_Load()和Form_Resize()中都有2、
上述方式无效后,改为根据固定坐标移动,水平方向显示没问题了,但是垂直方向的显示和1、一样,没有任何变化
famctl.Move 800, 0, Me.ScaleWidth - picCtl.Width - 50, Me.ScaleHeight - tlbCtl.Height
tabctl.Move 800, 0, famctl.Width - 50, famctl.Height - 1500
famcx.Move 800, tabctl.Height, famctl.Width, 1500
如何才能解决此问题,使得界面显示正常?
根据控件间的关系数据进行移动时,运行后的界面总是很混乱,并没有像预想的那样排列整齐。下面是相关代码: famctl.Move picCtl.Width + 50, tlbCtl.Height, Me.ScaleWidth - picCtl.Width - 50, Me.ScaleHeight - tlbCtl.Height
tabctl.Move picCtl.Width + 50, tlbCtl.Height, famctl.Width, famctl.Height - 1500
famcx.Move picCtl.Width + 50, tlbCtl.Height + tabctl.Height, famctl.Width, 1500其中famctl为包含很多控件的Frame;tlbCtl为famctl上方的Toolbar;picCtl为famctl左边的PictureBox;tabctl为famctl内部的TabStrip;
famcx为famctl内部且在tabctl下方的Frame。这三个语句在函数Form_Load()和Form_Resize()中都有2、
上述方式无效后,改为根据固定坐标移动,水平方向显示没问题了,但是垂直方向的显示和1、一样,没有任何变化
famctl.Move 800, 0, Me.ScaleWidth - picCtl.Width - 50, Me.ScaleHeight - tlbCtl.Height
tabctl.Move 800, 0, famctl.Width - 50, famctl.Height - 1500
famcx.Move 800, tabctl.Height, famctl.Width, 1500
如何才能解决此问题,使得界面显示正常?
解决方案 »
- 求助vb ListView控件的Tag 属性怎么用呢
- 注册表键值判断的问题
- SHELL命令可以调用DOS的内部命令吗?
- sendkeys()的送分问题
- GetFileVersionInfoSizeAPI函数的一个疑问???
- 如何在datareport里连接加密的access数据库?
- 诚恳地想问一个问题,可能对我的影响比较大。希望可以听听你们的意见!!!!
- 超难问题:用vb如何作组态软件,类似于组态王,SuperCX的!来者有分!
- 气愤!!!!!!!!!!!!>>>>>>>>>>>>>ggyy!!!<<对ggyy败坏偶名声,偶提出强烈抗议~~~
- 一个访问数据库的问题
- 谁知道unedisoat软件怎么使用?
- varchar 转换问题
唯一要注意的是最下方的有开始的任务栏占了一定大小,有时和想的不一样,试试隐藏任务栏
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
private
procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMSysCommand;
begin
if (Msg.CmdType = SC_MAXIMIZE) then
msg.Msg:=WM_NULL;
inherited;
end;end.
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 LongFunction ActualPos(plLeft As Long) As Long If plLeft < 0 Then
ActualPos = plLeft + 75000
Else
ActualPos = plLeft
End IfEnd FunctionFunction 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 FunctionFunction FindControl(inControl As Control, inName As String) As Long Dim i As Long
FindControl = -1 For 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 i
End FunctionFunction 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 FunctionFunction 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 FunctionFunction 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 FunctionPublic 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 SubPublic 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 SubPublic 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 If
End SubPublic Sub Resize_ALL(Form_Name As Form) Dim OBJ As Object
For Each OBJ In Form_Name
ResizeControl OBJ, Form_Name
Next OBJ
End SubPublic Sub DragForm(frm As Form) On Local Error Resume Next
Call ReleaseCapture
Call SendMessage(frm.hwnd, WM_NCLBUTTONDOWN, 2, 0)End Sub
'***************下面是窗体的调用
Private Sub Form_Resize()
Dim H, i As Integer
On Error Resume Next
Resize_ALL Me '
End Sub