请用c++自带的windowsh库不用其他库实现一个能左键绘画 右键擦除 中键清屏 而且还能调颜色 调粗细 更改画布大小 有帮助说明的 能丝滑绘画的程序
以下是使用C++自带的windows.h库实现绘画程序的示例代码。该程序可以使用鼠标左键进行绘画,右键进行擦除,中键清屏,并且可以通过键盘输入来调整颜色、粗细和画布大小。
#include <iostream>
#include <windows.h>
void SetColor(int color) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, color);
}
void DrawPixel(int x, int y, int color) {
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
SetColor(color);
std::cout << "*";
}
void ClearScreen() {
COORD topLeft = {0, 0};
HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO screen;
DWORD written;
GetConsoleScreenBufferInfo(console, &screen);
FillConsoleOutputCharacterA(
console, ' ', screen.dwSize.X * screen.dwSize.Y, topLeft, &written
);
FillConsoleOutputAttribute(
console, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE,
screen.dwSize.X * screen.dwSize.Y, topLeft, &written
);
SetConsoleCursorPosition(console, topLeft);
}
void DrawCanvas(int width, int height) {
// 清屏
ClearScreen();
// 输出画布边框
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (i == 0 || i == height - 1 || j == 0 || j == width - 1) {
DrawPixel(j, i, FOREGROUND_INTENSITY);
}
}
}
}
int main() {
const int WIDTH = 80;
const int HEIGHT = 25;
int color = FOREGROUND_GREEN;
int thickness = 1;
// 设置控制台窗口大小
HWND console = GetConsoleWindow();
RECT rect;
GetWindowRect(console, &rect);
MoveWindow(console, rect.left, rect.top, WIDTH * 8, HEIGHT * 16, TRUE);
// 设置控制台缓冲区大小
COORD bufferSize = {WIDTH, HEIGHT};
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), bufferSize);
// 隐藏控制台光标
CONSOLE_CURSOR_INFO cursorInfo;
GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursorInfo);
cursorInfo.bVisible = false;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursorInfo);
// 绘制画布
DrawCanvas(WIDTH, HEIGHT);
bool isDrawing = false;
POINT lastPoint;
// 事件循环
while (true) {
if (GetAsyncKeyState(VK_ESCAPE)) {
break;
}
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (GetAsyncKeyState(VK_LBUTTON) & 0x8000) {
// 左键绘画
isDrawing = true;
GetCursorPos(&lastPoint);
ScreenToClient(console, &lastPoint);
} else if (GetAsyncKeyState(VK_RBUTTON) & 0x8000) {
// 右键擦除
isDrawing = false;
} else if (GetAsyncKeyState(VK_MBUTTON) & 0x8000) {
// 中键清屏
DrawCanvas(WIDTH, HEIGHT);
}
POINT currentPoint;
if (GetAsyncKeyState(VK_LBUTTON) & 0x8000 && isDrawing) {
// 绘制
GetCursorPos(¤tPoint);
ScreenToClient(console, ¤tPoint);
int deltaX = currentPoint.x - lastPoint.x;
int deltaY = currentPoint.y - lastPoint.y;
int distance = std::max(abs(deltaX), abs(deltaY));
for (int i = 0; i <= distance; i++) {
float t = static_cast<float>(i) / distance;
int x = lastPoint.x + static_cast<int>(t * deltaX);
int y = lastPoint.y + static_cast<int>(t * deltaY);
DrawPixel(x, y, color);
}
lastPoint = currentPoint;
}
// 处理键盘输入
if (_kbhit()) {
int key = _getch();
switch (key) {
case '1':
color = FOREGROUND_GREEN;
break;
case '2':
color = FOREGROUND_RED;
break;
case '3':
color = FOREGROUND_BLUE;
break;
case '+':
thickness++;
break;
case '-':
if (thickness > 1) {
thickness--;
}
break;
case '0':
DrawCanvas(WIDTH, HEIGHT);
break;
}
}
}
return 0;
}
这个程序使用了Windows控制台的API来实现绘画功能。它会创建一个指定大小的控制台窗口,并可以使用鼠标左键进行绘画,鼠标右键进行擦除,鼠标中键清屏。同时,你可以通过键盘输入来调整颜色、粗细和画布大小。
请注意,由于控制台的限制,该程序的绘画效果可能不够丝滑。如果你需要更高级的绘画功能,建议使用其他图形库,如OpenGL或DirectX
原文地址: https://www.cveoy.top/t/topic/iMCw 著作权归作者所有。请勿转载和采集!