ANSI使用C和Visual Studio 2015

sr4lhrrt  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(193)

我有一个学校项目,我们要在Zilog Z8 Encore板上使用C编写一个游戏。这是使用ANSI编写的,其中板有一个控制台输出,通过串行接口使用putty读取。然而,使用我的Windows 10计算机,我希望能够模拟程序,这样我就可以在没有硬件的情况下测试代码。问题是,我尝试使用VS 2015,其中我使用stdio而不是硬件控制器,然后将其发送到控制台。但Windows命令提示符不显示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) {};

}

这段代码在控制台内创建了一个窗口,它有不同的背景色和前景色。
任何帮助都很感激。

lx0bsm1f

lx0bsm1f1#

Windows 10确实支持ANSI序列!只需从单独的命令提示符启动.exe,而不是从Visual Studio中启动!Visual Studio打开的控制台窗口不支持ANSI,但普通的cmd.exe(标准命令提示符)支持。
一个有用的技巧是导航到你的.exe,然后在文件资源管理器窗口的地址栏中输入cmd(然后按回车键)。它将打开一个控制台,该控制台已经将当前目录设置为你在文件资源管理器中打开的相同目录,这非常方便。

相关问题