ok, i created a program that has no border, but i still wanted it to be moveable, so i wrote this code, and found that if the user moves the mouse and clicks fast enough, the window manages to move itself entirely off the screen. it doesn't get closed or hidden, just moved off the viewable boundaries, any help would be much appreciated.
.elseif uMsg==WM_LBUTTONDOWN
.if KeyDown==FALSE
mov eax,lParam
shr eax,16
mov lMouseY0,eax
mov eax,lParam
and eax,0FFFFh
mov lMouseX0,eax
mov KeyDown,TRUE
invoke SetCapture,hWnd
.endif
.elseif uMsg==WM_LBUTTONUP
.if KeyDown==TRUE
mov KeyDown,FALSE
invoke ReleaseCapture
.endif
.elseif uMsg==WM_MOUSEMOVE
.if KeyDown==TRUE
invoke GetWindowRect,hWnd,addr rect
mov eax,lParam
and eax,0FFFFh
sub eax,lMouseX0
add rect.left,eax
mov eax,lParam
shr eax,16
sub eax,lMouseY0
add rect.top,eax
invoke SetWindowPos, hWnd, NULL, rect.left, rect.top, NULL, NULL, SWP_NOZORDER or SWP_NOSIZE
The usual method is to fool Windows that your client area IS the title bar. You can do this by processing WM_NCHITTEST. Windows sends this message to your window everytime it needs to determine what part of your window the mouse cursor is currently resting on. If you always return the value HTCAPTION, Windows will assume that everywhere in your window (except the child windows) is the title bar and thus you can drag the window anywhere without the title bar
.elseif uMsg== WM_NCHITTEST
mov eax, HTCAPTION
ret
i was actually using the code i had in order to keep windows from ever creating the dotted box while dragging, ie. i want windows to always display my client and it's contents. using the wm_ncihittest method, it leaves the image of the client behind and moves a dotted box.
I achieve that result by checking "Show window contents while dragging" in the display property. Perhaps there is a special API for doing that
I always moved the mouse like this:
In WM_LBUTTONDOWN, hit test to see if the mouse clicked on the MOVE spot. If it did, save the mouse X-Y position, and SetCapture the mouse to your window. Also set a flag that the window is to be moved with the mouse.
In WM_MOUSEMOVE, check your flag. If valid, GetWindowRect and compute:
new rect.top = present mouse Y - initial Y0
new rect.left = present mouse X - initial X0
Then just SetWindowPos the window there.
Finally, in WM_LBUTTONUP, reset the flag and ReleaseCapture the mouse.
This moves the whole window with the mouse, not just the outline rect no matter what the sys settings are.
I posted some code including this, check Custom window shapes at
here.is/COMinASM
well Ernie, that's basically the same code i've got and it still has problems with fast movements. for some reason it likes placing the window off the viewable screen dimensions, it's really driving me nuts, i guess i'll just keep at it. maybe it's just in windows 2000 that this happens..
If the problem is the window going offscreen, you may just need to add the extra code to ensure your new rectangle coordinates aren't offscreen. To do that, start by getting the coordinates of the desktop window.
Also, in Win2k, you may want to see if you need to use 32-bit coordinates. You may need them if you are using a very high resolution screen.
I'm not sure if you can use this:
.elseif uMsg==WM_LBUTTONDOWN
mov eax, lParam
invoke PostMessage,hWnd,WM_NCLBUTTONDOWN,HTCAPTION,eax
cya