В настоящее время я работаю над программой "Windows Simulator" на C ++. Я всегда использую функцию SetConsoleCursorPosition (). Эта функция работает отлично, ничего плохого. Прежде чем продолжить, проверьте этот код:
#include <iostream>
#include <conio.h>
#include <windows.h>
#define KEY_UP 72
#define KEY_DOWN 80
#define KEY_LEFT 75
#define KEY_RIGHT 77
#define RETURN 13
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE color = handle;
using namespace std;
int getKey() {
int c = getch();
while (true) {
switch (c) {
case KEY_UP:
return 1;
break;
case KEY_DOWN:
return 2;
break;
case KEY_LEFT:
return 3;
break;
case KEY_RIGHT:
return 4;
break;
case RETURN:
return 5;
break;
default:
return c;
break;
}
}
}
void ShowConsoleCursor(bool showFlag) {
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursorInfo;
GetConsoleCursorInfo(out, &cursorInfo);
cursorInfo.bVisible = showFlag;
SetConsoleCursorInfo(out, &cursorInfo);
}
void gotoxy(int x, int y) {
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(handle, coord);
}
class WINMGR {
int cursorX = 0;
int cursorY = 1;
char charBeforeCur = 'E';
int charColBeforeCur = 1;
public:
void moveCursor(int X, int Y, char coords) {
int XMax = 30;
int YMax = 120;
if ((coords == 'X' && cursorX + X != -1) || (coords == 'Y' && cursorY + Y != -1 )) {
cursorX = cursorX + X;
cursorY = cursorY + Y;
gotoxy(cursorX, cursorY);
}
}
void printGUI() {
SetConsoleTextAttribute(color, 112);
for (int i = 1; i < 30; i++) {
cout << " ";
cout << " \n";
}
SetConsoleTextAttribute(color, 144);
cout << " START | O O O | 12:00 AM ";
}
void createWindow(int X, int Y, int sizeX, int sizeY) {
gotoxy(X, Y);
SetConsoleTextAttribute(color, 496);
for (int i = 0; i < sizeX; i++) {
cout << " ";
}
for (int i = 0; i < sizeY - 1; i++) {
gotoxy(X, Y + i + 1);
cout << " ";
SetConsoleTextAttribute(color, 128);
for (int i2 = 0; i2 < (X + (sizeX - 4)); i2++) {
cout << " ";
}
SetConsoleTextAttribute(color, 496);
cout << " ";
}
gotoxy(X, Y + sizeY - 1);
for (int i = 0; i < sizeX; i++) {
cout << " ";
}
moveCursor(0, 0, 'X');
}
void blueScreen() {
system("CLS");
system("color 10");
gotoxy(41, 9);
SetConsoleTextAttribute(color, 240);
cout << " Windows ";
}
};
int main()
{
WINMGR mgr;
system("mode con: lines=30 cols=120");
mgr.printGUI();
while (true) {
int c = getKey();
switch (c) {
case 1:
mgr.moveCursor(0, -1, 'Y');
break;
case 2:
mgr.moveCursor(0, 1, 'Y');
break;
case 3:
mgr.moveCursor(-1, 0, 'X');
break;
case 4:
mgr.moveCursor(1, 0, 'X');
break;
case 5:
mgr.createWindow(15, 60, 30, 30);
gotoxy(17, 63);
cout << "RETURN";
break;
}
}
}
Скомпилируйте этот код и запустите его. Когда вы запустили его, вы можете перемещать курсор консоли с помощью клавиш со стрелками. Это с помощью функции SetConsoleCursorPosition (). Но, когда вы пытаетесь нажать enter «RETURN», он выполняет код из строки 157. Если вы проверяете функцию createWindow, она также работает с помощью этой функции. Но это не работает, как ожидалось ...