不对悬浮窗的移动加以处理是一件让用户很头疼的事。如果我们仅仅在按下左键时发送 WM_NCLBUTTONDOWN
消息,用户不能轻轻松松地让悬浮窗靠边,或者一不小心就把窗口移出屏幕外了。这就要求我们开发者要对其奋力优化。
假设我们移动悬浮窗的基本代码如下:
case WM_LBUTTONDOWN:
{
SendMessage(hwnd, WM_NCLBUTTONDOWN, 2, 0);
return TRUE; //DialogBox ^_^
}
考虑到使用效果,我们不可能处理 WM_MOVE
消息(其实我没有试过),而应该处理 WM_MOVING
消息,让我们先看一下 WM_MOVING
的介绍:
wParam
This parameter is not used.lParam
A pointer to a RECT structure with the current position of the window, in screen coordinates. To change the position of the drag rectangle, an application must change the members of this structure.
所以我们更改 lParam
指向的那个 RECT
就可以啦。
case WM_MOVING:
{
RECT *rect = (RECT*)lParam;
//改rect
return TRUE;
}
那怎么做才能让用户有比较好的体验呢?下面谈谈我的思路。
首先我们知道窗口大小是不会变化的,所以我们只需要保存窗口左上角的坐标就可以了。然后我们就可以使用 SystemParametersInfo(SPI_GETWORKAREA, 0, &rRet, 0);
获取窗口应当出现的位置的矩形,并根据窗口大小算出窗口左上角可能的位置的矩形。为了在移动时鼠标和窗口的相对位置尽量不变&#