zl程序教程

您现在的位置是:首页 >  其它

当前栏目

8跳动的小球

跳动 小球
2023-09-11 14:21:07 时间

任务:在新建的窗口上画出一个小球,随着时间,小球不断在窗口内跳动,碰到边界反弹,每反弹一次,
改变一种颜色,当窗口改变大小,效果依然。

步骤:1.建立WIN32项目(不用自己写窗口,直接用)
2.将消息处理函数修改如下:


#define IDT_BALL 100

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
HGDIOBJ hOldPen,hOldBrush;
static RECT rect;
static SIZE size;
static int nX,nY,nRad=20; //圆心和半径
int dx=10,dy=10; //步长
static int _nX,_nY; //预判圆心
static COLORREF color=RGB(255,0,0); //初始小球颜色
switch (message)
{
case WM_CREATE:
GetClientRect(hWnd,&rect);
size.cx=rect.right;
size.cy=rect.bottom;
nX=_nX=rect.right/2;
nY=_nY=rect.bottom/2;
break;
case WM_SIZE:
GetClientRect(hWnd,&rect);
size.cx=rect.right;
size.cy=rect.bottom;
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;

case WM_TIMER:
//只接收标识为IDT_BALL的定时器消息
if(wParam==IDT_BALL)
{

_nX=nX+dx;
_nY=nY+dy;
//
if(_nX>nRad&&_nX<size.cx-nRad)
{
nX=_nX;
}
else
{
dx*=-1;
color=RGB(rand()%256,rand()%256,rand()%256);
}

if(_nY>nRad&&_nY<size.cy-nRad)
{
nY=_nY;
}
else
{
dy*=-1;
color=RGB(rand()%256,rand()%256,rand()%256);
}
}
InvalidateRect(hWnd,0,TRUE);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
//创建画笔和画刷
hOldPen=SelectObject(hdc,CreatePen(PS_SOLID,5,color));
hOldBrush=SelectObject(hdc,CreateSolidBrush(color));
//画圆
Ellipse(hdc,nX-nRad,nY-nRad,nX+nRad,nY+nRad);
//还原DC
SelectObject(hdc,hOldPen);
SelectObject(hdc,hOldBrush);
//释放设备
DeleteObject(CreatePen(PS_SOLID,5,color));
DeleteObject(CreateSolidBrush(color));
ReleaseDC(hWnd,hdc);

EndPaint(hWnd, &ps);
//启动定时器 //第二参数为定时器的标识(可自定义),第三次为间隔时间
SetTimer(hWnd,IDT_BALL,30,0);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}