使用 WriteConsoleOutputA 在控制台中输出

Cés*_*rro 1 c++ console winapi

嗨,我正在尝试使用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);
Run Code Online (Sandbox Code Playgroud)

所以此时它会写一个A带有黄色背景的红色,但是例如,如果我希望A出现在坐标 (5,5) 中,即使我更改SMALL_RECT{0, 0, 10, 10}.

或者,如果我想A用这个写第一个右侧的另一个右侧:

WriteConsoleOutputA(wHnd, &letterA, charBufSize, characterPos, &writeArea);
WriteConsoleOutputA(wHnd, &letterA, charBufSize, { 0, 1 }, &writeArea); 
Run Code Online (Sandbox Code Playgroud)

我开始使用这种图形控制台模式,如果有人能告诉我如何在我想要的坐标中打印该字符,那将非常有帮助。

我试图改变它,改变坐标是这样的:

COORD charBufSize = { 5, 10};
COORD characterPos = { 3, 2 };
SMALL_RECT writeArea = { 0,0,5,10 };
Run Code Online (Sandbox Code Playgroud)

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

谢谢

凯撒。

Luk*_*sen 5

WriteConsoleOutput(..) 是一个复杂的函数,需要小心处理。

dwBufferSize参数(=你的charBufSize)无非是对的尺寸规格lpBuffer参数(=你letterA)。唯一的区别而不是简单地告诉它letterA的大小1是,通过将其分成两个轴,您可以指定其中包含letterA字符的文本块的宽度和高度。但请记住,的大小letterA必须是charBufSize.X * charBufSize.Y. 否则WriteConsoleOutput会做奇怪的事情,因为它使用未初始化的内存。

dwBufferCoord参数(=你的characterPos)定义内的位置letterA从何处读取的字符被写入到控制台。所以它只是定义了一个索引偏移量。在您的示例中,这应该始终是{ 0, 0 }(等于letterA[0]),因为letterA它只是一个字符。

lpWriteRegion参数(=你writeArea)做了所有的法宝。它指定了调用要写入的区域的位置、宽度和高度。要写入的数据由前面的参数定义。

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

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

WriteConsoleOutputA(wHnd, &letterA, charBufSize, characterPos, &writeArea);
Run Code Online (Sandbox Code Playgroud)

为了更好地理解,请使用以下示例并稍微使用charBufSize,characterPos和的值writeArea

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);
Run Code Online (Sandbox Code Playgroud)

这是上面示例中显示控制台和变量的参数的屏幕截图。我希望这能让它更清楚一点。

参数示例