嗨,我正在尝试使用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
字符的文本块的宽度和高度。但是请记住,letterA
的大小必须为charBufSize.X * charBufSize.Y
。否则WriteConsoleOutput
会做一些奇怪的事情,因为它使用了未初始化的内存。dwBufferCoord
参数(=您的characterPos
)定义letterA
中的位置,从该位置读取要写入控制台的字符。因此,它仅定义索引偏移量。在您的示例中,这应该始终为{ 0, 0 }
(等于letterA[0]
),因为letterA
只是单个字符。lpWriteRegion
参数(=您的writeArea
)发挥了所有作用。它指定 call 要写入的区域的位置,宽度和高度。要写入的数据由先前的参数定义。
因此,要将字符写到特定位置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);
这是上面示例中的参数的屏幕快照,显示了控制台和变量。我希望这可以使它更加清楚。