已经简单练习了键盘和鼠标,接下来是定时器消息:
所谓定时器就是在某一个窗口设置一个或多个闹钟,在闹钟响的时候做指定的事情。
启动定时器:(如果第四项是NULL,则找WM_TIMER消息处理)
定时器句柄/定时器ID/时间间隔/定时器处理函数指针
关闭定时器:
定时器句柄/定时器ID
这节来做一个会在窗口中来回弹的球:
1. 球的位置:定义全局变量gx,gy;
2. 球的方向和速度:定义全局变量vx, vy;符号代表正向和负向,数值代表每次移动量即速度;
3. 处理WM_PAINT消息,绘制一个圆;
4. 在WM_CREATE中开启定时器,10ms间隔;
5. 在WM_TIMER中,首先获取当前客户区的矩形,判断是否撞到边框;
5. 球的位置+方向和速度,刷新绘图
int gx = 50,gy = 50;
int vx = 1,vy = 1; //x和y方向上的速度(可正可负)
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
Ellipse(hdc, gx, gy, gx+50, gy+50);
EndPaint(hwnd, &ps);
}
case WM_CREATE:
{
SetTimer(hwnd, 10, 10, NULL);
}
break;
case WM_TIMER:
{
RECT rt;
GetClientRect(hwnd, &rt);
if (gx <= 0 || gx>= rt.right - 50) vx *= -1; //转向
if (gy <= 0 || gy>= rt.bottom - 50) vy *= -1;
gx += vx;
gy += vy;
InvalidateRect(hwnd, NULL, TRUE);
}
break;
这个练习在判断方向和速度上如果没有清晰的概念很容易陷入混乱中,但如果把它和物理量的速度相结合就方便很多!