字符在更改颜色并向后打印时重叠

时间:2012-01-21 16:52:02

标签: c++ windows visual-studio console textcolor

enter image description here

正如你所看到的那样,即使有足够的空间,上部的暗X也会被切断。

这是因为它们已经改变颜色并向后打印(从右到左)。

这是一个错误,错误的代码,我的系统上的错误设置或(我怀疑它)应该是这样吗?

以下是生成此输出的代码:

#include <Windows.h>
#include <iostream>
void moveTo(int x,int y){
    COORD kord={x,y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),kord);
}
void setColor(WORD attributes){
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), attributes);
}

void main(){
    for(int i=9;i+1;i--)
    {
        moveTo(i,0);
        std::cout.put('X');
    }
    for(int i=-10;i;i++)
    {
        moveTo(i+10,1);
        std::cout.put('X');
    }
    setColor(8);
    for(int i=9;i+1;i--)
    {
        moveTo(i,2);
        std::cout.put('X');
    }
    for(int i=-10;i;i++)
    {
        moveTo(i+10,3);
        std::cout.put('X');
    }
    setColor(7);
    for(int i=9;i+1;i--)
    {
        moveTo(i,4);
        std::cout.put('X');
    }
    for(int i=-10;i;i++)
    {
        moveTo(i+10,5);
        std::cout.put('X');
    }
    std::cin.get();
}

1 个答案:

答案 0 :(得分:4)

这是Windows中的一个错误。

正如Hans Passant所述的勘误表所述:

  

我也是repro,VS2008在Win7上。酷虫。更改控制台字体可以修复它。

让我们使用此错误隔离。我将此字体识别为Petite Terminal,这意味着您最有可能将此项目配置为Win32控制台应用程序。 GCC的附加副本证实了这一假设,从实际角度来看,我们将假设你们所有人都在Windows终端内部运行32位控制台应用程序。

问题变成为什么它在默认终端字体的上下文中正好写了一个额外的像素列,颜色为8,然后向后写入console screen buffer.

具体来说,让我们将这个问题分解为其组成部分:

  1. 发出写入时,会将字符写入终端数组中的某个位置
  2. 选择默认颜色(7)时,像素不会溢出到数组中的其他缓冲区
  3. 当选择了颜色8时,会将另一列像素写入缓冲区的下一个区域,只有在向后背诵文本时才可见
  4. 由于(3)中存在溢出,这是一个错误。

    Quoting Raymond Chen:

      

    控制台渲染模型假设每个角色都整齐地适合内部   它的固定大小的细胞。当一个新字符写入一个单元格时,   老单元格用新角色套印,但如果旧的   字符有悬垂或下悬,剩下那些额外的像素   因为他们&#34;溢出&#34;所需的细胞和感染   相邻细胞。同样,如果一个邻居角色溢出&#34;,   那些&#34;溢出像素&#34;会被抹去。

         

    修剪了可在控制台窗口中使用的字体集   测试并知道在控制台中可以接受的字体   视窗。对于英语系统,这将我们带到了Lucida Console   和终端。

         

    ...

         

    &#34;嗯,那是愚蠢的。你应该阻止我选择字体   这显然导致了废话。&#34;

         

    这就是我们所做的。

    并不是说我把雷蒙德归咎于雷蒙德,但他权威地将此描述为“不可能发生的事情。”&#34;

    Windows的控制台字体的选择和测试应该已经抓住了这一点。事实上它甚至是一个问题都是一种失常。