window绘图

编写个程序,在屏幕上出现一个圆心沿正弦曲线轨迹移动的实心圆。要求每隔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);

}

实验结果

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值