嗨,我正在尝试使用WriteConsoleOutputA进行输出。
我有以下代码:

CHAR_INFO letterA;
letterA.Char.AsciiChar = 'A';

letterA.Attributes =
    FOREGROUND_RED | FOREGROUND_INTENSITY |
    BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_INTENSITY;
    //Set up the positions:
    COORD charBufSize = { 1, 1};
    COORD characterPos = { 0, 0 };
    SMALL_RECT writeArea = { 0,0,0,0 };

    //Write the character
    WriteConsoleOutputA(wHnd, &letterA, charBufSize, characterPos, &writeArea);

因此,此时它会写入带有黄色背景的红色A,但是例如,如果我希望A显示在坐标(5,5)中,即使将SMALL_RECT更改为{0, 0, 10, 10},它也不会打印。

或者,如果我想在第一个右侧写另一个A:
WriteConsoleOutputA(wHnd, &letterA, charBufSize, characterPos, &writeArea);
WriteConsoleOutputA(wHnd, &letterA, charBufSize, { 0, 1 }, &writeArea);

我从这种图形控制台模式开始,如果有人可以告诉我如何在所需坐标中打印该字符,这将非常有帮助。

我试图改变它,改变坐标是这样的:
COORD charBufSize = { 5, 10};
COORD characterPos = { 3, 2 };
SMALL_RECT writeArea = { 0,0,5,10 };

但是它会在所有5 * 10缓冲区中打印奇怪的字符和其他颜色。

谢谢

塞萨尔

最佳答案

WriteConsoleOutput(..) 是一个复杂的函数,需要仔细处理。
dwBufferSize参数(=您的charBufSize)仅是lpBuffer参数(=您的letterA)的大小说明。唯一的区别不是简单地告诉letterA具有1的大小,而是将它分成两个轴,您可以指定其中包含letterA字符的文本块的宽度和高度。但是请记住,letterA的大小必须为charBufSize.X * charBufSize.Y。否则WriteConsoleOutput会做一些奇怪的事情,因为它使用了未初始化的内存。
dwBufferCoord参数(=您的characterPos)定义letterA中的位置,从该位置读取要写入控制台的字符。因此,它仅定义索引偏移量。在您的示例中,这应该始终为{ 0, 0 }(等于letterA[0]),因为letterA只是单个字符。
lpWriteRegion参数(=您的writeArea)发挥了所有作用。它指定 call 要写入的区域的位置,宽度和高度。要写入的数据由先前的参数定义。

因此,要将字符写到特定位置x, y,请执行以下操作:

COORD charBufSize = {1, 1};
COORD characterPos = {0, 0};
SMALL_RECT writeArea = {x, y, x, y};

WriteConsoleOutputA(wHnd, &letterA, charBufSize, characterPos, &writeArea);

为了更好地理解,请使用以下示例,并使用charBufSizecharacterPoswriteArea的值进行一些操作:
int i;
CHAR_INFO charInfo[10 * 10];

/* play with these values */
COORD charBufSize = {10, 10};   /* do not exceed x*y=100 !!! */
COORD characterPos = {5, 0};    /* must be within 0 and x*y=100 */
SMALL_RECT writeArea = {2, 2, 12, 12};


for (i = 0; i < (10 * 10); i++)
{
    charInfo[i].Char.AsciiChar = 'A' + (i % 26);
    charInfo[i].Attributes = FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_INTENSITY;
}

WriteConsoleOutputA(wHnd, charInfo, charBufSize, characterPos, &writeArea);

这是上面示例中的参数的屏幕快照,显示了控制台和变量。我希望这可以使它更加清楚。

c&#43;&#43; - 使用WriteConsoleOutputA在控制台中输出-LMLPHP

07-24 17:33