C 语言与 EasyX 实现 800*600 窗体:鼠标交互绘制多彩图形
以下是一个使用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. 在多线程应用中,注意消息队列的同步和访问,以避免竞争条件。 ######[AI写代码神器 | 1193点数解答 | 2025-04-22 21:23:09]
- C语言:利用EasyX实现鼠标交互绘图,新增Ctrl组合键绘制正方形功能(百度文心 | 770点数解答 | 2025-04-22 21:45:53)193
- Python mainwindow.py 实现图书列表界面:含数据持久化、排序与友好交互功能(字节豆包 | 90点数解答 | 2024-12-03 20:57:34)267
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)368
- 揭秘!十进制整数转其他进制用啥存储结构最合适?答案竟是它!(字节豆包 | 57点数解答 | 2024-11-13 01:21:11)254
- Python 继承实现:部门经理信息输入与月工资精准计算(讯飞星火 | 937点数解答 | 2024-06-25 18:21:42)248
- 代码揭秘:如何绘制透视投影的立方体(阿里通义 | 678点数解答 | 2024-12-18 21:14:09)206
- 计算机图形学:用 GL 程序实现透视投影立方体绘制及关键逻辑解析(阿里通义 | 830点数解答 | 2024-12-18 21:44:24)238
- 计算机图形学:用GL填充代码绘制透视投影立方体(字节豆包 | 201点数解答 | 2024-12-18 21:45:10)171
- HTML与SVG绘面部比例参考图:代码解析、优化建议与逻辑要点 (字节豆包 | 183点数解答 | 2025-05-27 10:50:17)133
- 培训机构学员成绩提升:C++代码实现年龄与NOIP成绩更新(DeepSeek | 178点数解答 | 2025-12-31 12:20:24)75
- Python+Tkinter:打造30以内加减乘除随机出题、判题打分GUI小程序(GPT | 1266点数解答 | 2024-06-19 14:45:56)340
- MATLAB 代码:打造“正方形与闭合曲线识别”图形用户界面 (字节豆包 | 193点数解答 | 2024-11-13 19:58:57)229