gpt4 book ai didi

c - 如何使用ESC序列设置前景色?

转载 作者:行者123 更新时间:2023-11-30 16:19:52 25 4
gpt4 key购买 nike

我正在为控制台终端编写动态调色板。问题是让 ANSI ESC 序列在默认的 wincon 终端中工作就足以将这些标志设置为控制台的句柄:

    DWORD dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN;
DWORD dwRequestedInModes = ENABLE_VIRTUAL_TERMINAL_INPUT;

但使用它们是另一回事。现在,我的控制台引擎输出使用 CHAR_INFOWriteConsoleOutputW() 制作的屏幕缓冲区,但 CHAR_INFO 本身仅支持 16 种默认方案颜色。

使用 CONSOLE_SCREEN_BUFFER_INFOEX 再次受到 16 种颜色的限制,但这次是自定义的。

使用控制台 ESC 序列是一个好点,但问题是我只找到了使用 printf() 的示例。对于我的项目 printf 太慢且不可靠,是否有其他方法可以将 ESC 序列分配给缓冲区中的每个符号。

这是我的代码示例:

WriteConsoleOutputW(this->m_hConsole, this->localFrame, (COORD){ (short)this->m_nScreenWidth, (short)this->m_nScreenHeight }, (COORD){ 0,0 }, &this->m_rectWindow);

绘图例程:localFrame是CHAR_INFO指针

void PrintFrameW(void* self, int x, int y, wchar_t character, short color)
{
struct c_class* this = self;
if (x >= 0 && x < this->nFrameLength&&y >= 0 && y < this->nFrameHeight)
{
this->localFrame[y*this->nFrameLength + x].Char.UnicodeChar = character;
this->localFrame[y*this->nFrameLength + x].Attributes = color;
}
}

它看起来像 C++ 代码,但这是我自己编写的带类的 C 代码,因此它是出于教育目的而制作的 ANSI-C 总结。

问题是:如何使用转义序列对控制台的输出进行着色,以及将它们放在哪里,并且能够打印如下内容:

enter image description here

使用 ' ' char(space) 并将背景颜色设置为 ESC [48 ; 2 ; ; G ; b 或 ESC [48 ; 5 ;

最佳答案

事实证明,低级函数可以在控制台中编写一些内容,而无需进行任何检查。为此,只需要两件事:字符缓冲区和 WriteFile()。

char lfbuf[5120U] = { '\x1b','[','3','8',';','2',';','1','0','0',';','0',';','0','m','w','\0' };



DWORD const lfbuf_length = (DWORD)(17);

DWORD written;
WriteFile(hOut, lfbuf, lfbuf_length, &written, NULL);

其中 hOut 是控制台句柄。事实证明,这个数据正在由终端处理,而且速度很快,因为它只持续几千个时钟周期。我必须反转整个 printf() 才能找到这个。也许有更快的东西,但 WriteFile 是不可逆的,当我伸手进行汇编时它会停止执行。

关于c - 如何使用ESC序列设置前景色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55472554/

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