酷代码 AI
菜单

用c++写一个图形界面程序,有七个球,可以点击球然后按上下左右键移动球,七个球的颜色分别为红、橙、黄、绿、青、蓝、紫。不含第三方内容

在C++里,仅依靠标准库无法直接构建图形界面程序,不过可以借助Windows API来实现有图形界面、能操作移动彩色球的需求。以下是完整示例代码: ```cpp #include <windows.h> // 球的结构体 struct Ball { int x; int y; int radius; COLORREF color; bool isSelected; }; // 全局变量 Ball balls[7]; Ball* selectedBall = nullptr; // 窗口过程函数 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: { // 初始化七个球 int offset = 50; COLORREF colors[7] = { RGB(255, 0, 0), RGB(255, 165, 0), RGB(255, 255, 0), RGB(0, 128, 0), RGB(0, 255, 255), RGB(0, 0, 255), RGB(128, 0, 128) }; for (int i = 0; i < 7; i++) { balls[i].x = 100 + i * offset; balls[i].y = 100; balls[i].radius = 20; balls[i].color = colors[i]; balls[i].isSelected = false; } break; } case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); for (int i = 0; i < 7; i++) { HBRUSH hBrush = CreateSolidBrush(balls[i].color); SelectObject(hdc, hBrush); Ellipse(hdc, balls[i].x - balls[i].radius, balls[i].y - balls[i].radius, balls[i].x + balls[i].radius, balls[i].y + balls[i].radius); DeleteObject(hBrush); } EndPaint(hwnd, &ps); break; } case WM_LBUTTONDOWN: { int x = LOWORD(lParam); int y = HIWORD(lParam); selectedBall = nullptr; for (int i = 0; i < 7; i++) { int dx = x - balls[i].x; int dy = y - balls[i].y; if (dx * dx + dy * dy <= balls[i].radius * balls[i].radius) { selectedBall = &balls[i]; for (int j = 0; j < 7; j++) { balls[j].isSelected = false; } selectedBall->isSelected = true; InvalidateRect(hwnd, NULL, TRUE); break; } } break; } case WM_KEYDOWN: { if (selectedBall != nullptr) { switch (wParam) { case VK_UP: selectedBall->y -= 5; break; case VK_DOWN: selectedBall->y += 5; break; case VK_LEFT: selectedBall->x -= 5; break; case VK_RIGHT: selectedBall->x += 5; break; } InvalidateRect(hwnd, NULL, TRUE); } break; } case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } // 主函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { // 注册窗口类 const char CLASS_NAME[] = "BallWindowClass"; WNDCLASS wc = {}; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.lpszClassName = CLASS_NAME; RegisterClass(&wc); // 创建窗口 HWND hwnd = CreateWindowEx( 0, // 额外的样式 CLASS_NAME, // 窗口类名 "Ball Mover", // 窗口 WS_OVERLAPPEDWINDOW, // 窗口样式 CW_USEDEFAULT, CW_USEDEFAULT, // 初始x,y位置 800, 600, // 初始宽度和高度 NULL, // 父窗口句柄 NULL, // 菜单句柄 hInstance, // 实例句柄 NULL // 创建参数 ); if (hwnd == NULL) { return 0; } // 显示和更新窗口 ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); // 消息循环 MSG msg = {}; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } ``` 代码说明: 1. `Ball`结构体:用来表示球,包含球的位置`(x, y)`、半径`radius`、颜色`color`以及是否被选中的标识`isSelected`。 2. `WndProc`函数:是窗口过程函数,处理多种窗口消息,像创建窗口、绘制窗口、鼠标点击和按键操作等。 - `WM_CREATE`:在窗口创建时初始化七个球的位置、颜色,并将它们设置为未选中状态。 - `WM_PAINT`:绘制七个球到窗口上。 - `WM_LBUTTONDOWN`:处理鼠标左键点击事件,检查点击位置是否在某个球内,如果是则选中该球。 - `WM_KEYDOWN`:处理按键事件,当有球被选中时,根据按下的方向键移动该球。 - `WM_DESTROY`:在窗口关闭时退出消息循环。 3. `WinMain`函数:是程序入口,负责注册窗口类、创建窗口、显示并更新窗口,最后进入消息循环。 运行方式: 将上述代码保存为`.cpp`文件,使用支持Windows API的C++编译器(如Visual Studio)进行编译和运行。运行后会弹出一个窗口,里面有七个不同颜色的球,可以点击球后使用上下左右键移动选中的球。 [2026-01-23 08:17:01 | AI问答 | 1560点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多