烟花
请使用WinAPI方式实现烟花效果
//windows.h文件中包含应用程序中所需的数据类型和数据结构的定义 #include <windows.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <stdio.h> #include <math.h> #define PI acos(-1) LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//窗口函数说明 //---------以下初始化窗口类-------------- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow) { HWND hwnd; MSG Msg; WNDCLASS wndclass; char lpszClassName[] = "窗口"; //窗口类名 char lpszTitle[] = "My_Windows"; //窗口标题名 //窗口类的定义 wndclass.style = CS_HREDRAW | CS_VREDRAW; //窗口类型为默认类型 wndclass.lpfnWndProc = WndProc; //窗口处理函数为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 = lpszClassName; //窗口类名为“窗口示例” //-----------以下进行窗口类的注册 if (!RegisterClass(&wndclass))//如果注册失败则发出警吿声音 { MessageBeep (0); return FALSE; } //创建窗口 hwnd = CreateWindow( lpszClassName, //窗口类名 lpszTitle, //窗口实例的标题名 WS_OVERLAPPEDWINDOW, //窗口 的风格 CW_USEDEFAULT, CW_USEDEFAULT, //窗口左上角坐标为默认值 CW_USEDEFAULT, CW_USEDEFAULT, //窗口的髙和宽为默认值 NULL, //此窗口无父窗口 NULL, //此窗口无主菜单 hInstance, //创建此窗口应用程序的当前句柄 NULL //不使用该值 ); ShowWindow( hwnd, nCmdShow); //显示窗口 UpdateWindow(hwnd); //绘制用户区 while( GetMessage(&Msg, NULL, 0, 0)) //消息循环 { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; //程序终止时将信息返回系统 } //定义烟花结构体 struct Fworks { COLORREF colr; int i; int delay; POINT p[18]; int a[18]; POINT init; }; //初始化每个烟花 static Fworks fw[10] = {{RGB(255,255,255), 0, rand()%100}, {RGB(0,255,0), 0, rand()%100},{RGB(255,255,0), 0, rand()%100},{RGB(0,0,255), 0, rand()%100},{RGB(255,0,255), 0, rand()%100}, {RGB(55,21,255), 0, rand()%100}, {RGB(0,125,125), 0, rand()%100},{RGB(125,255,0), 0, rand()%100},{RGB(0,125,255), 0, rand()%100},{RGB(255,125,255), 0, rand()%100}} ; //画烟花 int Create_Firework(HDC hDC, int num, RECT rect) { HPEN hP = CreatePen(PS_SOLID, 1, fw[num].colr); SelectObject(hDC, hP); int flag = 0; if (fw[num].i == 200) { if (fw[num].a[0] == 0) for (int i = 0; i < 18; i++) fw[num].p[i].x = fw[num].init.x, fw[num].p[i].y = fw[num].init.y-fw[num].i; for (int i = 0; i < 18; i++) { MoveToEx(hDC, fw[num].p[i].x, fw[num].p[i].y, NULL); fw[num].p[i].x += 10*cos(360*i*PI/18/180), fw[num].p[i].y += 10*sin(360*i*PI/180/18); LineTo(hDC, fw[num].p[i].x , fw[num].p[i].y); fw[num].a[i] += 10; } if (fw[num].a[0] == 100) { fw[num].i = 0; for (int j = 0; j < 18; j++) fw[num].a[j] = 0; fw[num].init.x = rand() % rect.right ; fw[num].init.y = rand() % rect.bottom+200; flag = 1; } } else { MoveToEx(hDC, fw[num].init.x, fw[num].init.y-fw[num].i, NULL); LineTo(hDC, fw[num].init.x, fw[num].init.y-fw[num].i+20); //printf("%d\n", fw[num].i); fw[num].i += 20; } DeleteObject(hP); if (flag) return 1; return 0; } //窗口函数 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hDC, hdc_old; HBITMAP hBmp; RECT rect; HBRUSH hBrush; PAINTSTRUCT Ps; TEXTMETRIC tm; HFONT hf; HPEN hPen; SIZE Sz; COLORREF color[7] = {RGB(255,0,0), RGB(255,165,0), RGB(255,255,0), RGB(0,255,0), RGB(0,255,255), RGB(0,0,255), RGB(139,0,255)}; static int cnt = 50; int temp; HBITMAP hBkBmp; int i; switch (message) { case WM_CREATE: //建立计时器,每0.05秒发出wm_timer的消息 SetTimer(hWnd, 1, 40, NULL); srand(time(NULL)); return 0; case WM_ERASEBKGND: return 1; case WM_PAINT: //用双缓冲方式,使动图更加顺滑 hdc_old = BeginPaint(hWnd, &Ps); hDC = CreateCompatibleDC(hdc_old); GetClientRect(hWnd,&rect); hBmp = CreateCompatibleBitmap(hdc_old,rect.right,rect.bottom); SelectObject(hDC,hBmp); //设置背景渐变色 for (i = 0; i < rect.bottom; i++) { hPen = CreatePen(PS_SOLID, 1, RGB(0,16-16*i/rect.bottom,97-97*i/rect.bottom)); SelectObject(hDC, hPen); Rectangle(hDC, rect.left, rect.top+i,rect.right,rect.top+1+i); DeleteObject(hPen); } for (i = 0; i < 10; i++) { if (fw[i].delay < cnt) Create_Firework(hDC , i, rect); } if (cnt <= 100) cnt++; //if (cnt) BitBlt(hdc_old,0,0,rect.right,rect.bottom,hDC,0,0,SRCCOPY); DeleteObject(hBmp); DeleteDC(hDC); ReleaseDC(hWnd, hDC); //释放 EndPaint(hWnd, &Ps); //结束缓制 return 0; case WM_TIMER: InvalidateRect(hWnd, NULL, 1); return 0; case WM_DESTROY: PostQuitMessage(0); //调用 PostQuitMessage 发出 WM_QUIT 消息 return 0; default: return DefWindowProc(hWnd, message, wParam, lParam); //默认时采用系统消息默认处理函数 } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人