键盘消息在对话框程序中是不能直接用的,但是鼠标消息是可以的。
鼠标消息需要多做练习~
鼠标消息的wParam仍然是键盘的信息,而坐标放在了lParam中,其中x坐标是低字(LOWORD)而y坐标是高字(HIWORD)。
先进行一个与键盘差不多的练习,即小球跟着鼠标移动:
1. 先用HDC画个圆(坐标使用全局变量);
2. 处理WM_MOUSEMOVE消息,获取X,Y坐标
3. 刷新绘图
int gx = 10, gy = 10;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
Ellipse(hdc, gx, gy, gx+50,gy+50);
EndPaint(hwnd, &ps);
}
break;
case WM_MOUSEMOVE:
{
gx = short(LOWORD(lParam)) - 25;
gy = short(HIWORD(lParam)) - 25;
InvalidateRect(hwnd, NULL, TRUE);
}
break;
1. 在之前程序基础上,加上全局变量起点的x,y坐标
2. 增加一个标志位,标志当前是否在绘制状态
3. 处理WM_LBUTTONDOWN消息,
4. 处理WM_MOUSEMOVE消息,
5. 处理WM_LBUTTONUP消息。
BOOL bDraw = FALSE;
int gStartx, gStarty;
case WM_LBUTTONDOWN:
{
bDraw = TRUE;
gStartx = short(LOWORD(lParam));
gStarty = short(HIWORD(lParam));
}
break;
case WM_MOUSEMOVE:
{
if (!bDraw) break;
gx = short(LOWORD(lParam));
gy = short(HIWORD(lParam));
InvalidateRect(hwnd, NULL, TRUE);
}
break;
case WM_LBUTTONUP:
{
bDraw = FALSE;
}
break;
接着,我们试图进一步,在图上能画出多个圈,那么就需要刷新时对所需要的区域进行刷新,把这个区域用RECT定义出来即可:
case WM_MOUSEMOVE:
{
if (!bDraw) break;
gx = short(LOWORD(lParam));
gy = short(HIWORD(lParam));
RECT rt;
rt.left = gStartx;
rt.top = gStarty;
rt.right = gx;
rt.bottom = gy;
InvalidateRect(hwnd, &rt, TRUE);
}