Функция SetConsoleCursorPosition () не работает должным образом в C ++ - PullRequest
0 голосов
/ 28 января 2020

В настоящее время я работаю над программой "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, она также работает с помощью этой функции. Но это не работает, как ожидалось ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...