2016-06-04 13 views
0

Ich habe ein Schulprojekt, wo wir ein Spiel mit c auf ein Zilog Z8-Encore-Board codieren sollen. Dies soll mit ANSI geschrieben werden, wo die Platine einen Konsolenausgang hat, der über eine serielle Schnittstelle mit Kitt gelesen wird. Mit meinem Windows 10 Computer möchte ich jedoch in der Lage sein, das Programm zu simulieren, damit ich Code testen kann, ohne die Hardware zu haben. Das Problem ist, dass ich versucht VS 2015 zu verwenden, wo ich statt des Hardware-Controllers stdio verwendet habe, und dann an eine Konsole senden. Die Windows-Eingabeaufforderung zeigt jedoch keine ANSI-Escape-Sequenzen an. Ich habe daher versucht Conemu zu installieren, die ANSI verarbeiten kann, aber es ändert nicht die Hintergrundfarbe, nur Vordergrund. Hier ist der Code, den ich zu simulieren versuchen:ANSI mit C und Visual Studio 2015

#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) {}; 

} 

Dieser Code erstellt ein Fenster in der Konsole, mit verschiedenen Hintergrund- und Vordergrundfarbe.

Jede Hilfe wird geschätzt.

Antwort

1

Windows 10 unterstützt ANSI-Sequenzen! Starten Sie die EXE-Datei einfach über eine separate Eingabeaufforderung und nicht über Visual Studio! Das Konsolenfenster, das Visual Studio öffnet, unterstützt ANSI nicht aber das normale cmd.exe (die Standardeingabeaufforderung).

Ein nützlicher Trick dabei ist, zu Ihrer .exe zu navigieren, dann cmd in die Adressleiste des Datei-Explorer-Fensters eingeben (dann Enter drücken). Es wird eine Konsole geöffnet, in der das aktuelle Verzeichnis bereits auf das Verzeichnis eingestellt ist, das Sie im Dateiexplorer geöffnet haben. Das ist ziemlich praktisch.

+0

Das hat irgendwie funktioniert. Es hat so lange wie ConEmu, aber es ändert immer noch nicht die Hintergrundfarbe. – Nothin

+0

Interessant. Warte, lass mich deinen Code auf einem anderen Betriebssystem testen. – adam10603

+0

@Nothin Du nennst 'color (2, 0)', was den Hintergrund schwarz setzt, darum siehst du nichts. Versuchen Sie etwas anderes als 0 für die Hintergrundfarbe. – adam10603

Verwandte Themen