C/C++ 中怎样使用SetConsoleTextAttribute()函数来控制输出字符的颜色

当我们在命令行输出字符的时候,会想着,要是能控制输出字符的颜色就好了。
现在,满足你,有这么一个函数能够帮助我们实现这个想法。
↓↓↓↓↓
SetConsoleTextAttribute();

依照惯例我们来看看这个函数的构成。

SetConsoleTextAttribute(
 _In_ HANDLE hConsoleOutput,
 _In_ WORD wAttributes
 );

HANDLE在上一篇博客中我们见过。注意在使用前,要先将其变为标准输出句柄。

typedef void *HANDLE;//HANDLE是vodi*的重定义
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出句柄

现在我们主要来看一下WORD的定义。
typedef unsigned short WORD;

从上可以的除WORD其实是个无符号的整型,一般这样的话,线索就好像是断了,只看数值的话只能知道取值范围是0-65535。
但是我们去网上搜索这个函数后,我们就发现了简单的用法,这里我来举个例子:

#include <stdio.h>
#include <windows.h>

int main() {
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出句柄
	SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | FOREGROUND_BLUE);//字体设置为蓝色
	printf("R\n");
}

我们看到不仅我们输出的字符"R"变成了蓝色,且后面的自动弹出的提示也变成了蓝色。
我们可以把输出字符的命令当作是一支画笔,而我们通过SetConsoleTextAttribute();改变了画笔的颜色。//这里提醒一下,直到下次更改前颜色会一直保持
而且我们可以看到,本来应该是填入WORD类型数据的地方,现在变成了"FOREGROUND_INTENSITY | FOREGROUND_BLUE"。
这是什么东西呢,我们对它查看定义来看一下:

#define FOREGROUND_BLUE  0x0001 // text color contains blue.
#define FOREGROUND_GREEN  0x0002 // text color contains green.
#define FOREGROUND_RED  0x0004 // text color contains red.
#define FOREGROUND_INTENSITY 0x0008 // text color is intensified.
#define BACKGROUND_BLUE  0x0010 // background color contains blue.
#define BACKGROUND_GREEN  0x0020 // background color contains green.
#define BACKGROUND_RED  0x0040 // background color contains red.
#define BACKGROUND_INTENSITY 0x0080 // background color is intensified.

从看到上的的注释不难看出,这些函数是对一些十六位进制的值的宏定义。//0x代表这后面的数字是十六位进制
而且根据宏定义名可简单的归类:
前四个是对字体的 蓝色,绿色,红色,亮度 进行设置
后四个是对背景的 蓝色,绿色,红色,亮度 进行设置

相信机智的你已经看出来了,SetConsoleTextAttribute(HANDLE,WORD);其实是通过判断WORD的二进制,其相对应位置上的值来开启颜色属性的。
(short是二字节,但是这里方便书写就写一字节了)

对应属性 蓝色字体 绿色字体 红色字体 高亮字体 蓝色背景 绿色背景 红色背景 高亮背景
十进制 0x0001 0x0002 0x0004 0x0008 0x0010 0x0020 0x0040 0x0080
二进制 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000

上诉例子里的值也可以这么转换下来:
" FOREGROUND_INTENSITY|FOREGROUND_BLUE "--->" 0x0008|0x0001 "--->" 00001000|00000001 "
--->"00001001"
然后根据"00001001"查看,哦,开启第一位和第四位的属性,那么也就是打开启 蓝色字体和高亮字体的属性。
还有就是 这里的红绿蓝其实就是三原色,经过通过 红绿 红蓝 绿蓝 还可得到 黄色 青色 粉色 这三种颜色。

//宏定义字体颜色
#define FOREGROUND_WHITE  0x0007 //白色(红+绿+蓝) 默认颜色
#define FOREGROUND_YELLOW  0x0006 //黄色(红+绿)
#define FOREGROUND_PINK  0x0005 //粉色(红+蓝)
#define FOREGROUND_INDIGO  0x0003 //青色(绿+蓝)

这里我把混合的颜色写上来,为了方便使用,可以在自己的代码里添加这个宏定义方便使用

到此这篇关于C/C++ 中怎样使用SetConsoleTextAttribute()函数来控制输出字符的颜色的文章就介绍到这了,更多相关C/C++控制输出字符的颜色内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C/C++实现控制台输出不同颜色字体的方法

    本文实例讲述了C/C++实现控制台输出不同颜色字体的方法.分享给大家供大家参考,具体如下: 在控制台输出不同颜色的字 效果 代码: #include "stdio.h" #include "windows.h" int main(int argn, char **argv) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN); printf("Hello&q

  • C/C++ 中怎样使用SetConsoleTextAttribute()函数来控制输出字符的颜色

    当我们在命令行输出字符的时候,会想着,要是能控制输出字符的颜色就好了. 现在,满足你,有这么一个函数能够帮助我们实现这个想法. ↓↓↓↓↓ SetConsoleTextAttribute(); 依照惯例我们来看看这个函数的构成. SetConsoleTextAttribute( _In_ HANDLE hConsoleOutput, _In_ WORD wAttributes ); HANDLE在上一篇博客中我们见过.注意在使用前,要先将其变为标准输出句柄. typedef void *HAND

  • C++中putchar与getchar函数的细节及运用

    在C语言中,输入和输出除了用printf和scanf外,另外还有用于输入字符的函数为getchar()函数,用于输出字符的函数为putchar()函数. 功能解释如下: 下面用例子来说明函数的用法 #include <stdio.h> int main() { int ch = 0; while ((ch = getchar()) != EOF) putchar(ch); return 0; } 结果: 可以看出,当按下键盘上的回车键时,getchar函数会读取到屏幕中输入的字符和回车字符'\

  • C语言SetConsoleTextAttribute函数使用方法

    目录 1.函数接口 2.作用 3.参数 4.测试代码 5.直接使用数字进行配色 1.函数接口 BOOL WINAPI SetConsoleTextAttribute( _In_ HANDLE hConsoleOutput, _In_ WORD wAttributes ); 头文件<windows.h> 2.作用 SetConsoleTextAttribute()函数是一个设置控制台字体颜色和背景色的函数. 3.参数 第一个参数获得句柄(即要设置颜色的地方),第二个参数设置颜色.属性相加是在属性

  • 简单了解Python中的几种函数

    几个特殊的函数(待补充) python是支持多种范型的语言,可以进行所谓函数式编程,其突出体现在有这么几个函数: filter.map.reduce.lambda.yield lambda >>> g = lambda x,y:x+y #x+y,并返回结果 >>> g(3,4) 7 >>> (lambda x:x**2)(4) #返回4的平方 16 lambda函数的使用方法: 在lambda后面直接跟变量 变量后面是冒号 冒号后面是表达式,表达式计算

  • C++ 中const修饰虚函数实例详解

    C++ 中const修饰虚函数实例详解 [1]程序1 #include <iostream> using namespace std; class Base { public: virtual void print() const = 0; }; class Test : public Base { public: void print(); }; void Test::print() { cout << "Test::print()" << end

  • Angularjs中如何使用filterFilter函数过滤

    AngularJS的filter,中文名"过滤器"是用来过滤变量的值,或者格式化输出,得到自己所期望的结果或格式的东东.AngularJS中有一个filterFilter函数用来对集合过滤,非常方便. 源代码大致如下: function filterFilter(){ return function(aray, expression comparator){ if(!isArray(array)) return array; var comparatorType = typeof(co

  • c++中的string常用函数用法总结

    标准c++中string类函数介绍 注意不是CString之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要.我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?).我们尽可以把它看成是C++的基本数据类型. 好了,进入正题---首先,为了在我们的程序中使用string类型,我们必须包含头文件 <string>

  • SQLite3中的日期时间函数使用小结

    复制代码 代码如下: import sqlite3conn = sqlite3.connect('/tmp/sqlite.db')cur = conn.cursor() 接下来干嘛呢?建一张表吧.这里需要注意的是,SQLite不支持在创建表的同时创建索引,所以要分两步走,先创建表然后再创建索引 复制代码 代码如下: create_table_stmt = '''CREATE TABLE IF NOT EXISTS test_table ( id INTEGER PRIMARY KEY AUTOI

  • PostgreSQL中的XML操作函数代码

    XML内容生成部分 SQL数据生成XML的函数. 1. xmlcomment:生成注释函数. xmlcomment(text ) 例: SELECT xmlcomment('hello'); xmlcomment -------------- <!--hello--> 2. xmlconcat:XML连接函数 xmlconcat(xml [, ...]) 例: SELECT xmlconcat('<abc/>', '<bar>foo</bar>'); xml

  • 详解js中class的多种函数封装方法

    本文实例讲解了js中class的多种函数封装方法,分享给大家供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>关于class的多种函数封装</title> <style> body{ margin: 0; } li{ height: 20px; } </style

随机推荐