You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
310 lines
8.6 KiB
310 lines
8.6 KiB
VERSION 1.0 CLASS
|
|
BEGIN
|
|
MultiUse = -1 'True
|
|
Persistable = 0 'NotPersistable
|
|
DataBindingBehavior = 0 'vbNone
|
|
DataSourceBehavior = 0 'vbNone
|
|
MTSTransactionMode = 0 'NotAnMTSObject
|
|
END
|
|
Attribute VB_Name = "Sizer"
|
|
Attribute VB_GlobalNameSpace = False
|
|
Attribute VB_Creatable = True
|
|
Attribute VB_PredeclaredId = False
|
|
Attribute VB_Exposed = False
|
|
Option Explicit
|
|
|
|
'Usage:
|
|
'
|
|
'Private Sub Form_Activate()
|
|
' p_SetSizingInfo
|
|
'End Sub
|
|
'
|
|
'Private Sub Form_Resize()
|
|
' p_clsSizer.Resize
|
|
'End Sub
|
|
'
|
|
'Private Sub p_SetSizingInfo()
|
|
'
|
|
' ' treTaxonomy.Height - Me.Height = constant
|
|
' ' treTaxonomy.Top, Left and Width do not change
|
|
' p_clsSizer.AddControl treTaxonomy
|
|
' Set p_clsSizer.ReferenceControl(DIM_HEIGHT_E) = Me
|
|
' ' treTaxonmy.Width / Me.Width = constant
|
|
' Set p_clsSizer.ReferenceControl(DIM_WIDTH_E) = Me
|
|
' p_clsSizer.Operation(DIM_WIDTH_E) = OP_MULTIPLY_E
|
|
'
|
|
' ' cmdCreateGroup.Top - treTaxonomy.Bottom = constaant
|
|
' p_clsSizer.AddControl cmdCreateGroup
|
|
' Set p_clsSizer.ReferenceControl(DIM_TOP_E) = treTaxonomy
|
|
' p_clsSizer.ReferenceDimension(DIM_TOP_E) = DIM_BOTTOM_E
|
|
'
|
|
' ' cmdCreateLeaf.Top - cmdCreateGroup.Top = constant
|
|
' p_clsSizer.AddControl cmdCreateLeaf
|
|
' Set p_clsSizer.ReferenceControl(DIM_TOP_E) = cmdCreateGroup
|
|
'
|
|
' ' txtTitle.Left - lblTitle.Left = constant
|
|
' p_clsSizer.AddControl txtTitle
|
|
' Set p_clsSizer.ReferenceControl(DIM_LEFT_E) = lblTitle
|
|
' ' txtTitle.Right - Me.Width = constant
|
|
' ' Do not use Me.Right, since Me contains txtTitle.
|
|
' ' The containing control's Left and Top are to be ignored.
|
|
' ' The contained control assumes that the containing control's Left and Top are 0.
|
|
' Set p_clsSizer.ReferenceControl(DIM_RIGHT_E) = Me
|
|
' p_clsSizer.ReferenceDimension(DIM_RIGHT_E) = DIM_WIDTH_E
|
|
'
|
|
' ' cmdNavigateLink.Left - txtTitle.Right = constant
|
|
' p_clsSizer.AddControl cmdNavigateLink
|
|
' Set p_clsSizer.ReferenceControl(DIM_LEFT_E) = txtTitle
|
|
' p_clsSizer.ReferenceDimension(DIM_LEFT_E) = DIM_RIGHT_E
|
|
'
|
|
' ' chkServer.Left / fraSKU.Width = constant
|
|
' ' Here fraSKU is the containing control.
|
|
' ' Hence we use DIM_WIDTH_E instead of DIM_RIGHT_E.
|
|
' p_clsSizer.AddControl chkServer
|
|
' Set p_clsSizer.ReferenceControl(DIM_LEFT_E) = fraSKU
|
|
' p_clsSizer.ReferenceDimension(DIM_LEFT_E) = DIM_WIDTH_E
|
|
' p_clsSizer.Operation(DIM_LEFT_E) = OP_MULTIPLY_E
|
|
'
|
|
'End Sub
|
|
|
|
Private Const COUNT_CHUNK_C As Long = 10
|
|
|
|
Private Type RESTRICTION_S
|
|
ReferenceControl As Object
|
|
ReferenceDimension As DIMENSION_E
|
|
Operation As OPERATION_E
|
|
Amount As Single
|
|
End Type
|
|
|
|
Private Type SIZING_INFO_S
|
|
Control As Object
|
|
Restriction(DIM_MAX_E) As RESTRICTION_S
|
|
End Type
|
|
|
|
' We ignore index 0 and go from 1 to p_Count
|
|
Private p_SizingInfo() As SIZING_INFO_S
|
|
Private p_Count As Long
|
|
Private p_Index As Long
|
|
|
|
Private Sub Class_Initialize()
|
|
|
|
p_Count = COUNT_CHUNK_C
|
|
ReDim p_SizingInfo(p_Count)
|
|
p_Index = 1
|
|
|
|
End Sub
|
|
|
|
Public Sub AddControl(ByVal i_ctr As Object)
|
|
|
|
Dim intIndex As Long
|
|
|
|
If (Not p_SizingInfo(p_Index).Control Is Nothing) Then
|
|
p_MoveNext
|
|
End If
|
|
|
|
With p_SizingInfo(p_Index)
|
|
Set .Control = i_ctr
|
|
For intIndex = DIM_MIN_E To DIM_MAX_E
|
|
With .Restriction(intIndex)
|
|
Set .ReferenceControl = Nothing
|
|
End With
|
|
Next
|
|
End With
|
|
|
|
End Sub
|
|
|
|
Public Property Set ReferenceControl(ByVal i_dim As DIMENSION_E, ByVal i_ctr As Object)
|
|
|
|
Dim ctr As Object
|
|
|
|
With p_SizingInfo(p_Index)
|
|
Set ctr = .Control
|
|
With .Restriction(i_dim)
|
|
Set .ReferenceControl = i_ctr
|
|
.ReferenceDimension = i_dim
|
|
.Operation = OP_ADD_E
|
|
.Amount = p_CalculateAmount(ctr, i_ctr, i_dim, i_dim, OP_ADD_E)
|
|
End With
|
|
End With
|
|
|
|
End Property
|
|
|
|
Public Property Let ReferenceDimension( _
|
|
ByVal i_dim As DIMENSION_E, _
|
|
ByVal i_dimRef As DIMENSION_E _
|
|
)
|
|
|
|
Dim ctr As Object
|
|
|
|
With p_SizingInfo(p_Index)
|
|
Set ctr = .Control
|
|
With .Restriction(i_dim)
|
|
.ReferenceDimension = i_dimRef
|
|
.Amount = p_CalculateAmount(ctr, .ReferenceControl, i_dim, i_dimRef, .Operation)
|
|
End With
|
|
End With
|
|
|
|
End Property
|
|
|
|
Public Property Let Operation(ByVal i_dim As DIMENSION_E, ByVal i_op As OPERATION_E)
|
|
|
|
Dim ctr As Object
|
|
|
|
With p_SizingInfo(p_Index)
|
|
Set ctr = .Control
|
|
With .Restriction(i_dim)
|
|
.Operation = i_op
|
|
.Amount = p_CalculateAmount(ctr, .ReferenceControl, _
|
|
i_dim, .ReferenceDimension, i_op)
|
|
End With
|
|
End With
|
|
|
|
End Property
|
|
|
|
Public Property Let Amount(ByVal i_dim As DIMENSION_E, ByVal i_sngAmount As Single)
|
|
|
|
p_SizingInfo(p_Index).Restriction(i_dim).Amount = i_sngAmount
|
|
|
|
End Property
|
|
|
|
Public Sub Resize()
|
|
|
|
Dim intIndex As Long
|
|
Dim dimension As DIMENSION_E
|
|
Dim ctr As Object
|
|
|
|
For intIndex = 1 To p_Count
|
|
With p_SizingInfo(intIndex)
|
|
Set ctr = .Control
|
|
For dimension = DIM_MIN_E To DIM_MAX_E
|
|
With .Restriction(dimension)
|
|
p_SetDimension ctr, .ReferenceControl, dimension, _
|
|
.ReferenceDimension, .Operation, .Amount
|
|
End With
|
|
Next
|
|
End With
|
|
Next
|
|
|
|
End Sub
|
|
|
|
Private Sub p_MoveNext()
|
|
|
|
If (p_Index = p_Count) Then
|
|
p_Count = p_Count + COUNT_CHUNK_C
|
|
ReDim Preserve p_SizingInfo(p_Count)
|
|
End If
|
|
|
|
p_Index = p_Index + 1
|
|
|
|
End Sub
|
|
|
|
Private Function p_CalculateAmount( _
|
|
ByVal i_ctr As Object, _
|
|
ByVal i_ctrRef As Object, _
|
|
ByVal i_dim As DIMENSION_E, _
|
|
ByVal i_dimRef As DIMENSION_E, _
|
|
ByVal i_op As OPERATION_E _
|
|
) As Single
|
|
|
|
Dim sngAmount As Single
|
|
Dim sngAmountRef As Single
|
|
|
|
sngAmount = p_GetDimensionAmount(i_ctr, i_dim)
|
|
sngAmountRef = p_GetDimensionAmount(i_ctrRef, i_dimRef)
|
|
|
|
If (i_op = OP_ADD_E) Then
|
|
p_CalculateAmount = sngAmount - sngAmountRef
|
|
ElseIf (i_op = OP_MULTIPLY_E) Then
|
|
p_CalculateAmount = sngAmount / sngAmountRef
|
|
End If
|
|
|
|
End Function
|
|
|
|
Private Function p_GetDimensionAmount( _
|
|
ByVal i_ctrRef As Object, _
|
|
ByVal i_dimRef As DIMENSION_E _
|
|
) As Single
|
|
|
|
Select Case i_dimRef
|
|
Case DIM_TOP_E
|
|
p_GetDimensionAmount = i_ctrRef.Top
|
|
Case DIM_LEFT_E
|
|
p_GetDimensionAmount = i_ctrRef.Left
|
|
Case DIM_HEIGHT_E
|
|
p_GetDimensionAmount = i_ctrRef.Height
|
|
Case DIM_WIDTH_E
|
|
p_GetDimensionAmount = i_ctrRef.Width
|
|
Case DIM_BOTTOM_E
|
|
p_GetDimensionAmount = i_ctrRef.Top + i_ctrRef.Height
|
|
Case DIM_RIGHT_E
|
|
p_GetDimensionAmount = i_ctrRef.Left + i_ctrRef.Width
|
|
End Select
|
|
|
|
End Function
|
|
|
|
Private Sub p_SetDimension( _
|
|
ByVal i_ctr As Object, _
|
|
ByVal i_ctrRef As Object, _
|
|
ByVal i_dim As DIMENSION_E, _
|
|
ByVal i_dimRef As DIMENSION_E, _
|
|
ByVal i_op As OPERATION_E, _
|
|
ByVal i_sngAmount As Single _
|
|
)
|
|
Dim sngAmountRef As Single
|
|
Dim sngAmountNew As Single
|
|
|
|
If (i_ctrRef Is Nothing) Then
|
|
Exit Sub
|
|
End If
|
|
|
|
sngAmountRef = p_GetDimensionAmount(i_ctrRef, i_dimRef)
|
|
|
|
If (i_op = OP_ADD_E) Then
|
|
|
|
sngAmountNew = p_Positive(sngAmountRef + i_sngAmount)
|
|
|
|
Select Case i_dim
|
|
Case DIM_TOP_E
|
|
i_ctr.Top = sngAmountNew
|
|
Case DIM_LEFT_E
|
|
i_ctr.Left = sngAmountNew
|
|
Case DIM_HEIGHT_E
|
|
i_ctr.Height = sngAmountNew
|
|
Case DIM_WIDTH_E
|
|
i_ctr.Width = sngAmountNew
|
|
Case DIM_BOTTOM_E
|
|
i_ctr.Height = p_Positive(sngAmountNew - i_ctr.Top)
|
|
Case DIM_RIGHT_E
|
|
i_ctr.Width = p_Positive(sngAmountNew - i_ctr.Left)
|
|
End Select
|
|
ElseIf (i_op = OP_MULTIPLY_E) Then
|
|
|
|
sngAmountNew = p_Positive(sngAmountRef * i_sngAmount)
|
|
|
|
Select Case i_dim
|
|
Case DIM_TOP_E
|
|
i_ctr.Top = sngAmountNew
|
|
Case DIM_LEFT_E
|
|
i_ctr.Left = sngAmountNew
|
|
Case DIM_HEIGHT_E
|
|
i_ctr.Height = sngAmountNew
|
|
Case DIM_WIDTH_E
|
|
i_ctr.Width = sngAmountNew
|
|
Case DIM_BOTTOM_E
|
|
i_ctr.Height = p_Positive(sngAmountNew - i_ctr.Top)
|
|
Case DIM_RIGHT_E
|
|
i_ctr.Width = p_Positive(sngAmountNew - i_ctr.Left)
|
|
End Select
|
|
End If
|
|
|
|
End Sub
|
|
|
|
Private Function p_Positive(i_sng As Single) As Single
|
|
|
|
If (i_sng < 0) Then
|
|
p_Positive = 0
|
|
Else
|
|
p_Positive = i_sng
|
|
End If
|
|
|
|
End Function
|