//这里仅列出使用的消息
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:
{
//保存窗体位置
}
这些代码是从程序中摘录出来的, 笔者已尽量检查它们的完整性, 但人总有犯错的时候, 如果发现这些代码有问题, 或有更好的建议, 请联系笔者:ggg82@sina.com