3

フォームのサイズが変更されたときにコントロールのサイズ変更と移動を処理するコードを作成しようとしています。

私のアプローチは、コントロール名とアンカー ディメンション (lstAccounts_Height など) であるキーを使用して、アンカーする必要がある各コントロール ディメンション (つまり、上/左/幅/高さ) の Dictionary オブジェクトを作成し、これらをフォーム レベルに追加することです。コレクション。フォームResizeイベントで Collection が繰り返され、必要に応じて各 Control が調整されます。

コントロールを追加するルーチン:

Private Sub AddFormResizeControl(ControlName As String, _
                                 Dimension As String)

Dim strKey                      As String
Dim sngValue                    As Single
Dim dictCtrl                    As Dictionary

    strKey = ControlName & "_" & Dimension

    Select Case Dimension
        Case "Left": sngValue = Controls(ControlName).Left
        Case "Top": sngValue = Controls(ControlName).Top
        Case "Width": sngValue = Controls(ControlName).Width
        Case "Height": sngValue = Controls(ControlName).Height
    End Select

    Set dictCtrl = New Dictionary
    dictCtrl.Add strKey, sngValue

    If colResizeControls Is Nothing Then _
        Set colResizeControls = New Collection
    colResizeControls.Add dictCtrl, strKey

End Sub

Initializeイベントにコントロールを追加します。

AddFormResizeControl "lst_AccountSelection", "Width"
AddFormResizeControl "lst_AccountSelection", "Height"
AddFormResizeControl "cmd_Cancel", "Left"
AddFormResizeControl "cmd_Cancel", "Top"
AddFormResizeControl "cmd_Confirm", "Left"
AddFormResizeControl "cmd_Confirm", "Top"

そしてResizeイベント:

Private Sub UserForm_Resize()

Dim sngHeightAdjust             As Single
Dim sngWidthAdjust              As Single

Dim dict                        As Dictionary
Dim strCtrl                     As String

Dim ctrl                        As Control
Dim strDimension                As String

    If Me.Width < sngFormMinimumWidth Then Me.Width = sngFormMinimumWidth
    If Me.Height < sngFormMinimumHeight Then Me.Height = sngFormMinimumHeight

    sngHeightAdjust = (Me.Height - 4.5) - sngFormMinimumHeight
    sngWidthAdjust = (Me.Width - 4.5) - sngFormMinimumWidth

    If Not colResizeControls Is Nothing Then
        For Each dict In colResizeControls
            strCtrl = dict.Keys(0)
            Set ctrl = Controls(Left(strCtrl, InStrRev(strCtrl, "_") - 1))
            If Right(strCtrl, 5) = "_Left" Then
                ctrl.Left = dict.Item(strCtrl) + sngWidthAdjust
            ElseIf Right(strCtrl, 4) = "_Top" Then
                ctrl.Top = dict.Item(strCtrl) + sngHeightAdjust
            ElseIf Right(strCtrl, 6) = "_Width" Then
                ctrl.Width = dict.Item(strCtrl) + sngWidthAdjust
            ElseIf Right(strCtrl, 7) = "_Height" Then
                ctrl.Height = dict.Item(strCtrl) + sngHeightAdjust
            End If
        Next dict
    End If

End Sub

私が直面している問題は、最初の移動イベントに小さな「ジャンプ」があり、その結果、実行時のコントロールが設計時のように完全に調整されていないことです。返されたフォームの高さと幅を 4.5 ずつ変更することで、この効果に対抗しようとしましたが、これは役に立ちます。

sngFormMinimumHeightとは、イベントsngFormMinimumWidthの開始幅/高さまたはフォームとして設定されており、チップ ピアソンのコードを使用してフォームをサイズ変更可能にしています。Initialize

フォームには調整が必要なある種の境界線があると思います(したがって、4.5秒が問題を助けます)-調整する必要がある値を誰か説明できますか?

解決BonCodigo から提供されたリンクのおかげで、問題は解決さMe.HeightれましMe.Widthた。4.5の調整が不要になり、「ジャンプ」がなくなりましたMe.InsideHeightMe.InsideWidth

4

1 に答える 1

2

との両方AnchorDockプロパティを変更しようとするcontrolsと、それらparent containers(おそらくパネル)で自動的にサイズが変更されます。

于 2013-01-22T12:21:40.273 に答える