00. 目录
文章目录
00. 目录01. FillConsoleOutputAttribute函数02. FillConsoleOutputCharacter函数03. WriteConsoleOutputCharacter函数04. 综合实例01. FillConsoleOutputAttribute函数
设置指定数量的字符单元格的字符属性,从屏幕缓冲区中的指定坐标开始。
函数声明:
设置指定数量的字符单元格的字符属性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 255int 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 属性为灰色
官方参考手册:/en-us/windows/console/fillconsoleoutputattribute
02. FillConsoleOutputCharacter函数
从指定的坐标开始,将一个字符按照指定的次数写入控制台屏幕缓冲区。
函数声明:
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 255int 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;}
执行结果:
填充四行
官方参考手册: /en-us/windows/console/fillconsoleoutputcharacter
03. WriteConsoleOutputCharacter函数
从指定位置开始,将多个字符复制到控制台屏幕缓冲区的连续单元格。
函数声明:
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 255int 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;}
执行结果:
官方参考手册: /en-us/windows/console/writeconsoleoutputcharacter
04. 综合实例
参考程序:
#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;}
如果觉得《【C语言】控制台窗口图形界面编程(四):文本输出》对你有帮助,请点赞、收藏,并留下你的观点哦!