C++实现让窗口在任何地方都能被拖动

前言

看到好多窗口都能在任何地方拖动来改变它的位置, 于是就研究了一下.

这个本来是易语言的源码, 我在此基础做了改动, 并写成了类.(侵权请联系删除)

代码

此代码已经通过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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值