自己做了一个 ActiveX 控件, 引出 MouseDown 事件.
在窗体中的控件的 MouseDown 中
[code vbscript]
ReleaseCapture
SendMessage UC.hwnd, WM_NCLBUTTONDOWN, 2, 0 'UC 是 ActiveX 控件在窗体上的一个实例名.
[/code]改变控件的位置后, 发现其 Left 值并没有改变. 怎么回事?

解决方案 »

  1.   

    补充:
    以下在 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]
      

  2.   

    补充: 
    [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]
      

  3.   

    补充:  
      
    '以下在 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  
      

  4.   


    Dim I As long
      

  5.   

    补充:   '以下在 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   
      

  6.   

    NND, 终于正确使用 UBB.....
      

  7.   

    '用户控件添加如下方法
    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