设置指定数量的字符单元格的字符属性,从屏幕缓冲区中的指定坐标开始。
函数声明:
设置指定数量的字符单元格的字符属性BOOL WINAPI FillConsoleOutputAttribute( _In_ HANDLE hConsoleOutput, _In_ WORD wAttribute, _In_ DWORD nLength, _In_ COORD dwWriteCoord, _Out_ LPDWORD lpNumberOfAttrsWritten ); 功能: 设置指定数量的字符单元格的字符属性 参数: hConsoleOutput 控制台屏幕缓冲区的句柄。句柄必须具有GENERIC_WRITE访问权限。 wAttribute 写入控制台屏幕缓冲区时要使用的属性。 nLength 要设置为指定颜色属性的字符单元格数。 dwWriteCoord 指定字符坐标的开始位置 lpNumberOfAttrsWritten 指向变量的指针,该变量接收实际设置了属性的字符单元格数。 返回值: 如果函数成功,则返回值为非零值。 如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。参考程序:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include <Windows.h> #define N 255 int main() { int i = 0; int len = 0; char *str = "神马程序员"; //定义句柄类型的变量 HANDLE hOut = NULL; //窗口信息结构体 CONSOLE_SCREEN_BUFFER_INFO screenInfo; //开始位置 COORD posShadow; //获取标准输出句柄 hOut = GetStdHandle(STD_OUTPUT_HANDLE); //获取窗口信息结构体 GetConsoleScreenBufferInfo(hOut, &screenInfo); //长度 len = strlen(str) + 1; posShadow.X = 8; posShadow.Y = 8; //BACKGROUND_INTENSITY 灰色属性 FillConsoleOutputAttribute(hOut, BACKGROUND_INTENSITY, len + 4, posShadow, NULL); getchar(); //关闭句柄 CloseHandle(hOut); system("pause"); return 0; }执行效果
第8行第8列开始显示 长度为len + 4 属性为灰色
官方参考手册:https://docs.microsoft.com/en-us/windows/console/fillconsoleoutputattribute
从指定的坐标开始,将一个字符按照指定的次数写入控制台屏幕缓冲区。
函数声明:
BOOL WINAPI FillConsoleOutputCharacter( _In_ HANDLE hConsoleOutput, _In_ TCHAR cCharacter, _In_ DWORD nLength, _In_ COORD dwWriteCoord, _Out_ LPDWORD lpNumberOfCharsWritten ); 功能: 填充指定次数的字符 参数: hConsoleOutput 控制台屏幕缓冲区的句柄。句柄必须具有GENERIC_WRITE访问权限。 cCharacter 要写入控制台屏幕缓冲区的字符。 nLength 应写入字符的字符单元格数。 dwWriteCoord 指定字符坐标到的字符是要被写入的开始位置。 lpNumberOfCharsWritten 指向变量的指针,该变量接收实际写入控制台屏幕缓冲区的字符数。 返回值: 如果函数成功,则返回值为非零值。 如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。参考程序:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include <Windows.h> #define N 255 int main() { int i = 0; int len = 0; char *str = "神马程序员"; //定义句柄类型的变量 HANDLE hOut = NULL; //窗口信息结构体 CONSOLE_SCREEN_BUFFER_INFO screenInfo; //开始位置 COORD posShadow; //获取标准输出句柄 hOut = GetStdHandle(STD_OUTPUT_HANDLE); //获取窗口信息结构体 GetConsoleScreenBufferInfo(hOut, &screenInfo); //开始位置 COORD pos = {0, 0}; //填充指定数字的字符 FillConsoleOutputCharacter(hOut, 'B', screenInfo.dwSize.X * 4, pos, NULL); getchar(); //关闭句柄 CloseHandle(hOut); system("pause"); return 0; }执行结果:
填充四行
官方参考手册: https://docs.microsoft.com/en-us/windows/console/fillconsoleoutputcharacter
从指定位置开始,将多个字符复制到控制台屏幕缓冲区的连续单元格。
函数声明:
BOOL WINAPI WriteConsoleOutputCharacter( _In_ HANDLE hConsoleOutput, _In_ LPCTSTR lpCharacter, _In_ DWORD nLength, _In_ COORD dwWriteCoord, _Out_ LPDWORD lpNumberOfCharsWritten ); 功能: 从指定位置开始,将多个字符复制到控制台屏幕缓冲区的连续单元格。 参数: hConsoleOutput 控制台屏幕缓冲区的句柄。句柄必须具有GENERIC_WRITE访问权限。 lpCharacter 要写入控制台屏幕缓冲区的字符串。 nLength 要写入的字符数。 dwWriteCoord 起始位置 lpNumberOfCharsWritten 指向接收实际写入的字符数的变量的指针。 返回值: 如果函数成功,则返回值为非零值。 如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。参考程序:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include <Windows.h> #define N 255 int main() { int i = 0; int len = 0; char *str = "a"; //定义句柄类型的变量 HANDLE hOut = NULL; //窗口信息结构体 CONSOLE_SCREEN_BUFFER_INFO screenInfo; //开始位置 COORD posShadow; //获取标准输出句柄 hOut = GetStdHandle(STD_OUTPUT_HANDLE); //获取窗口信息结构体 GetConsoleScreenBufferInfo(hOut, &screenInfo); //开始位置 COORD pos = {0, 0}; //填充指定数字的字符 len = strlen(str); WriteConsoleOutputCharacter(hOut, str, len, pos, NULL); getchar(); //关闭句柄 CloseHandle(hOut); system("pause"); return 0; }执行结果:
官方参考手册: https://docs.microsoft.com/en-us/windows/console/writeconsoleoutputcharacter
参考程序:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include <Windows.h> #include <conio.h> int main() { //定义输出信息 char *str = "Hello World!"; int i; int len = strlen(str); //阴影属性 WORD shadow = BACKGROUND_INTENSITY; //文本属性 WORD text = BACKGROUND_GREEN | BACKGROUND_INTENSITY; //获得标准输出设备句柄 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义窗口缓冲区信息结构体 CONSOLE_SCREEN_BUFFER_INFO screenInfo; //获得窗口缓冲区信息 GetConsoleScreenBufferInfo(hOut, &screenInfo); //定义一个文本框输出区域 SMALL_RECT rc; //定义文本框的起始坐标 COORD posText; //定义阴影框的起始坐标 COORD posShadow; //确定区域的边界 rc.Top = 8; //上边界 rc.Bottom = rc.Top + 4; //下边界 rc.Left = (screenInfo.dwSize.X - len) / 2 - 2; //左边界,为了让输出的字符串居中 rc.Right = rc.Left + len + 4; //右边界 //确定文本框起始坐标 posText.X = rc.Left; posText.Y = rc.Top; //确定阴影框的起始坐标 posShadow.X = posText.X + 1; posShadow.Y = posText.Y + 1; for (i = 0; i < 5; ++i) //先输出阴影框 { FillConsoleOutputAttribute(hOut, shadow, len + 4, posShadow, NULL); posShadow.Y++; } for (i = 0; i < 5; ++i) //在输出文本框,其中与阴影框重合的部分会被覆盖掉 { FillConsoleOutputAttribute(hOut, text, len + 4, posText, NULL); posText.Y++; } //设置文本输出处的坐标 posText.X = rc.Left + 2; posText.Y = rc.Top + 2; WriteConsoleOutputCharacter(hOut, str, len, posText, NULL); //输出字符串 getchar(); SetConsoleTextAttribute(hOut, screenInfo.wAttributes); // 恢复原来的属性 CloseHandle(hOut); system("pause"); return 0; }