C++小球沿正弦曲线运动

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图形设计应用:绘制小球沿曲线运动
一、实验目的
绘制一个小球沿着一定的曲线运动的简单动画。

二、实验内容
【题目描述】
本程序利用Polyline函数作曲线的绘制,然后在每个细分点用定义好的画刷画圆。

这和一般的绘图程序没有很大的区别,但要实现动画的效果,就要隔一段时间绘制客户区,也就是发送WM_PAINT消息让客户区重绘,因为圆的坐标在不停的变化给人的感觉就是一个动画。

【题目要求】
利用画笔、画刷工具绘制一个小球,并沿着正弦曲线运动,要求延迟,一边小球移动位置后重绘。

【输入/输出要求】
要求在屏幕上显示运动的结果。

三、源程序清单:
#include <windows.h>
#include<math.h>
#define NUM 1000
#define TWOPI 6.28315
static int lRadious=30;
int beginp=0;
POINT apt[NUM];
TCHAR szWindowClass[100] = TEXT("复杂窗口") ; //静态变量定义标题
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
LRESULT CALLBACK MndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int nCmdShow)
{
//nCmdShow=SW_RESTORE;
MSG msg ;
if (!MyRegisterClass (hInstance)) //注册窗口类,出错提示并返回
{
MessageBox (NULL, TEXT ("窗口程序注册失败!"), szWindowClass, MB_ICONERROR) ;
return 0 ;
}
InitInstance(hInstance, nCmdShow);// 执行应用程序初始化
while (GetMessage (&msg,NULL, 0, 0)) //执行消息循环,取得消息
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
MSG a;
a=msg;
}
return msg.wParam ;
}
// 函数: MyRegisterClass()
// 目的: 注册窗口类。

ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX); //结构的字节数
wcex.style = CS_HREDRAW | CS_VREDRAW ; //窗口类样式
wcex.lpfnWndProc = MndProc ; //窗口函数的指针
wcex.cbClsExtra = 0 ;//分配在窗口结构后的字节数
wcex.cbWndExtra = 0 ; //分配在窗口实例后的字节数
wcex.hInstance = hInstance ;//定义窗口类的应用程序实例句柄
wcex.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;//窗口类的图标
wcex.hCursor = LoadCursor (NULL, IDC_ARROW) ; //窗口类的光标
wcex.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ; //窗口类的背景色刷
wcex.lpszMenuName = NULL ; //窗口菜单资源名
wcex.lpszClassName= szWindowClass ; //窗口类名
wcex.hIconSm =NULL; //小图标
return RegisterClassEx(&wcex);
}
// 函数: InitInstance(HINSTANCE, int)
// 目的: 保存实例句柄并创建主窗口
// 注释: 在此函数中,我们在全局变量中保存实例句柄并创建和显示主程序窗口。

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hwnd;//创建用于保存窗体句柄的对象,窗体句柄是系统识别不同窗体的依据
//hInst = hInstance; //将实例句柄存储在全局变量中
//创建窗口
hwnd = CreateWindow(
szWindowClass, // 窗口类名
TEXT ("Windows API 简单窗口"), // 窗口标题
WS_OVERLAPPEDWINDOW, // 窗口风格,可叠层窗口
CW_USEDEFAULT, // 初始x位置,用缺省的递增式
CW_USEDEFAULT, // 初始y位置,用缺省的递增式
CW_USEDEFAULT, // 初始x尺寸,用缺省尺寸
CW_USEDEFAULT, // 初始y尺寸,用缺省尺寸
NULL, // 父窗口句柄
NULL, // 菜单句柄
hInstance, // 程序实例句柄
NULL) ; // 程序创建参数
//显示并重绘窗口,发出第一个WM_PAINT消息
ShowWindow (hwnd, nCmdShow) ;
UpdateWindow (hwnd) ;
return TRUE;
}
//消息处理函数
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ; //定义DC句柄
PAINTSTRUCT ps ; //定义绘图信息结构
int amessage;
amessage=message;
switch (message) //分别各种处理消息
{
case WM_PAINT:
//MessageBox (NULL, TEXT ("窗口程序注册失败!"), szWindowClass, MB_ICONERROR);
//return 0;
hdc = BeginPaint (hwnd, &ps) ;//得到设备描述符
RECT rt;
GetClientRect (hwnd, &rt) ;//调用GDI函数绘制图形
DrawText(hdc, TEXT(" \n\n 思维论坛\n "), -1, &rt, NULL);
EndPaint (hwnd, &ps) ;//结束绘图
return 0 ;
case WM_DESTROY:
//退出消息循环
PostQuitMessage (0) ;
return 0 ;
//case WM_LBUTTONDOWN:
case WM_LBUTTONDBLCLK:
MessageBox (NULL, TEXT ("真好玩"), szWindowClass, MB_ICONERROR);
/*hdc = BeginPaint (hwnd, &ps) ;//得到设备描述符
RECT rt2;
GetClientRect (hwnd, &rt2) ;//调用GDI函数绘制图形
DrawText(hdc, TEXT(" HELLO MOUSE"), -1, &rt2, NULL);
EndPaint (hwnd, &ps) ;//结束绘图*/
//return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
LRESULT CALLBACK MndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
static int cx,cy;
int i;
HPEN hPen;
HBRUSH hBrush;
switch (message) /* 消息处理*/
{
case WM_CREATE:
return 0;
case WM_SIZE:
cx=LOWORD(lParam);
cy=HIWORD(lParam);
return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
MoveToEx(hdc,0,cy/2,NULL);
LineTo(hdc,cx,cy/2);
for(i=0;i<NUM;i++)
{
apt[i].x=i*cx/NUM;
apt[i].y=(int)(cy/2*(1-sin(TWOPI*i/NUM)));
}
Polyline(hdc,apt,NUM);
hPen=CreatePen(PS_DASH,1,RGB(255,0,0));
hBrush=CreateHatchBrush(HS_DIAGCROSS,RGB(255,0,0));
SelectObject(hdc,hPen);
SelectObject(hdc,hBrush);
Ellipse(hdc,apt[beginp].x-lRadious,apt[beginp].y-lRadious,apt[beginp].x
+lRadious,apt[beginp].y+lRadious);
DeleteObject(hPen);
DeleteObject(hBrush);
EndPaint(hwnd,&ps);
Sleep(10);
beginp++;
if(beginp>=1000)
beginp=0;
InvalidateRect(hwnd,NULL,1);
return 0;
case WM_DESTROY:
PostQuitMessage (0); /* 发送一个WM_QUIT 到消息队列*/
break;
default: /* 不能处理的消息*/
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
四、实验结果:
五、实验心得:
通过课程实践,我基本掌握了如何用GDI常用绘图函数在Windows下来绘制图形,其中包括如何利用画笔、画刷工具以及如何利用颜色处理图形等等。

相关文档
最新文档