📄 msgdocking.bas
字号:
Private Sub DockFormRect(ByVal hwnd As Long, ByVal Mode As SnapFormMode, GivenRect As RECT, Optional SizingEdge As Long, Optional MouseX As Long, Optional MouseY As Long)
Dim p As POINTAPI
Dim i As Integer, diffX As Integer, diffY As Integer, diffWnd As Long
Dim tmpRect As RECT, W As Integer, H As Integer, frmRect As RECT
Dim XPos As Integer, YPos As Integer
Dim tmpXPos As Integer, tmpYPos As Integer
Dim tmpMouseX As Long, tmpMouseY As Long
Dim FoundX As Boolean, FoundY As Boolean
diffX = SnapWidth
diffY = SnapWidth
'Copy the original Rect.
tmpRect = GivenRect
frmRect = GivenRect
'Do some calculations to correct the Window Position while Moving
If Mode = Moving Then
GetCursorPos p
If SnappedX Then
tmpMouseX = p.X - tmpRect.Left
OffsetRect tmpRect, tmpMouseX - MouseX, 0
OffsetRect GivenRect, tmpMouseX - MouseX, 0
Else
MouseX = p.X - tmpRect.Left
End If
If SnappedY Then
tmpMouseY = p.Y - tmpRect.Top
OffsetRect tmpRect, 0, tmpMouseY - MouseY
OffsetRect GivenRect, 0, tmpMouseY - MouseY
Else
MouseY = p.Y - tmpRect.Top
End If
End If
W = tmpRect.Right - tmpRect.Left
H = tmpRect.Bottom - tmpRect.Top
'that's the hard part!
If Mode = Moving Then
For i = 0 To UBound(Rects)
If (tmpRect.Left >= (Rects(i).Left - SnapWidth) And _
tmpRect.Left <= (Rects(i).Left + SnapWidth)) And _
((tmpRect.Top - SnapWidth) < Rects(i).Bottom And _
(tmpRect.Bottom + SnapWidth) > Rects(i).Top) And _
Abs(tmpRect.Left - Rects(i).Left) < diffX _
Then
GivenRect.Left = Rects(i).Left
GivenRect.Right = GivenRect.Left + W
diffX = Abs(tmpRect.Left - Rects(i).Left)
FoundX = True
ElseIf i > 0 And (tmpRect.Left >= (Rects(i).Right - SnapWidth) And _
tmpRect.Left <= (Rects(i).Right + SnapWidth)) And _
((tmpRect.Top - SnapWidth) < Rects(i).Bottom And _
(tmpRect.Bottom + SnapWidth) > Rects(i).Top) And _
Abs(tmpRect.Left - Rects(i).Right) < diffX _
Then
GivenRect.Left = Rects(i).Right
GivenRect.Right = GivenRect.Left + W
diffX = Abs(tmpRect.Left - Rects(i).Right)
FoundX = True
ElseIf i > 0 And (tmpRect.Right >= (Rects(i).Left - SnapWidth) And _
tmpRect.Right <= (Rects(i).Left + SnapWidth)) And _
((tmpRect.Top - SnapWidth) < Rects(i).Bottom And _
(tmpRect.Bottom + SnapWidth) > Rects(i).Top) And _
Abs(tmpRect.Right - Rects(i).Left) < diffX _
Then
GivenRect.Right = Rects(i).Left
GivenRect.Left = GivenRect.Right - W
diffX = Abs(tmpRect.Right - Rects(i).Left)
FoundX = True
ElseIf (tmpRect.Right >= (Rects(i).Right - SnapWidth) And _
tmpRect.Right <= (Rects(i).Right + SnapWidth)) And _
((tmpRect.Top - SnapWidth) < Rects(i).Bottom And _
(tmpRect.Bottom + SnapWidth) > Rects(i).Top) And _
Abs(tmpRect.Right - Rects(i).Right) < diffX _
Then
GivenRect.Right = Rects(i).Right
GivenRect.Left = GivenRect.Right - W
diffX = Abs(tmpRect.Right - Rects(i).Right)
FoundX = True
End If
'Y
If (tmpRect.Top >= (Rects(i).Top - SnapWidth) And _
tmpRect.Top <= (Rects(i).Top + SnapWidth)) And _
((tmpRect.Left - SnapWidth) < Rects(i).Right And _
(tmpRect.Right + SnapWidth) > Rects(i).Left) And _
Abs(tmpRect.Top - Rects(i).Top) < diffY _
Then
GivenRect.Top = Rects(i).Top
GivenRect.Bottom = GivenRect.Top + H
diffY = Abs(tmpRect.Top - Rects(i).Top)
FoundY = True
ElseIf i > 0 And (tmpRect.Top >= (Rects(i).Bottom - SnapWidth) And _
tmpRect.Top <= (Rects(i).Bottom + SnapWidth)) And _
((tmpRect.Left - SnapWidth) < Rects(i).Right And _
(tmpRect.Right + SnapWidth) > Rects(i).Left) And _
Abs(tmpRect.Top - Rects(i).Bottom) < diffY _
Then
GivenRect.Top = Rects(i).Bottom
GivenRect.Bottom = GivenRect.Top + H
diffY = Abs(tmpRect.Top - Rects(i).Bottom)
FoundY = True
ElseIf i > 0 And (tmpRect.Bottom >= (Rects(i).Top - SnapWidth) And _
tmpRect.Bottom <= (Rects(i).Top + SnapWidth)) And _
((tmpRect.Left - SnapWidth) < Rects(i).Right And _
(tmpRect.Right + SnapWidth) > Rects(i).Left) And _
Abs(tmpRect.Bottom - Rects(i).Top) < diffY _
Then
GivenRect.Bottom = Rects(i).Top
GivenRect.Top = GivenRect.Bottom - H
diffY = Abs(tmpRect.Bottom - Rects(i).Top)
FoundY = True
ElseIf (tmpRect.Bottom >= (Rects(i).Bottom - SnapWidth) And _
tmpRect.Bottom <= (Rects(i).Bottom + SnapWidth)) And _
((tmpRect.Left - SnapWidth) < Rects(i).Right And _
(tmpRect.Right + SnapWidth) > Rects(i).Left) And _
Abs(tmpRect.Bottom - Rects(i).Bottom) < diffY _
Then
GivenRect.Bottom = Rects(i).Bottom
GivenRect.Top = GivenRect.Bottom - H
diffY = Abs(tmpRect.Bottom - Rects(i).Bottom)
FoundY = True
End If
Next i
'Save snapped state in Public Variable
SnappedX = FoundX
SnappedY = FoundY
ElseIf Mode = Sizing Then
If SizingEdge = WMSZ_LEFT Or SizingEdge = WMSZ_TOPLEFT Or SizingEdge = WMSZ_BOTTOMLEFT Then
XPos = GivenRect.Left
Else
XPos = GivenRect.Right
End If
If SizingEdge = WMSZ_TOP Or SizingEdge = WMSZ_TOPLEFT Or SizingEdge = WMSZ_TOPRIGHT Then
YPos = GivenRect.Top
Else
YPos = GivenRect.Bottom
End If
tmpXPos = XPos
tmpYPos = YPos
For i = 0 To UBound(Rects)
If ((tmpXPos >= (Rects(i).Left - SnapWidth) And _
tmpXPos <= (Rects(i).Left + SnapWidth)) And _
((tmpRect.Top - SnapWidth) < Rects(i).Bottom And _
(tmpRect.Bottom + SnapWidth) > Rects(i).Top) And _
Abs(tmpXPos - Rects(i).Left) < diffX) _
Then
XPos = Rects(i).Left
diffX = Abs(tmpXPos - Rects(i).Left)
ElseIf (tmpXPos >= (Rects(i).Right - SnapWidth) And _
tmpXPos <= (Rects(i).Right + SnapWidth)) And _
((tmpRect.Top - SnapWidth) < Rects(i).Bottom And _
(tmpRect.Bottom + SnapWidth) > Rects(i).Top) And _
Abs(tmpXPos - Rects(i).Right) < diffX _
Then
XPos = Rects(i).Right
diffX = Abs(tmpXPos - Rects(i).Right)
End If
'Y
If (tmpYPos >= (Rects(i).Top - SnapWidth) And _
tmpYPos <= (Rects(i).Top + SnapWidth)) And _
((tmpRect.Left - SnapWidth) < Rects(i).Right And _
(tmpRect.Right + SnapWidth) > Rects(i).Left) And _
Abs(tmpYPos - Rects(i).Top) < diffY _
Then
YPos = Rects(i).Top
diffY = Abs(tmpYPos - Rects(i).Top)
ElseIf (tmpYPos >= (Rects(i).Bottom - SnapWidth) And _
tmpYPos <= (Rects(i).Bottom + SnapWidth)) And _
((tmpRect.Left - SnapWidth) < Rects(i).Right And _
(tmpRect.Right + SnapWidth) > Rects(i).Left) And _
Abs(tmpYPos - Rects(i).Bottom) < diffY _
Then
YPos = Rects(i).Bottom
diffY = Abs(tmpYPos - Rects(i).Bottom)
End If
Next i
If SizingEdge = WMSZ_LEFT Or SizingEdge = WMSZ_TOPLEFT Or SizingEdge = WMSZ_BOTTOMLEFT Then
GivenRect.Left = XPos
Else
GivenRect.Right = XPos
End If
If SizingEdge = WMSZ_TOP Or SizingEdge = WMSZ_TOPLEFT Or SizingEdge = WMSZ_TOPRIGHT Then
GivenRect.Top = YPos
Else
GivenRect.Bottom = YPos
End If
End If
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -