gpt4 book ai didi

c - 使用 C 和 Visual Studio 2015 的 ANSI

转载 作者:行者123 更新时间:2023-11-30 15:08:07 25 4
gpt4 key购买 nike

我有一个学校项目,我们将使用 c 在 Zilog Z8 encore 板上编写一个游戏。这是使用 ANSI 编写的,其中板有一个控制台输出,可以使用 putty 通过串行接口(interface)读取该输出。但是,使用我的 Windows 10 计算机,我希望能够模拟该程序,以便我可以在没有硬件的情况下测试代码。问题是,我尝试使用 VS 2015,其中我使用 stdio 而不是硬件 Controller ,然后将其发送到控制台。但 Windows 命令提示符不显示 ANSI 转义序列。因此我尝试安装可以处理ANSI的conemu,但它不会改变背景颜色,只会改变前景。这是我试图模拟的代码:

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

}

此代码在控制台内创建一个具有不同背景和前景色的窗口。

感谢任何帮助。

最佳答案

Windows 10 确实支持 ANSI 序列!只需从单独的命令提示符启动 .exe,而不是从 Visual Studio 中启动! Visual Studio 打开的控制台窗口不支持 ANSI,但普通的 cmd.exe(标准命令提示符)支持。

执行此操作时,一个有用的技巧是导航到 .exe,然后在文件资源管理器窗口的地址栏中键入 cmd(然后按 Enter 键)。它将打开一个控制台,该控制台已将当前目录设置为您在文件资源管理器中打开的同一目录,这非常方便。

关于c - 使用 C 和 Visual Studio 2015 的 ANSI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37629738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com