nbsp; xEnd = ScreenX - NEAR_SIDE;
}
else
{
xStep = (ScreenX - rc.right) / moves;
xEnd = ScreenX - width;
}
break;
}
default:
return;
}
//动画滚动窗体.
for (i = 0; i < moves; i++)
{
rc.left += xStep;
rc.top += yStep;
SetWindowPos(hWnd, NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE | SWP_NOSENDCHANGING);
RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
Sleep(5);
}
SetWindowPos(hWnd, NULL, xEnd, yEnd, 0, 0, SWP_NOSIZE);
if (!hide) //如果窗体已被显示,设置定时器.监视鼠标.
{
SetTimer(hWnd, WM_TIMER, 500, NULL);
}
}
//下面就是通过窗体回调函数将这些函数组织起来.
//这里仅列出使用的消息
case WM_TIMER: //定时器消息
{
POINT pt;
RECT rc;
GetCursorPos(&pt);
GetWindowRect(hWnd, &rc);
if (!PtInRect(&rc, pt)) //若鼠标不在窗体内,隐藏窗体.
{
KillTimer(hWnd, WM_TIMER);
HideSide(hWnd, TRUE);
}
break;
}
case WM_CREATE:
case WM_INITDIALOG: //初始化消息
{
SetWindowPos() //
程序保存窗体上次靠位置,在这里恢复.
NearSide(hWnd);
break;
}
//这两个消息是在窗体移动开始时和结束时产生的,我们在窗体开始移动时关闭定时器,移动结束后再打开,这样避免窗体移动时隐藏,金山快译的浮动条就有这种情况出现.
case WM_ENTERSIZEMOVE:
{
KillTimer(hWnd, WM_TIMER);
break;
}
case WM_EXITSIZEMOVE:
{
SetTimer(hWnd, WM_TIMER, 500, NULL);
break;
}
case WM_MOUSEMOVE: //受到窗体移动消息时,判断窗体是否显示,
{
RECT rc;
GetWindowRect(hWnd, &rc);
if (rc.left < 0 || rc.top < 0 || rc.right > ScreenX) //未显示
HideSide(hWnd, FALSE);
break;
}
case WM_MOVING: //处理窗体移动时消息,实现自动停靠
{
OnMoving(hWnd, (LPRECT) lParam);
break;
}
case WM_MOVE:
{
//保存窗体位置
}
这些代码是从我的
程序中摘录出来的, 我已尽量检查它们的完整性, 但人总有犯错的时候, 如果你发现这些代码有问题, 或有更好的建议, 请联系我, 我的E-Mail:ggg82@sina.com