酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

使用c和easyx创建800*600窗体,背景白色,鼠标移动时,在当前位置绘制半径为2的黑色圆形,按下ctrl+鼠标左键,绘制边长为20的红色正方形,仅左键,绘制半径为10的红色圆点;按下ctrl+鼠标右键,绘制边长为20的蓝色正方形,仅右键,绘制半径为10的蓝色圆点

以下是一个使用C语言和EasyX图形库创建指定功能的示例代码。这个示例代码会创建一个800x600像素的窗体,为白色。在鼠标移动时,会在当前位置绘制一个半径为2的黑色圆形。按下Ctrl+鼠标左键时,绘制一个边长为20的红色正方形;仅鼠标左键时,绘制一个半径为10的红色圆点。按下Ctrl+鼠标右键时,绘制一个边长为20的蓝色正方形;仅鼠标右键时,绘制一个半径为10的蓝色圆点。 ```c #include <graphics.h> #include <conio.h> // 窗体宽度和高度 const int WINDOW_WIDTH = 800; const int WINDOW_HEIGHT = 600; // 绘制移动时的黑色圆形 void drawMovingCircle(int x, int y) { setfillcolor(BLACK); solidcircle(x, y, 2); } // 绘制红色正方形 void drawRedSquare(int x, int y) { setfillcolor(RED); bar(x - 10, y - 10, x + 10, y + 10); } // 绘制红色圆点 void drawRedDot(int x, int y) { setfillcolor(RED); solidcircle(x, y, 10); } // 绘制蓝色正方形 void drawBlueSquare(int x, int y) { setfillcolor(BLUE); bar(x - 10, y - 10, x + 10, y + 10); } // 绘制蓝色圆点 void drawBlueDot(int x, int y) { setfillcolor(BLUE); solidcircle(x, y, 10); } int main() { // 初始化图形窗口 initgraph(WINDOW_WIDTH, WINDOW_HEIGHT); setbkcolor(WHITE); cleardevice(); // 鼠标移动和按键状态变量 bool leftButtonDown = false; bool rightButtonDown = false; bool ctrlPressed = false; int lastMouseX, lastMouseY; // 获取初始鼠标位置 MOUSEMSG msg; PeekMessage(&msg, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE); lastMouseX = msg.x; lastMouseY = msg.y; drawMovingCircle(lastMouseX, lastMouseY); while (true) { // 检查消息队列 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { // 处理鼠标移动消息 if (msg.message == WM_MOUSEMOVE) { // 清除上一个位置的黑圆 drawMovingCircle(lastMouseX, lastMouseY); // 更新位置 lastMouseX = msg.x; lastMouseY = msg.y; // 绘制新的黑圆 drawMovingCircle(lastMouseX, lastMouseY); } // 处理鼠标左键按下消息 else if (msg.message == WM_LBUTTONDOWN) { leftButtonDown = true; if (GetKeyState(VK_CONTROL) < 0) { drawRedSquare(msg.x, msg.y); } else { drawRedDot(msg.x, msg.y); } } // 处理鼠标左键抬起消息 else if (msg.message == WM_LBUTTONUP) { leftButtonDown = false; } // 处理鼠标右键按下消息 else if (msg.message == WM_RBUTTONDOWN) { rightButtonDown = true; if (GetKeyState(VK_CONTROL) < 0) { drawBlueSquare(msg.x, msg.y); } else { drawBlueDot(msg.x, msg.y); } } // 处理鼠标右键抬起消息 else if (msg.message == WM_RBUTTONUP) { rightButtonDown = false; } // 处理键盘按键消息 else if (msg.message == WM_KEYDOWN) { if (msg.wParam == VK_CONTROL) { ctrlPressed = true; } } // 处理键盘抬键消息 else if (msg.message == WM_KEYUP) { if (msg.wParam == VK_CONTROL) { ctrlPressed = false; } } } // 检查退出条件(例如按下ESC键) if (_kbhit() && _getch() == 27) { // 27 是 ESC 键的 ASCII 码 break; } } // 关闭图形窗口 closegraph(); return 0; } ``` 额外需要注意的逻辑点: 1. 在实际开发中,建议对窗口的关闭事件进行处理,以确保资源正确释放。 2. 如果需要在窗口大小改变时保持绘图比例或行为一致,可以处理窗口的 `WM_SIZE` 消息。 3. 在多线程应用中,注意消息队列的同步和访问,以避免竞争条件。 [2025-04-22 21:23:09 | AI写代码神器 | 1193点数解答]

相关提问