您的位置:首页 > 其它

win32强化练习3.2_鼠标消息

2016-11-20 21:33 288 查看
键盘消息在对话框程序中是不能直接用的,但是鼠标消息是可以的。

鼠标消息需要多做练习~

鼠标消息的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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  WIN32