前言
看到好多窗口都能在任何地方拖动来改变它的位置, 于是就研究了一下.
这个本来是易语言的源码, 我在此基础做了改动, 并写成了类.(侵权请联系删除)
代码
此代码已经通过Visual C++ 6编译, 无警告
MoveFreely.h
#pragma once
#include <windows.h>
class MoveFreely
{
public:
void MoveWindowFreely(HWND hWnd);
void CancelMoveFreely();
private:
HWND All_hWnd;
};
MoveFreely.cpp
#include"MoveFreely.h"
BOOL IsBtnDown;
RECT rect;
int _left;//相对于窗口
int _top;//相对于窗口
WNDPROC OldWndProc;
inline void DoEvents()
{
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
inline void MoveWnd(HWND hWnd, int left, int top, int width, int height)
{
RECT rc;
GetWindowRect(hWnd, &rc);
if (!left)
{
left = (int)rc.left;
}
if (!top)
{
top = (int)rc.top;
}
if (!width)
{
width = (int)rc.right - rc.left;
}
if (!height)
{
height = (int)rc.bottom - rc.top;
}
MoveWindow(hWnd, left, top,
width, height, true);
}
inline void LButtonDown(HWND hWnd)
{
DoEvents();
IsBtnDown = true;
GetWindowRect(hWnd, &rect);
POINT m_mouse = { 0,0 };
GetCursorPos(&m_mouse);
_left = m_mouse.x - rect.left;
_top = m_mouse.y - rect.top;
SetCapture(hWnd);
}
inline void LButtonUp()
{
ReleaseCapture();
IsBtnDown = false;
}
inline void MouseMove(HWND hWnd)
{
POINT point;
if (IsBtnDown)
{
GetCursorPos(&point);
MoveWnd(hWnd, point.x - _left, point.y - _top, NULL, NULL);
}
}
LRESULT CALLBACK MoveWindowFreelyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_LBUTTONDOWN:
LButtonDown(hWnd);
CallWindowProc(OldWndProc,hWnd,msg,wParam,lParam);
break;
case WM_LBUTTONUP:
LButtonUp();
CallWindowProc(OldWndProc,hWnd,msg,wParam,lParam);
break;
case WM_MOUSEMOVE:
MouseMove(hWnd);
CallWindowProc(OldWndProc,hWnd,msg,wParam,lParam);
break;
default:
return CallWindowProc(OldWndProc,hWnd,msg,wParam,lParam);
break;
}
return CallWindowProc(OldWndProc,hWnd,msg,wParam,lParam);
}
void MoveFreely::MoveWindowFreely(HWND hWnd)
{
All_hWnd = hWnd;
OldWndProc = (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (LONG)MoveWindowFreelyWndProc);
}
void MoveFreely::CancelMoveFreely()
{
SetWindowLong(All_hWnd, GWL_WNDPROC, (LONG)OldWndProc);
}