Я добавил функцию перетаскивания в элемент управления изображением, который вложен в элемент управления Frame в моей пользовательской форме Excel.
Я пытаюсь предотвратить перемещение вложенного элемента управления изображениями за пределы родительского элемента управления.
Я думал об использовании оператора IF в событии BeforeDropOrPaste для выхода из всех запущенных макросов (например, событие mousemove), если позиция находится за пределами диапазона родительского элемента управления.
Как сравнить местоположение отбрасывания элемента управления с диапазоном родительского элемента управления?
Как я думаю, код будет выглядеть.
Private x_offset%, y_offset%
Private Sub Image1_BeforeDropOrPaste(ByVal Cancel As MSForms.ReturnBoolean, ByVal Action As MSForms.fmAction, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)
Dim X as Range
Dim Y as Range
Set x = parent control range
Set y = the drop location of the control this code is in
'If Y is outside or intersects X then
End
Else
End Sub
Private Sub Image1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
If Button = XlMouseButton.xlPrimaryButton Then
x_offset = X
y_offset = Y
End If
End Sub
Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, _
ByVal X As Single, ByVal Y As Single)
If Button = XlMouseButton.xlPrimaryButton Then
Image1.Left = Image1.Left + X - x_offset
Image1.Top = Image1.Top + Y - y_offset
End If
End Sub
Если местоположение вложенного элемента управления находится за пределами или пересекает диапазон родительского элемента управления, верните вложенный элемент управления в то место, где он находился до события MouseMove.
Редактировать - я нашел этот код, который использует функцию для возврата истинного значения, если управляющие объекты перекрываются. http://www.vbaexpress.com/forum/showthread.php?33829-Solved-finding-if-two-controls-overlap
Function Overlap(aCtrl As Object, bCtrl As Object) As Boolean
Dim hOverlap As Boolean, vOverlap As Boolean
hOverlap = (bCtrl.Left - aCtrl.Width < aCtrl.Left) And (aCtrl.Left < bCtrl.Left + bCtrl.Width)
vOverlap = (bCtrl.Top - aCtrl.Height < aCtrl.Top) And (aCtrl.Top < bCtrl.Top + bCtrl.Height)
Overlap = hOverlap And vOverlap
End Function
Как это может работать, например, когда элемент управления Frame называется «Frame1», а элемент управления Image называется «Image1»?