【发布时间】:2019-08-23 15:33:53
【问题描述】:
我正在为控制台终端编写一个动态调色板。问题是让 ANSI ESC 序列在默认的 wincon 终端中工作就足以将这些标志设置为控制台的句柄:
DWORD dwRequestedOutModes = ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN;
DWORD dwRequestedInModes = ENABLE_VIRTUAL_TERMINAL_INPUT;
但使用它们是另一回事。现在我的控制台引擎输出使用CHAR_INFO 和WriteConsoleOutputW() 制作的屏幕缓冲区,但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 总结。
问题是:如何使用 Escape 序列为控制台的输出着色,以及将它们放置在哪里,它能够打印如下内容:
使用 ' ' char(space) 并将背景颜色设置为 ESC [48 ; 2; r; G ; b 或 ESC [48 ; 5; s
【问题讨论】:
-
@lurker 我找到了,但除了 printf() 之外我什么也没找到。我需要一些东西来将 ESC 应用于屏幕上的每个字符,它们都定义为整个终端的空格
-
您可以使用
printf或putc。为什么不能使用其中之一来输出转义码和单个字符? -
@lurker 因为它们有 320*84 个,每个都可以更改其状态。这是一张图片
-
显然你需要循环和变量。无论您如何输出代码,这都是正确的。例如,循环使用
r、g和/或b与printf("\x1b[\x30;\x2;%c;%c;%c", r, g, b)的值。或类似的东西......
标签: c colors windows-console