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语言】控制台窗口图形界面编程(四):文本输出的更多相关文章

  1. C语言控制台窗体图形界面编程(总结)

    本系列文章是笔者通过学习<C语言控制台窗体界面编程(修正版)>而写(关于此文档的很多其它信息请看本系列文章第一篇),旨在让大家更加清晰简洁easy地学习C语言控制台窗体界面的编程. 通过本 ...

  2. 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区

    目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScreenBuffer ...

  3. 【C语言】控制台窗口图形界面编程(一)句柄和文本属性

    目录 00. 目录 01. 句柄 02. GetStdHandle函数 03. CloseHandle函数 04. SetConsoleTextAttribute函数 05. 十进制颜色对照表 06. ...

  4. 【C语言】控制台窗口图形界面编程(七):鼠标事件

    目录 00. 目录 01. INPUT_RECORD结构 02. MOUSE_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INP ...

  5. 【C语言】控制台窗口图形界面编程(五):文本移动

    目录 00. 目录 01. CHAR_INFO结构 02. ScrollConsoleScreenBuffer函数 03. 程序示例 04. 官方参考程序 00. 目录 01. CHAR_INFO结构 ...

  6. 【C语言】控制台窗口图形界面编程(八):键盘事件

    目录 00. 目录 01. INPUT_RECORD结构 02. KEY_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INPUT ...

  7. 【C语言】控制台窗口图形界面编程(六):光标设置

    目录 00. 目录 01. CONSOLE_CURSOR_INFO结构 02. GetConsoleCursorInfo函数 03. SetConsoleCursorInfo函数 04. SetCon ...

  8. C语言控制台窗体图形界面编程(八):鼠标事件

           上次讲的是键盘事件,这次我们介绍鼠标事件. 以下先介绍下鼠标事件的结构体以及相关信息. typedef struct _MOUSE_EVENT_RECORD //鼠标事件结构体 { CO ...

  9. Linux C 程序 GTK+图形界面编程(22)

    GTK+图形界面编程 Linux大多是在字符界面,但也可以开发图形界面 目前已经存在多种Linux下开发图形界面的程序开发包:最常用的是Qt和GTK+ Qt是一个跨平台的图形界面开发库,不仅仅支持Li ...

随机推荐

  1. 通过minicom传送文件的相关配置及使用方法

    写一下我使用串口向开发板传送文件中遇到的问题及解决办法: 使用的软硬件环境: 虚拟机:VMware® Workstation 8.0.1 Linux操作系统:Fedora 9 开发板:mini6410 ...

  2. 洛谷 P2444 [ POI 2000 ] 病毒 —— AC自动机+dfs

    题目:https://www.luogu.org/problemnew/show/P2444 AC自动机上 dfs,不走结尾点,如果走出环就是有无限长度的串: RE无数,原来是数组开成 2000 的了 ...

  3. Mysql数据库的触发器、存储引擎和存储过程

    数据库的触发器 1.触发器 触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句): DELETE,INSERT,UPDATE 我们可以监视某表 ...

  4. jquery datatable无数据提示不居中显示

    原文地址:https://www.jianshu.com/p/fc4784d11722 昨天遇到一个问题,datatable生成的表格没有数据,但是“No data found”没有居中,根本原因是c ...

  5. bzoj 4826: [Hnoi2017]影魔【单调栈+树状数组+扫描线】

    参考:https://www.cnblogs.com/lcf-2000/p/6789680.html 这是一个相对码量少的做法,用到了区间修改区间查询的树状数组,详见:www.cnblogs.com/ ...

  6. ubuntu vim设置显示行号

    打开vim的配置文件 /etc/vim/vimrc sudo vim /etc/vim/vimrc 然后找到 #set number ,把注释取消就行了 如果没有,就自己加一行

  7. 使用gitee(码云)创建项目

    注册登录 https://gitee.com/ 也可以直接用oschina的帐号. 创建项目 点击"+"号,创建项目. 执行git命令 本机创建一个你的这个项目目录,init后不要 ...

  8. [Usaco2017 Feb]Why Did the Cow Cross the Road I (Gold)

    Description 有一幅n*n的方格图,n <=100,每个点上有一个值. 从(1,1)出发,走到(n,n),只能走上下左右. 每走一步花费t,每走三步需要花费走完三步后到达格子的值. 求 ...

  9. 题解报告:hdu 2844 & poj 1742 Coins(多重部分和问题)

    Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...

  10. set和get方法

    package day02; public class Person { /**为了封装,一般的属性都设置成为private(私有的),所以你无法用 .属性 的方式来得到属性值, * 因此此时用两个p ...