ANSI с использованием C и Visual Studio 2015

У меня есть школьный проект, в котором мы должны закодировать игру, используя c, на плате Zilog Z8 encore. Это должно быть написано с использованием ANSI, где плата имеет консольный выход, который читается с помощью замазки через последовательный интерфейс. Однако, используя мой компьютер с Windows 10, я хотел бы иметь возможность имитировать программу, чтобы я мог тестировать код без аппаратного обеспечения. Проблема в том, что я пытался использовать VS 2015, где я использовал stdio вместо аппаратного контроллера, а затем отправил его на консоль. Но командная строка Windows не показывает escape-последовательности ANSI. Поэтому я попытался установить conemu, который может обрабатывать ANSI, но он не меняет цвет фона, а только передний план. Вот код, который я пытаюсь смоделировать:

#include <string.h>
#include <stdio.h>

#define ESC 0x1B

void fgcolor(int foreground) {
    /*  Value      foreground     Value     foreground
    ------------------------------------------------
    0        Black            8       Dark Gray
    1        Red              9       Light Red
    2        Green           10       Light Green
    3        Brown           11       Yellow
    4        Blue            12       Light Blue
    5        Purple          13       Light Purple
    6        Cyan            14       Light Cyan
    7        Light Gray      15       White
    */
    int type = 22;             // normal text
    if (foreground > 7) {
        type = 1;                // bold text
        foreground -= 8;
    }
    printf("%c[%d;%dm", ESC, type, foreground + 30);
}

void bgcolor(int background) {
    /* IMPORTANT:   When you first use this function you cannot get back to true white background in HyperTerminal.
    Why is that? Because ANSI does not support true white background (ANSI white is gray to most human eyes).
    The designers of HyperTerminal, however, preferred black text on white background, which is why
    the colors are initially like that, but when the background color is first changed there is no
    way comming back.
    Hint:        Use resetbgcolor(); clrscr(); to force HyperTerminal into gray text on black background.

    Value      Color
    ------------------
    0        Black
    1        Red
    2        Green
    3        Brown
    4        Blue
    5        Purple
    6        Cyan
    7        Gray
    */
    printf("%c[%dm", ESC, background + 40);
}

void color(int foreground, int background) {
    // combination of fgcolor() and bgcolor() - uses less bandwidth
    int type = 22;             // normal text
    if (foreground > 7) {
        type = 1;                // bold text
        foreground -= 8;
    }
    printf("%c[%d;%d;%dm", ESC, type, foreground + 30, background + 40);
}

void resetbgcolor() {
    // gray on black text, no underline, no blink, no reverse
    printf("%c[m", ESC);
}

void clrscr() {
    printf("%c[2J", ESC);
}

void clreol() {
    printf("%c[K", ESC);
}
void gotoxy(int x, int y) {
    printf("%c[%d;%dH", ESC, y, x);
}

void underline(char on) {
    if (on == 'y') {
        printf("%c[4m", ESC);
    }
    else if (on == 'n') {
        printf("%c[24m", ESC);
    }
}

void blink(char on) {
    if (on == 'y') {
        printf("%c[5m", ESC);
    }
    else if (on == 'n') {
        printf("%c[25m", ESC);
    }
}

void reverse(char on) {
    if (on == 'y') {
        printf("%c[7m", ESC);
    }
    else if (on == 'n') {
        printf("%c[27m", ESC);
    }
}
void normal() {
    printf("%c[0;22m", ESC);
}


void window(int x1, int y1, int x2, int y2, char * c, int stil) {
    int length = strlen(c);
    int i = 0;
    char kanter[2][9] = { { 218,180,195,191,179,192,196,217 },{ 201,185,204,187,186,200,205,188 } };

    if (stil != 1) {
        stil = 0;
    }


    //color(2,5);
    gotoxy(x1, y1);
    printf("%c%c", kanter[stil][0], kanter[stil][1]);
    reverse('y');
    printf("  %s", c);
    gotoxy(x1 + 4 + length, y1);
    for (i = 0; i < x2 - (x1 + 5 + length); i++) {
        printf(" ");
    }
    reverse('n');
    printf("%c%c", kanter[stil][2], kanter[stil][3]);

    for (i = y1 + 1; i < y2; i++) {
        gotoxy(x1, i);
        printf("%c", kanter[stil][4]);
        gotoxy(x2, i);
        printf("%c", kanter[stil][4]);
    }

    gotoxy(x1, y2);
    printf("%c", kanter[stil][5]);
    for (i = 0; i < x2 - x1 - 1; i++) {
        printf("%c", kanter[stil][6]);
    }
    printf("%c\n", kanter[stil][7]);

    normal();
}
void up(int x) {
    printf("%c[%dA", ESC, x);
}

void down(int x) {
    printf("%c[%dB", ESC, x);
}

void right(int x) {
    printf("%c[%dC", ESC, x);
}
void left(int x) {
    printf("%c[%dD", ESC, x);
}
void main() {
    printf("hej");
    color(2, 0);
    clrscr();
    printf("\n");
    window(3, 4, 20, 15, "hej", 1);

    up(5);
    right(5);

    //  window(21, 12, 35, 30, "Farvel", 0);


    while (1 != 2) {};

}

Этот код создает окно внутри консоли с другим фоном и цветом переднего плана.

Любая помощь приветствуется.


person Nothin    schedule 04.06.2016    source источник


Ответы (1)


Windows 10 поддерживает последовательности ANSI! Просто запустите свой .exe из отдельной командной строки, а не из Visual Studio! Окно консоли, которое открывает Visual Studio, не поддерживает ANSI, но обычное cmd.exe (стандартная командная строка) поддерживает.

Полезный трюк при этом — перейти к вашему .exe, а затем ввести cmd в адресную строку окна проводника (затем нажмите Enter). Он откроет консоль, в которой текущий каталог уже установлен на тот же каталог, который вы открыли в проводнике, что очень удобно.

person notadam    schedule 04.06.2016
comment
Это вроде сработало. Это продолжалось так же долго, как использование ConEmu, однако он по-прежнему не меняет цвет фона. - person Nothin; 04.06.2016
comment
Интересно. Подождите, позвольте мне протестировать ваш код на другой ОС. - person notadam; 04.06.2016
comment
@Nothin Вы вызываете color(2, 0), который устанавливает черный фон, поэтому вы ничего не видите. Попробуйте что-нибудь кроме 0 для цвета фона. - person notadam; 04.06.2016
comment
Не волнуйтесь, видимо, я просто тупой. Цвет вызова (int a, int b) меняет цвет переднего плана и фона. Я только что установил черный цвет фона. Спасибо за помощь, очень признателен! :-) - person Nothin; 04.06.2016