【问题标题】:Outputs in console with WriteConsoleOutputA使用 WriteConsoleOutputA 在控制台中输出
【发布时间】:2016-07-13 05:23:00
【问题描述】:

您好,我正在尝试使用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)中,即使我更改@,它也不会打印它987654325@转{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 的所有缓冲区中打印奇怪的字符和其他颜色。

谢谢

塞萨尔。

【问题讨论】:

    标签: c++ winapi console


    【解决方案1】:

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

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

    【讨论】:

    • 嗨 Lukas,非常感谢,这对我很有帮助,它帮助我更多地了解了该功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    相关资源
    最近更新 更多