在Windows窗口里画五角星

本文详细介绍了一种在Windows环境下使用C++编程语言绘制五角星的方法。通过具体代码示例,展示了如何利用Windows API创建窗口,以及如何计算并绘制五角星的各个顶点,最终实现动态显示的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Windows窗口里画五角星

#include<windows.h>
#include<math.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
double PI = 3.1415926;//定义圆周率
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
	static TCHAR szAppName[] = TEXT("MyWindows");
	HWND hwnd;
	MSG msg;
	WNDCLASS wndclass;

	wndclass.style = CS_HREDRAW | CS_VREDRAW;
	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 = szAppName;

	if(!RegisterClass(&wndclass))
	{
		MessageBox(NULL,TEXT("这个程序需要在Windows NT才能运行!"),szAppName,MB_ICONERROR);
		return 0;
	}

	hwnd = CreateWindow(szAppName,
		TEXT("Crush画的五角星"),
		WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		NULL);
	ShowWindow(hwnd,iCmdShow);
	UpdateWindow(hwnd);

	while(GetMessage(&msg,NULL,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;
	double linelength=200;
	double next_x=200,next_y=200;

	switch(message)
	{
	case WM_PAINT:
		hdc = BeginPaint(hwnd,&ps);
		GetClientRect(hwnd,&rect);
		MoveToEx(hdc,next_x,next_y,NULL);

		/*下一个点:x:是该点的x减去边长乘cos72度*/
		/*下一个点:y:是该点的y加上边长乘sin72度*/
		next_x=next_x-linelength*cos(2*PI/5);
		next_y=next_y+linelength*sin(2*PI/5);
		LineTo(hdc,next_x,next_y);//连线
		
		/*计算下一个点的坐标*/
		next_x=next_x+linelength*cos(PI/5);
		next_y=next_y-linelength*sin(PI/5);
		LineTo(hdc,next_x,next_y);//连线
		
		/*计算下一个点的坐标*/
		next_x-=linelength;
		LineTo(hdc,next_x,next_y);//连线
		
		/*计算下一个点的坐标*/
		next_x=next_x+linelength*cos(PI/5);
		next_y=next_y+linelength*sin(PI/5);
		LineTo(hdc,next_x,next_y);//连线

		LineTo(hdc,200,200);//连到起点
		EndPaint(hwnd,&ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd,message,wParam,lParam);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值