Cés*_*rro 1 c++ console winapi
嗨,我正在尝试使用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);
Run Code Online (Sandbox Code Playgroud)
所以此时它会写一个A带有黄色背景的红色,但是例如,如果我希望A出现在坐标 (5,5) 中,即使我更改SMALL_RECT为{0, 0, 10, 10}.
或者,如果我想A用这个写第一个右侧的另一个右侧:
WriteConsoleOutputA(wHnd, &letterA, charBufSize, characterPos, &writeArea);
WriteConsoleOutputA(wHnd, &letterA, charBufSize, { 0, 1 }, &writeArea);
Run Code Online (Sandbox Code Playgroud)
我开始使用这种图形控制台模式,如果有人能告诉我如何在我想要的坐标中打印该字符,那将非常有帮助。
我试图改变它,改变坐标是这样的:
COORD charBufSize = { 5, 10};
COORD characterPos = { 3, 2 };
SMALL_RECT writeArea = { 0,0,5,10 };
Run Code Online (Sandbox Code Playgroud)
但它会在所有缓冲区 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)做了所有的法宝。它指定了调用要写入的区域的位置、宽度和高度。要写入的数据由前面的参数定义。
因此,要将字符写入特定位置,x, y请执行以下操作:
COORD charBufSize = {1, 1};
COORD characterPos = {0, 0};
SMALL_RECT writeArea = {x, y, x, y};
WriteConsoleOutputA(wHnd, &letterA, charBufSize, characterPos, &writeArea);
Run Code Online (Sandbox Code Playgroud)
为了更好地理解,请使用以下示例并稍微使用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);
Run Code Online (Sandbox Code Playgroud)
这是上面示例中显示控制台和变量的参数的屏幕截图。我希望这能让它更清楚一点。