为了在你的代码中添加按下 `Ctrl+鼠标左键` 绘制红色正方形和 `Ctrl+鼠标右键` 绘制蓝色正方形的功能,你可以使用 `GetKeyState` 函数来检查 `Ctrl` 键是否被按下。以下是修改后的代码: ```c #include <easyx.h> #include <stdio.h> #include <graphics.h> int main() { initgraph(800, 600); setbkcolor(WHITE); cleardevice(); ExMessage msg; while (1) { msg = getmessage(EX_MOUSE); switch (msg.message) { case WM_MOUSEMOVE://鼠标移动,半径2黑色圆点 setfillcolor(BLACK); solidcircle(msg.x, msg.y, 2); break; case WM_LBUTTONDOWN://鼠标左键,半径10红色圆点 if (GetKeyState(VK_CONTROL) < 0) // 检查Ctrl键是否被按下 { setfillcolor(RED); bar(msg.x - 10, msg.y - 10, msg.x + 10, msg.y + 10); // 绘制边长为20的红色正方形 } else { setfillcolor(RED); solidcircle(msg.x, msg.y, 10); // 半径10的红色圆点 } break; case WM_RBUTTONDOWN://鼠标右键,半径10蓝色圆点 if (GetKeyState(VK_CONTROL) < 0) // 检查Ctrl键是否被按下 { setfillcolor(BLUE); bar(msg.x - 10, msg.y - 10, msg.x + 10, msg.y + 10); // 绘制边长为20的蓝色正方形 } else { setfillcolor(BLUE); solidcircle(msg.x, msg.y, 10); // 半径10的蓝色圆点 } break; } } closegraph(); // 添加关闭图形窗口的代码,以便在程序退出时正确释放资源 return 0; // 添加返回值,虽然在这个例子中它不会被执行到,但这是一个好习惯 } ``` 注意几点: 1. `bar` 函数:用于绘制填充矩形。这里我们用它来绘制正方形。参数分别是矩形的左上角和右下角的坐标。 2. `GetKeyState(VK_CONTROL) < 0`:检查 `Ctrl` 键是否被按下。如果 `Ctrl` 键被按下,`GetKeyState` 会返回一个负值。 3. 清除先前的绘制:在这个简单的例子中,每次鼠标移动或点击时都会重新绘制一个小圆点,这实际上会覆盖先前的绘制。如果你想要保持先前的绘制不被覆盖,你需要设计一个更复杂的状态管理机制来跟踪和重新绘制所有先前的图形。在这个例子中,为了简单起见,我们没有实现这一点。 4. 关闭图形窗口:添加了 `closegraph()` 函数调用,以确保在程序退出时正确释放图形资源。虽然在这个无限循环的例子中它实际上不会被执行到,但在实际开发中,确保资源被正确释放是一个好习惯。 5. 返回值:虽然在这个无限循环的程序中返回值不会被用到,但添加 `return 0;` 是一个良好的编程习惯,表示程序正常结束。 [2025-04-22 21:45:53 | AI写代码神器 | 770点数解答]