gpt4 book ai didi

c++ - 使用 WriteConsoleOutputA 在控制台中输出

转载 作者:行者123 更新时间:2023-11-30 01:43:07 25 4
gpt4 key购买 nike

您好,我正在尝试使用 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 指定文本 block 的宽度和高度其中的字符。但请记住 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);

为了更好地理解,请使用以下示例并稍微调整一下 charBufSize 的值, characterPoswriteArea :

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

关于c++ - 使用 WriteConsoleOutputA 在控制台中输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38343232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com