【C语言】控制台窗口图形界面编程(一)句柄和文本属性
00. 目录
01. 句柄
句柄是Windows最常用的概念。它通常用来标识Windows资源(如菜单、图标、窗口等)和设备等对象。虽然可以把句柄理解为是一个指针变量类型,但它不是对象所在的地址指针,而是作为Windows系统内部表的索引值来使用的。
HANDLE在winnt.h中的声明为
typedef void *HANDLE;
从上面可以看出HANDLE是一种无类型指针,句柄是处理对象的一个接口,你可以通过句柄去操作程序中所涉及的对象。在windows中,句柄是和对象一一对应的32位无符号整数值,对象可以映射到唯一的句柄,
句柄也可以映射到唯一的对象windows需要向程序员提供必要地编程接口,在这些接口中,允许程序员访问,创建和销毁对象,但是,出于封装的考虑,windows并不想向程序员返回指针
如果作数据的话,句柄这种方式则允许你按自己的方式直接操作数据,但windows又不向你直接暴露数据。直接操作数据是程序员需要的,不暴露数据是windows所需要的,句柄封装方式实现了各取所需。
“句柄”是Windows最常用的概念。它通常用来标识Windows资源(如菜单、图标、窗口等)和设备等对象。虽然可以把句柄理解为是一个指针变量类型,但它不是对象所在的地址指针,而是作为Windows系统内部表的索引值来使用的。
参考示例:
HANDLE hOut = NULL;
02. GetStdHandle函数
函数相关说明
HANDLE WINAPI GetStdHandle(_In_ DWORD nStdHandle);
功能:
获取指定标准设备的句柄(标准输入,标准输出或标准错误)
参数:
nStdHandle 标准设备。此参数可以是以下值之一。
STD_INPUT_HANDLE(DWORD)-10 标准输入设备。最初,这是控制台输入缓冲区
STD_OUTPUT_HANDLE(DWORD)-11 标准输出设备。最初,这是活动的控制台屏幕缓冲区
STD_ERROR_HANDLE(DWORD)-12 标准错误设备。最初,这是活动的控制台屏幕缓冲区
返回值:
如果函数成功,则返回值是指定设备的句柄,或者是先前调用SetStdHandle设置的重定向句柄。该句柄具有GENERIC_READ和GENERIC_WRITE访问权限,除非应用程序使用SetStdHandle设置具有较少访问权限的标准句柄。
如果函数失败,则返回值为INVALID_HANDLE_VALUE。要获取扩展错误信息,请调用GetLastError。
如果应用程序没有关联的标准句柄,例如在交互式桌面上运行的服务,并且未重定向它们,则返回值为NULL。
在默认情况下:
标准输入(stdin)----键盘
标准输出(stdout)----显示器(屏幕)
标准错误(stderr)----显示器(屏幕)
注意:标准输出句柄和标准错误句柄默认情况下都是对应的屏幕
参考代码:
//定义句柄类型的变量
HANDLE hOut = NULL;
//获取标准输出句柄
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
03. CloseHandle函数
函数相关说明
BOOL CloseHandle(HANDLE hObject);
功能:
关闭一个打开的对象句柄
参数:
hObject 打开对象的有效句柄
返回值:
如果函数成功,则返回值为非零值。
如果函数失败,则返回值为零。要获取扩展错误信息,请调用 GetLastError。
参考代码:
//关闭句柄
CloseHandle(hOut);
04. SetConsoleTextAttribute函数
设置控制台文本属性(颜色),可以设置前景色FOREGROUND(文本颜色)和背景色BACKGROUND
BOOL WINAPI SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);
功能:
设置控制台文本属性(颜色)
参数:
hConsoleOutput: 控制台屏幕缓冲区的句柄。句柄必须具有GENERIC_READ访问权限。
wAttributes: 字符属性
返回值:
如果函数成功,则返回值为非零值。
如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。
备注:要确定屏幕缓冲区的当前颜色属性,请调用GetConsoleScreenBufferInfo函数。
字符属性可以分为两类:颜色和DBCS。Wincon.h头文件中定义了以下属性。
| 属性 | 含义 |
|---|---|
| FOREGROUND_BLUE | 文字颜色包含蓝色。 |
| FOREGROUND_GREEN | 文字颜色包含绿色。 |
| FOREGROUND_RED | 文字颜色包含红色。 |
| FOREGROUND_INTENSITY | 文字颜色加强。 |
| BACKGROUND_BLUE | 背景颜色包含蓝色。 |
| BACKGROUND_GREEN | 背景颜色包含绿色。 |
| BACKGROUND_RED | 背景颜色包含红色。 |
| BACKGROUND_INTENSITY | 背景颜色加剧。 |
| COMMON_LVB_LEADING_BYTE | 前导字节。 |
| COMMON_LVB_TRAILING_BYTE | 尾随字节。 |
| COMMON_LVB_GRID_HORIZONTAL | 顶部水平。 |
| COMMON_LVB_GRID_LVERTICAL | 左垂直。 |
| COMMON_LVB_GRID_RVERTICAL | 正确的垂直。 |
| COMMON_LVB_REVERSE_VIDEO | 反转前景和背景属性。 |
| COMMON_LVB_UNDERSCORE | 下划线。 |
相关声明
//
// Attributes flags:
//
#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.
#define COMMON_LVB_LEADING_BYTE 0x0100 // Leading Byte of DBCS
#define COMMON_LVB_TRAILING_BYTE 0x0200 // Trailing Byte of DBCS
#define COMMON_LVB_GRID_HORIZONTAL 0x0400 // DBCS: Grid attribute: top horizontal.
#define COMMON_LVB_GRID_LVERTICAL 0x0800 // DBCS: Grid attribute: left vertical.
#define COMMON_LVB_GRID_RVERTICAL 0x1000 // DBCS: Grid attribute: right vertical.
#define COMMON_LVB_REVERSE_VIDEO 0x4000 // DBCS: Reverse fore/back ground attribute.
#define COMMON_LVB_UNDERSCORE 0x8000 // DBCS: Underscore.
#define COMMON_LVB_SBCSDBCS 0x0300 // SBCS or DBCS flag.
测试代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <Windows.h>
int main()
{
//定义句柄类型的变量
HANDLE hOut = NULL;
//获取标准输出句柄
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
//设置文本属性为青色
SetConsoleTextAttribute(hOut, 10);
printf("黑马程序员\n");
//设置文本属性为红色
SetConsoleTextAttribute(hOut, 12);
printf("黑马程序员\n");
//设置文本属性为黄色
SetConsoleTextAttribute(hOut, 14);
printf("黑马程序员\n");
SetConsoleTextAttribute(hOut, 3);
printf("黑马程序员\n");
//关闭句柄
CloseHandle(hOut);
system("pause");
return 0;
}
执行结果

05. 十进制颜色对照表

06. 十六进制颜色对照表

参考博客: https://www.cnblogs.com/lanhaicode/p/10498497.html
【C语言】控制台窗口图形界面编程(一)句柄和文本属性的更多相关文章
- C语言控制台窗体图形界面编程(总结)
本系列文章是笔者通过学习<C语言控制台窗体界面编程(修正版)>而写(关于此文档的很多其它信息请看本系列文章第一篇),旨在让大家更加清晰简洁easy地学习C语言控制台窗体界面的编程. 通过本 ...
- 【C语言】控制台窗口图形界面编程(四):文本输出
目录 00. 目录 01. FillConsoleOutputAttribute函数 02. FillConsoleOutputCharacter函数 03. WriteConsoleOutputCh ...
- 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区
目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScreenBuffer ...
- C语言控制台窗体图形界面编程(八):鼠标事件
上次讲的是键盘事件,这次我们介绍鼠标事件. 以下先介绍下鼠标事件的结构体以及相关信息. typedef struct _MOUSE_EVENT_RECORD //鼠标事件结构体 { CO ...
- 【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. INPUT_RECORD结构 02. MOUSE_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INP ...
- 【C语言】控制台窗口图形界面编程(六):光标设置
目录 00. 目录 01. CONSOLE_CURSOR_INFO结构 02. GetConsoleCursorInfo函数 03. SetConsoleCursorInfo函数 04. SetCon ...
- Linux C 程序 GTK+图形界面编程(22)
GTK+图形界面编程 Linux大多是在字符界面,但也可以开发图形界面 目前已经存在多种Linux下开发图形界面的程序开发包:最常用的是Qt和GTK+ Qt是一个跨平台的图形界面开发库,不仅仅支持Li ...
随机推荐
- js读取ognl表达式的内容
<input type="hidden" id="number" value='<s:property value="resultN ...
- 强类型的HTML模板方法与直接显示模型
模型: public class Article { [Display(Name="文章")] public string ArticleID { get; set; } [Dis ...
- 2-3 Windows下一站式开发环境anaconda搭建
D:\Users\ZHONGZHENHUA\Anaconda3\Scripts\activate.bat https://www.geforce.com/hardware/notebook-gpus/ ...
- bzoj 4033: [HAOI2015]树上染色【树形dp】
准确的说应该叫树上分组背包?并不知道我写的这个叫啥 设计状态f[u][j]为在以点u为根的子树中有j个黑点,转移的时候另开一个数组,不能在原数组更新(因为会用到没更新时候的状态),方程式为g[j+k] ...
- 51nod 1188 最大公约数之和 V2
第二个\( O(T\sqrt(n)) \)复杂度T了..T了..T了...天地良心,这能差多少?! 于是跑去现算(. \[ \sum_{i=1}^{n-1}\sum_{j=i+1}^{n}gcd(i, ...
- 洛谷P3569 [POI2014]KAR-Cards(线段树)
传送门 蠢了…… 我们用线段树,记$w0$为该区间最左端取小值时,最右端最小能取大还是小还是无解,$w1$表示最左端取大值时,最右端最小能取大还是小还是无解 然后只要把交换看做修改就好了 这么说可能很 ...
- IIS发布问题服务器配置
1. <validation validateIntegratedModeConfiguration="false" /> 2.Http 404.0-NotFound ...
- iOS开发系列--通知与消息机制--转
来自:http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户 ...
- [转]在ASP.NET MVC3中使用EFCodeFirst 1.0
本文转自:http://kb.cnblogs.com/page/97003/ 作者: NinoFocus 来源: 博客园 发布时间: 2011-04-12 10:41 阅读: 11971 次 ...
- windwsform登录页面
简单登录设计: 读取用户名密码 数据库表 实体类 数据访问类: 隐藏登录页面: 回车快捷键: 传值到main窗口: