当字符改变颜色并向后打印时字符重叠

正如你所看到的那样,即使有空间,上部黑色的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();
}

这是Windows中的一个错误。

正如Hans Passant在勘误中所提到的那样:

我也重申,VS2008在Win7上。 很酷的bug。 更改控制台字体可以修复它。

让我们使用这个bug隔离。 我将这种字体识别为Petite Terminal,这意味着你们很可能将这个项目配置为Win32控制台应用程序。 使用GCC的附加repro证实了这一假设,并且我们将从实际的角度出发,假设你们都获得了在Windows终端内部运行的32位控制台应用程序。

这个问题变成了为什么它在默认的终端字体(颜色8)的上下文中正好写入一个额外的像素列,然后向后写入控制台屏幕缓冲区。

具体来说,让我们把这个问题分解成它的组成部分:

  • 发出写入时,会将字符写入终端阵列中的某个位置
  • 当选择默认颜色(7)时,像素不会溢出到阵列中的其他缓冲区
  • 当选择颜色8时,附加的像素列被写入到缓冲区的下一个区域,该区域仅在文本向后叙述时才可见
  • 由于(3)中存在溢出现象,这是一个错误。

    引用雷蒙德:

    控制台渲染模型假定每个字符都适合在其固定大小的单元格内。 当一个新字符写入一个单元格时,旧单元格将被新字符覆盖,但是如果旧字符悬垂或悬垂,那些额外像素会被“抛出”所需单元格和受感染邻居单元,从而被留下。 同样,如果一个邻居字符“溢出”,那些“溢出像素”将被清除。

    可以在控制台窗口中使用的一组字体被修剪为经过测试并已知可在控制台窗口中正常工作的字体。 对于英语系统来说,这使我们感到了Lucida控制台和终端。

    ...

    “呃,那太愚蠢了,你应该阻止我选择一个明显导致废话的字体。”

    这就是我们所做的。

    这并不是说我责怪雷蒙德,但他权威地把这个说成是“不可能发生”。

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

    链接地址: http://www.djcxy.com/p/57275.html

    上一篇: Characters overlapping when they have changed color and are printed backwards

    下一篇: svn: OPTIONS of 'REPO URL: authorization failed: