【C语言】控制台窗口图形界面编程(四):文本输出
00. 目录
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 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
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 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
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 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
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语言】控制台窗口图形界面编程(四):文本输出的更多相关文章
- C语言控制台窗体图形界面编程(总结)
本系列文章是笔者通过学习<C语言控制台窗体界面编程(修正版)>而写(关于此文档的很多其它信息请看本系列文章第一篇),旨在让大家更加清晰简洁easy地学习C语言控制台窗体界面的编程. 通过本 ...
- 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区
目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScreenBuffer ...
- 【C语言】控制台窗口图形界面编程(一)句柄和文本属性
目录 00. 目录 01. 句柄 02. GetStdHandle函数 03. CloseHandle函数 04. SetConsoleTextAttribute函数 05. 十进制颜色对照表 06. ...
- 【C语言】控制台窗口图形界面编程(七):鼠标事件
目录 00. 目录 01. INPUT_RECORD结构 02. MOUSE_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INP ...
- 【C语言】控制台窗口图形界面编程(五):文本移动
目录 00. 目录 01. CHAR_INFO结构 02. ScrollConsoleScreenBuffer函数 03. 程序示例 04. 官方参考程序 00. 目录 01. CHAR_INFO结构 ...
- 【C语言】控制台窗口图形界面编程(八):键盘事件
目录 00. 目录 01. INPUT_RECORD结构 02. KEY_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INPUT ...
- 【C语言】控制台窗口图形界面编程(六):光标设置
目录 00. 目录 01. CONSOLE_CURSOR_INFO结构 02. GetConsoleCursorInfo函数 03. SetConsoleCursorInfo函数 04. SetCon ...
- C语言控制台窗体图形界面编程(八):鼠标事件
上次讲的是键盘事件,这次我们介绍鼠标事件. 以下先介绍下鼠标事件的结构体以及相关信息. typedef struct _MOUSE_EVENT_RECORD //鼠标事件结构体 { CO ...
- Linux C 程序 GTK+图形界面编程(22)
GTK+图形界面编程 Linux大多是在字符界面,但也可以开发图形界面 目前已经存在多种Linux下开发图形界面的程序开发包:最常用的是Qt和GTK+ Qt是一个跨平台的图形界面开发库,不仅仅支持Li ...
随机推荐
- 思维导图js
http://baike.baidu.com/view/1469162.htm?fromenter=Mind+Maps
- WEB开发框架系列教程 (一)快速创建解决方案
执行<华东信息辅助开发工具> 程序 打开程序界面如下图 输入用户名.密码进行登录 如果暂时还没有用户名和密码,点击注册提供机器码给管理员进行注册. 管理员QQ:93346562 下图是:点 ...
- [转]响应式web设计之CSS3 Media Queries
开始研究响应式web设计,CSS3 Media Queries是入门. Media Queries,其作用就是允许添加表达式用以确定媒体的环境情况,以此来应用不同的样式表.换句话说,其允许我们在不改变 ...
- 在linq语言中,不能准确按拼音排序(转)
在项目中,利用OrderBy/OrderByDescending, ThenBy/ThenByDescending这4个方法排序时,发现了这样的问题:在本机测试,能正确按拼音排序:但是放上服务器是,就 ...
- Gym 100531J Joy of Flight (几何)
题意:你从开始坐标到末尾坐标,要经过 k 秒,然后给你每秒的风向,和飞机的最大速度,问能不能从开始到末尾. 析:首先这个风向是不确定的,所以我们先排除风向的影响,然后算出,静风是的最小速度,如果这都大 ...
- CodeForces 722B Verse Pattern (水题)
题意:统计元音,这里多加一个元音,y. 析:直接统计就好了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000" ...
- jsp请求转发小例子(转载)
在服务器端对客户端请求时行转发对其它的对象,如果jsp网页或Servlet 用三个 jsp网页来演示转发: forword1.jsp, 用来提交表单, 将表单内容提交给 forwrod2.jsp, ...
- 洛谷P4550 收集邮票(概率期望)
传送门 神仙题啊……这思路到底是怎么来的…… ps:本题是第$k$次买邮票需要$k$元,而不是买的邮票标号为$k$时花费$k$元 我们设$g[i]$表示现在有$i$张,要买到$n$张的期望张数,设$P ...
- 递推DP UVA 607 Scheduling Lectures
题目传送门 题意:教授给学生上课,有n个主题,每个主题有ti时间,上课有两个限制:1. 每个主题只能在一节课内讲完,不能分开在多节课:2. 必须按主题顺序讲,不能打乱.一节课L时间,如果提前下课了,按 ...
- Thinkpad x230设置启动顺序
设置可以从CD或者USB启动1.F1进入BIOS,Security → Secure Boot ,设置为:Disabled2.Startup → UEFI/Legacy Boot ,设置为:Both( ...