Изменить размер списка с помощью пользовательской формы - PullRequest
0 голосов
/ 15 января 2020

У меня есть этот код для изменения размера пользовательской формы sameCustomerForm окно:

Private Declare Function GetForegroundWindow Lib "User32.dll" () As Long

Private Declare Function GetWindowLong _
  Lib "User32.dll" Alias "GetWindowLongA" _
    (ByVal hWnd As Long, _
     ByVal nIndex As Long) _
  As Long

Private Declare Function SetWindowLong _
  Lib "User32.dll" Alias "SetWindowLongA" _
    (ByVal hWnd As Long, _
     ByVal nIndex As Long, _
     ByVal dwNewLong As Long) _
  As Long

Private Const WS_THICKFRAME As Long = &H40000
Private Const GWL_STYLE As Long = -16

Public Sub FormResizable()

Dim lStyle As Long
Dim hWnd As Long
Dim RetVal

hWnd = GetForegroundWindow

lStyle = GetWindowLong(hWnd, GWL_STYLE) Or WS_THICKFRAME
RetVal = SetWindowLong(hWnd, GWL_STYLE, lStyle)

End Sub

В пользовательской форме sameCustomerForm код:

Private Sub UserForm_Activate()
    Call FormResizable
End Sub

Тогда у меня есть список lstSelector в пользовательской форме sameCustomerForm. Я хотел бы прикрепить lstSelector к сторонам пользовательской формы, как это можно сделать в Visual Studio при разработке приложения WinForms с привязкой объектов к сторонам формы.

Есть какие-нибудь идеи, как этого можно достичь в пользовательской форме Excel?


РЕДАКТИРОВАТЬ:

Это почти работает. Теперь все меняется в пропорциях, кроме дна. Я пропускаю нижнюю полосу прокрутки в окне изменения размера, если .Height = sameCustomerForm.Height / 1 и .Height = sameCustomerForm.Height / 2 нижняя полоса прокрутки слишком высокая. Возникли проблемы с прилипанием дна к низу ...

Private Sub UserForm_Resize()

With sameCustomerForm.lstSelector
    .Width = sameCustomerForm.Width - 12
    .Height = sameCustomerForm.Height / 2
    .Top = 54
    .Left = 0
End With

End Sub

EDIT2:

Этот сделал свое дело:

Private Sub UserForm_Resize()

With sameCustomerForm.lstSelector
    .Width = sameCustomerForm.Width - 12
    .Height = sameCustomerForm.InsideHeight - 54
    .Top = 54
    .Left = 0
End With

End Sub

1 Ответ

1 голос
/ 15 января 2020

Вы должны использовать свои метрики пользовательской формы для достижения этого.
Ниже приведен пример, который использует кнопки для закрепления списка по сторонам:
enter image description here

Обновление
Рефакторинг кода для использования свойств InsideHeight и InsideWidth UserForms.

Вот код кнопок:

Private Sub bottomButton_Click()
' dock bottom
With myForm.lstSelector
    .Width = myForm.InsideWidth
    .Height = myForm.InsideHeight / 3
    .Top = myForm.InsideHeight - .Height
    .Left = 0
End With
End Sub

Private Sub leftButton_Click()
' dock left
With myForm.lstSelector
    .Width = myForm.InsideWidth / 3 ' just for example
    .Top = 0
    .Left = 0
    .Height = myForm.InsideHeight
End With
End Sub

Private Sub rightButton_Click()
' dock right
With myForm.lstSelector
    .Width = myForm.InsideWidth / 3 ' just for example
    .Top = 0
    .Left = myForm.InsideWidth - .Width
    .Height = myForm.InsideHeight
End With

End Sub

Private Sub stickButton_Click()
' stick
With myForm.lstSelector
    .Width = myForm.InsideWidth ' just for example
    .Top = 0
    .Left = 0
    .Height = myForm.InsideHeight
End With

End Sub

Private Sub topButton_Click()
'  dock up
With myForm.lstSelector
    .Width = myForm.InsideWidth ' just for example
    .Top = 0
    .Left = 0
    .Height = myForm.InsideHeight / 3
End With

End Sub

Это общее представление о том, как состыковать его с разных сторон. В случае, если вы реализовали изменяемую пользовательскую форму с изменяемыми размерами (вручную или с помощью рабочего процесса) - идея останется прежней, но вам следует подумать о том, чтобы поместить эти обработчики в событие UserForm_Resize.

В случае, если вам нужно привязать его где-то еще - вам придется вычислять пропорции позиций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...