编写个程序,在屏幕上出现一个圆心沿正弦曲线轨迹移动的实心圆。要求每隔1/4周期,圆的填充色和圆的周边颜色都发生变化(颜色自己选取),同时,圆的半径在1/4周期之内由正弦曲线幅值的0.2 ~ 0.6倍线性增长。
#include<Windows.h>
#include<stdio.h>
#include<string>
#define Pi 3.1415926
double dfRange=100.0; //正弦曲线的角度变量
long i=0,j=0;
long ICentreX=0,ICentreY=0,IRadious=(long)(0.2*dfRange); //定义圆心坐标和圆半径
POINT IpSin[100]; //定义正弦曲线的点坐标
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM IParam)
{
HDC hdc; //定义设备环境句柄
HBRUSH hBrush; //定义画刷句柄
HPEN hPen; //定义画笔句柄
PAINTSTRUCT ps; //定义包含绘图信息的结构体变量
switch(message)
{
case WM_PAINT: //处理绘图消息
hdc=BeginPaint(hWnd,&ps); //获得设备环境指针
SetWindowOrgEx(hdc,-200,-200,NULL); //设置原定坐标
hPen=CreatePen(PS_DASH,1,RGB(255,0,0)); //建新画笔
SelectObject(hdc,hPen); //选入画笔
Polyline(hdc,IpSin,100); //绘制正弦曲线
if(i<=25) //第一个1/4周期
{
hPen=CreatePen(PS_DASH,1,RGB(255,0,0));
hBrush=CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0));
IRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);
}
if(i>25&&i<=50) //第二个1/4周期
{
hPen=CreatePen(PS_DASH,1,RGB(0,255,0));
hBrush=CreateHatchBrush(HS_DIAGCROSS,RGB(0,255,0));
IRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);
}
if(i>50&&i<=75) //第三个1/4周期
{
hPen=CreatePen(PS_DASH,1,RGB(0,0,255));
hBrush=CreateHatchBrush(HS_CROSS,RGB(0,0,255));
IRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);
}
if(i>75) //第四个1/4周期
{
hPen=CreatePen(PS_DASH,1,RGB(255,255,0));
hBrush=CreateHatchBrush(HS_VERTICAL,RGB(255,255,0));
IRadious=(long)(dfRange*0.2+i%25*dfRange*0.4/25);
}
SelectObject(hdc,hBrush); //选入画刷
SelectObject(hdc,hPen); //选入画笔
ICentreX=IpSin[i].x; //圆心x坐标
ICentreY=IpSin[i].y; //圆心y坐标
Ellipse(hdc,ICentreX-IRadious,ICentreY-IRadious,ICentreX+IRadious,ICentreY+IRadious);
i++; //控制下一次显示的圆(圆心,半径,颜色,填充色)
DeleteObject(hPen); //删除画笔
DeleteObject(hBrush); //删除画刷
EndPaint(hWnd,&ps); //删除设备环境
Sleep(100); //停0.1秒
if(i<100)
InvalidateRect(hWnd,NULL,TRUE); //刷新用户区
else
{
i=i%100;
InvalidateRect(hWnd,NULL,TRUE);
}
break;
case WM_DESTROY: //关闭窗口
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd,message,wParam,IParam));
}
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR IpCmdLine,int nCmdShow){
char IpszClassName[]="窗口"; //窗口类名
char IpszTitle[]="My_Windows"; //窗口标题名
//窗口类的定义
WNDCLASS wndclass; //窗口类对象
wndclass.style=0; //窗口类型为缺省类型
wndclass.lpfnWndProc=WndProc; //定义窗口处理函数
wndclass.cbClsExtra=0; //窗口类无拓展
wndclass.cbWndExtra=0; //窗口实例无拓展
wndclass.hInstance=hInstance; //当前实例句柄
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //窗口的最小化图标为缺省图标
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); //窗口采用箭头光标
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景为白色
wndclass.lpszMenuName=NULL; //窗口中无菜单
wndclass.lpszClassName=IpszClassName; //窗口类名
if(!RegisterClass(&wndclass)) //如果注册失败则发出警告
{MessageBeep(0);return FALSE;}
//创建窗口
HWND hwnd; //窗口句柄
hwnd=CreateWindow
(
IpszClassName, //窗口类名
IpszTitle, //窗口实例的标题名
WS_OVERLAPPEDWINDOW, //窗口的风格
CW_USEDEFAULT, //窗口左上角坐标为缺省值
CW_USEDEFAULT,
CW_USEDEFAULT, //窗口的高和宽为缺省值
CW_USEDEFAULT,
NULL, //此窗口无父窗口
NULL, //此窗口无主菜单
hInstance, //创建此窗口的应用程序的当前句柄
NULL //不使用该值
);
//显示窗口
ShowWindow(hwnd,nCmdShow);
//立即发送WM_PAINT消息来刷新窗口客户区
UpdateWindow(hwnd);
//消息循环
for(int j=0;j<100;j++) //生成正弦曲线的点坐标
{
IpSin[j].x=(long)(j*2*Pi/100*60);
IpSin[j].y=(long)(dfRange*sin(j*2*Pi/100));
}
MSG Msg; //消息
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg); //将虚拟键消息转化为字符信息
DispatchMessage(&Msg);
//调度一个消息给窗口程序。通常调度从GetMessage取得
}
return Msg.wParam; //消息循环结束即程序终止时将信息返回系统
//窗口(消息)处理函数
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
}
实验结果