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

c – 字符在更改颜色并向后打印时重叠,第1张

概述正如你所看到的那样,即使有足够的空间,上部的暗X也会被切割. 发生这种情况是因为它们已经改变颜色并向后打印(从右到左). 这是一个错误,错误的代码,我的系统上的错误设置或(我怀疑它)它应该是什么样的? 以下是生成此输出的代码: #include <Windows.h>#include <iostream>void moveTo(int x,int y){ COORD kord={x,y 正如你所看到的那样,即使有足够的空间,上部的暗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勘误表中所述:

I repro too,VS2008 on Win7. Cool BUG. Changing the console Font fixes it.

让我们使用这个BUG隔离.我将此字体识别为Petite Terminal,这意味着您最有可能将此项目配置为Win32控制台应用程序. GCC的额外repro确认了这一假设,从实际角度来看,我们将假设你们所有人都在windows终端内部运行32位控制台应用程序.

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

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

>发出写入时,会将字符写入终端阵列中的某个位置
>选择默认颜色(7)时,像素不会溢出到阵列中的其他缓冲区
>选择颜色8时,会将另一列像素写入缓冲区的下一个区域,只有在向后背诵文本时才能看到

由于(3)中存在溢出,这是一个错误.

Quoting Raymond Chen:

The console rendering model assumes each character fits neatly insIDe
its fixed-sized cell. When a new character is written to a cell,the
old cell is overprinted with the new character,but if the old
character has overhang or underhang,those extra pixels are left
behind since they “spilled over” the required cell and infected
neighbor cells. Similarly,if a neighboring character “spilled over”,
those “spillover pixels” would get erased.

The set of Fonts that Could be used in the console window was trimmed
to the Fonts that were tested and kNown to work acceptably in console
windows. For English systems,this brought us down to LucIDa Console
and Terminal.

“Well,that’s stupID. You should’ve stopped me from choosing a Font
that so clearly results in nonsense.”

And that’s what we dID.

并不是说我把雷蒙德归咎于雷蒙德,但他权威地将此描述为“不可能发生”.

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

总结

以上是内存溢出为你收集整理的c – 字符在更改颜色并向后打印时重叠全部内容,希望文章能够帮你解决c – 字符在更改颜色并向后打印时重叠所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239450.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存