如果你貼了張圖的話Private Sub imgMove_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) ReleaseCapture SendMessage Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0& End Sub否則你就用hook吧
试试 Option Explicit Private gX As Long, gY As LongPrivate Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) gX = X gY = Y End SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If Not Button = vbLeftButton Then Exit Sub Dim dx As Long, dy As Long, ax As Long, ay As Long, t As Long, l As Long dy = Y - gY dx = X - gX l = Left t = Top ax = (Screen.Width - l - Width) ay = (Screen.Height - t - Height) If dy > 0 And dy > ay Then dy = ay If dy < 0 And Abs(dy) > t Then dy = -t If dx > 0 And dx > ax Then dx = ax If dx < 0 And Abs(dx) > l Then dx = -l Move l + dx, t + dy End Sub
Option Explicit Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Declare Sub ReleaseCapture Lib "User32" () Const WM_NCLBUTTONDOWN = &HA1 Const HTCAPTION = 2Private Sub Command1_Click() Unload Me End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Dim lngReturnValue As Long If Button = 1 Then ReleaseCapture lngReturnValue = SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&) End If End Sub
To "leolan(史留香)":没有测试您的程序。但是直观来看,好像有些不恰当的地方。如果是拖动,应该是按下鼠标左键不放开,然后移动鼠标,以达到拖动对象的目的。不过你的代码是在 MouseMove 事件中执行的。也就是移动鼠标时向窗口发送 WM_NCLBUTTONDOWN 消息。会不会出现这样的后果:一旦移动了鼠标,窗体就会移动。没有实践就没有发言权,但是我还是说了。如果说错了,请您多多包涵。
If Button = 1 Then
没有控制栏????是指没有标题栏吧下面是王国荣先生的例子,用子类捕捉wm_nchittest消息,并以返回值欺骗windows: 模块中: Option ExplicitPublic Const GWL_WNDPROC = (-4)Public Const WM_NCHITTEST = &H84 Public Const HTCLIENT = 1 Public Const HTCAPTION = 2Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic prevWndProc As LongFunction WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam) If Msg = WM_NCHITTEST And WndProc = HTCLIENT Then WndProc = HTCAPTION End If End Function程序中: Option ExplicitPrivate Sub Command1_Click() Unload Me End SubPrivate Sub Form_Load() prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC) SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc End SubPrivate Sub Form_Unload(Cancel As Integer) SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc End SubPrivate Sub Form_Paint() ForeColor = vbBlue Cls Print Print "我虽然没有标题区,但您可以在工作区按下鼠标," Print "然后把我拖曳到其它地方." End Sub
ReleaseCapture
SendMessage Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&
End Sub否則你就用hook吧
Option Explicit
Private gX As Long, gY As LongPrivate Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
gX = X
gY = Y
End SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Not Button = vbLeftButton Then Exit Sub
Dim dx As Long, dy As Long, ax As Long, ay As Long, t As Long, l As Long
dy = Y - gY
dx = X - gX
l = Left
t = Top
ax = (Screen.Width - l - Width)
ay = (Screen.Height - t - Height)
If dy > 0 And dy > ay Then dy = ay
If dy < 0 And Abs(dy) > t Then dy = -t
If dx > 0 And dx > ax Then dx = ax
If dx < 0 And Abs(dx) > l Then dx = -l
Move l + dx, t + dy
End Sub
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub ReleaseCapture Lib "User32" ()
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2Private Sub Command1_Click()
Unload Me
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
Dim lngReturnValue As Long
If Button = 1 Then
ReleaseCapture
lngReturnValue = SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
End If
End Sub
模块中:
Option ExplicitPublic Const GWL_WNDPROC = (-4)Public Const WM_NCHITTEST = &H84
Public Const HTCLIENT = 1
Public Const HTCAPTION = 2Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic prevWndProc As LongFunction WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
If Msg = WM_NCHITTEST And WndProc = HTCLIENT Then
WndProc = HTCAPTION
End If
End Function程序中:
Option ExplicitPrivate Sub Command1_Click()
Unload Me
End SubPrivate Sub Form_Load()
prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc
End SubPrivate Sub Form_Unload(Cancel As Integer)
SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc
End SubPrivate Sub Form_Paint()
ForeColor = vbBlue
Cls
Print
Print "我虽然没有标题区,但您可以在工作区按下鼠标,"
Print "然后把我拖曳到其它地方."
End Sub