win32强化练习3.2_鼠标消息

键盘消息在对话框程序中是不能直接用的,但是鼠标消息是可以的。

鼠标消息需要多做练习~

鼠标消息的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);
		}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值