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

标签 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 中打印奇怪的字符和其他颜色。

谢谢

凯撒。

最佳答案

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/

相关文章:

c - 组装一个 lParam 消息,这是正确的代码吗?

logging - 如何将 Golang 的日志输出设置回控制台?

c++ - 哪个串行设备连接到控制台(Linux)?

android - 在 C 代码中访问 Android 属性

c++ - 每次构建(制作)lib,仅当 lib 较新时才重新编译项目

c++ - 当样式为 WS_CHILD 时,通过 ps.rcPaint 查找脏区域不起作用

java - 无法解析输入: keystore

c++ - 如何使用 C++ 通过网络传输缓冲区?

c++ - C++中将stdin的内容读入字符串或 vector 的最快方法

c# - 使用 P/Invoked GlobalSize 时堆已损坏