使用WriteConsoleOutputA在控制台中输出

时间:2016-07-13 05:23:00

标签: c++ winapi console

您好我正在尝试使用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中打印奇怪的字符和其他颜色。

由于

塞萨尔。

1 个答案:

答案 0 :(得分:3)

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);

为了更好地理解,请使用以下示例,并使用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);

以上示例中的参数屏幕截图显示了控制台和变量。我希望这会让它更加清晰。

Parameter example