Difference between revisions of "Dragging windows"

From HashVB
Jump to: navigation, search
m (Clarified when to use the code)
(Added two drawbacks)
Line 26: Line 26:
 
# It's easier. Two lines once compared to a huge routine (or two?)  
 
# It's easier. Two lines once compared to a huge routine (or two?)  
 
# It obeys the windows rules and settings on drawing windows while moving.  
 
# It obeys the windows rules and settings on drawing windows while moving.  
 +
 +
The only problems I have found with this are:
 +
 +
# It doesn't work when you use the right mouse button (although this may be just Windows XP)
 +
# You cant limit it to only moving in one direction
  
 
If you want to use this to drag a control, just replace Form.hWnd with Control.hWnd. This will NOT work with windowless controls like Labels or ImageBoxes.
 
If you want to use this to drag a control, just replace Form.hWnd with Control.hWnd. This will NOT work with windowless controls like Labels or ImageBoxes.

Revision as of 12:57, 9 April 2006

float
 This article is based on Visual Basic 6. Find other Visual Basic 6 articles.

So, you want to drag a window without using the real title bar?

I have seen lots of people using their own code in the mouse move event to do this, and I've even done it myself.

Until I found the following code:

Declare Function ReleaseCapture Lib "user32" () As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
  (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
  lParam As Any) As Long

Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2

And when you want to do the dragging itself:

ReleaseCapture
SendMessage Form.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, ByVal 0&

This should go in the mousedown event of the control/object you want to drag the window by.

It has various advantages over home grown code:

  1. It's faster and rarely suffers from flickering.
  2. It's easier. Two lines once compared to a huge routine (or two?)
  3. It obeys the windows rules and settings on drawing windows while moving.

The only problems I have found with this are:

  1. It doesn't work when you use the right mouse button (although this may be just Windows XP)
  2. You cant limit it to only moving in one direction

If you want to use this to drag a control, just replace Form.hWnd with Control.hWnd. This will NOT work with windowless controls like Labels or ImageBoxes.

See also