您好我正在尝试使用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中打印奇怪的字符和其他颜色。
由于
塞萨尔。
答案 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);
为了更好地理解,请使用以下示例,并使用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);
以上示例中的参数屏幕截图显示了控制台和变量。我希望这会让它更加清晰。