自己做了一个 ActiveX 控件, 引出 MouseDown 事件.
在窗体中的控件的 MouseDown 中
[code vbscript]
ReleaseCapture
SendMessage UC.hwnd, WM_NCLBUTTONDOWN, 2, 0 'UC 是 ActiveX 控件在窗体上的一个实例名.
[/code]改变控件的位置后, 发现其 Left 值并没有改变. 怎么回事?
在窗体中的控件的 MouseDown 中
[code vbscript]
ReleaseCapture
SendMessage UC.hwnd, WM_NCLBUTTONDOWN, 2, 0 'UC 是 ActiveX 控件在窗体上的一个实例名.
[/code]改变控件的位置后, 发现其 Left 值并没有改变. 怎么回事?
以下在 Form 中:
[code = vbscript]
Private Sub Command1_Click()
Me.Caption = UC.Left & ", " & Picture1.Left'移动位置后测试 Left 值.
End SubPrivate Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage Picture1.hwnd, WM_NCLBUTTONDOWN, 2, 0
End SubPrivate Sub UC_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage UC.hwnd, WM_NCLBUTTONDOWN, 2, 0
End Sub
[/code]以下在模块中:
[code = vbscript]
Option Explicit
Public Declare Function ReleaseCapture Lib "user32 " () As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_NCLBUTTONDOWN = &HA1
Public Const HTCAPTION = 2 'Hit test
[/code]以下在 UserControl 中:
[code = vbscript]
Option ExplicitPublic Event MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Public Event MouseMove()
Public Event MouseUp()Public Property Get hwnd() As Long
hwnd = UserControl.hwnd
End PropertyPrivate Sub UserControl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseDown(Button, Shift, X, Y)
End SubPrivate Sub UserControl_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseMove
End SubPrivate Sub UserControl_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseUp
End Sub
[/code]
[code = vbscript]
'以下在 Form 中:
Private Sub Command1_Click()
Me.Caption = UC.Left & ", " & Picture1.Left'移动位置后测试 Left 值.
End Sub Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage Picture1.hwnd, WM_NCLBUTTONDOWN, 2, 0
End Sub Private Sub UC_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage UC.hwnd, WM_NCLBUTTONDOWN, 2, 0
End Sub '以下在模块中:
Option Explicit
Public Declare Function ReleaseCapture Lib "user32 " () As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_NCLBUTTONDOWN = &HA1
Public Const HTCAPTION = 2 'Hit test '以下在 UserControl 中:
Option Explicit Public Event MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Public Event MouseMove()
Public Event MouseUp() Public Property Get hwnd() As Long
hwnd = UserControl.hwnd
End Property Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseDown(Button, Shift, X, Y)
End Sub Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseMove
End Sub Private Sub UserControl_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseUp
End Sub
[/code]
'以下在 Form 中:
Private Sub Command1_Click()
Me.Caption = UC.Left & ", " & Picture1.Left'移动位置后测试 Left 值.
End Sub Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage Picture1.hwnd, WM_NCLBUTTONDOWN, 2, 0
End Sub Private Sub UC_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage UC.hwnd, WM_NCLBUTTONDOWN, 2, 0
End Sub '以下在模块中:
Option Explicit
Public Declare Function ReleaseCapture Lib "user32 " () As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_NCLBUTTONDOWN = &HA1
Public Const HTCAPTION = 2 'Hit test '以下在 UserControl 中:
Option Explicit Public Event MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Public Event MouseMove()
Public Event MouseUp() Public Property Get hwnd() As Long
hwnd = UserControl.hwnd
End Property Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseDown(Button, Shift, X, Y)
End Sub Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseMove
End Sub Private Sub UserControl_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseUp
End Sub
Dim I As long
Private Sub Command1_Click()
Me.Caption = UC.Left & ", " & Picture1.Left'移动位置后测试 Left 值.
End Sub Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage Picture1.hwnd, WM_NCLBUTTONDOWN, 2, 0
End Sub Private Sub UC_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture
SendMessage UC.hwnd, WM_NCLBUTTONDOWN, 2, 0
End Sub '以下在模块中:
Option Explicit
Public Declare Function ReleaseCapture Lib "user32 " () As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_NCLBUTTONDOWN = &HA1
Public Const HTCAPTION = 2 'Hit test '以下在 UserControl 中:
Option Explicit Public Event MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Public Event MouseMove()
Public Event MouseUp() Public Property Get hwnd() As Long
hwnd = UserControl.hwnd
End Property Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseDown(Button, Shift, X, Y)
End Sub Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseMove
End Sub Private Sub UserControl_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
RaiseEvent MouseUp
End Sub
Public Sub RefreshPos()
Dim rc As RECT, pt As POINTL
GetWindowRect Me.hwnd, rc
pt.x = rc.Left
pt.Y = rc.Top
ScreenToClient UserControl.ContainerHwnd, pt
UserControl.Extender.Left = ScaleX(pt.x, vbPixels, UserControl.Extender.Parent.ScaleMode)
PropertyChanged "Left"
UserControl.Extender.Top = ScaleY(pt.Y, vbPixels, UserControl.Extender.Parent.ScaleMode)
PropertyChanged "Top"
End Sub'窗体中增加调用
Private Sub UC_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single)
ReleaseCapture
SendMessage UC.hwnd, WM_NCLBUTTONDOWN, ByVal HTCAPTION, ByVal 0&
UC.RefreshPos
End Sub