【C语言】控制台窗口图形界面编程(一)句柄和文本属性
00. 目录
文章目录
- 00. 目录
- 01. 句柄
- 02. GetStdHandle函数
- 03. CloseHandle函数
- 04. SetConsoleTextAttribute函数
- 05. 十进制颜色对照表
- 06. 十六进制颜色对照表
01. 句柄
句柄是Windows最常用的概念。它通常用来标识Windows资源(如菜单、图标、窗口等)和设备等对象。虽然可以把句柄理解为是一个指针变量类型,但它不是对象所在的地址指针,而是作为Windows系统内部表的索引值来使用的。
HANDLE在winnt.h中的声明为
typedef void *HANDLE;
从上面可以看出HANDLE是一种无类型指针,句柄是处理对象的一个接口,你可以通过句柄去操作程序中所涉及的对象。在windows中,句柄是和对象一一对应的32位无符号整数值,对象可以映射到唯一的句柄,
句柄也可以映射到唯一的对象windows需要向程序员提供必要地编程接口,在这些接口中,允许程序员访问,创建和销毁对象,但是,出于封装的考虑,windows并不想向程序员返回指针
如果作数据的话,句柄这种方式则允许你按自己的方式直接操作数据,但windows又不向你直接暴露数据。直接操作数据是程序员需要的,不暴露数据是windows所需要的,句柄封装方式实现了各取所需。
“句柄”是Windows最常用的概念。它通常用来标识Windows资源(如菜单、图标、窗口等)和设备等对象。虽然可以把句柄理解为是一个指针变量类型,但它不是对象所在的地址指针,而是作为Windows系统内部表的索引值来使用的。
参考示例:
HANDLE hOut = NULL;
深入了解Windows句柄到底是什么
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. 十六进制颜色对照表
《C语言控制台窗口界面编程(修正版)》(建议大家看博客, 该文档不推荐看)
CSDN下载地址:https://download.csdn.net/download/dengjin20104042056/11197571
【C语言】控制台窗口图形界面编程(一)句柄和文本属性相关推荐
- 如何打开电脑c语言窗口,C语言控制台窗口图形界面编程(五). -电脑资料
控制文本的移动是控制台窗口界面编程的一个很重要的功能,有了这个功能我们可以实现界面的滚动, BOOL ScrollConsoleScreenBuffer( //文本移动函数 HANDLE h ...
- C语言控制台窗口图形界面编程
一:设置句柄与窗口信息 在Windows操作系统下用C语言编写控制台的窗口界面首先要获取当前标准输入和标准输出设备的句柄.通过调用函数GetStdHandle可以获取当前标准输入以及输出设备的句柄.函 ...
- C语言控制台窗口图形界面编程(五).
控制文本的移动是控制台窗口界面编程的一个很重要的功能,有了这个功能我们可以实现界面的滚动.下面我们介绍一个控制文本移动的函数,如下: BOOL ScrollConsoleScreenBuffer( ...
- C语言控制台窗口图形界面编程(七):键盘事件
输入事件中的键盘事件通常有字符事件和按键事件,这些事件的附带信息构成了键盘输入的信息,而想要读取这些信息,是要通过API函数ReadConsoleInput来获取的,函数原型如下: 1 BOOL Re ...
- 【C语言】控制台窗口图形界面编程(四):文本输出
00. 目录 文章目录 00. 目录 01. FillConsoleOutputAttribute函数 02. FillConsoleOutputCharacter函数 03. WriteConsol ...
- 【C语言】控制台窗口图形界面编程(三)窗口相关设置
00. 目录 文章目录 00. 目录 01. GetConsoleTitle函数 02. SetConsoleTitle函数 03. SetConsoleScreenBufferSize函数 04. ...
- 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区
00. 目录 文章目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScr ...
- 【C语言】控制台窗口图形界面编程(五):文本移动
00. 目录 文章目录 00. 目录 01. CHAR_INFO结构 02. ScrollConsoleScreenBuffer函数 03. 程序示例 04. 官方参考程序 01. CHAR_INFO ...
- 游标式屏幕菜单c语言,【C语言】控制台窗口图形界面编程(六):光标设置
00. 目录 01. CONSOLE_CURSOR_INFO结构 包含有关控制台光标的信息. typedef struct _CONSOLE_CURSOR_INFO { DWORD dwSize; B ...
最新文章
- JQuery获取元素本身HTML
- php中empty功能,在php中empty函数起什么作用呢?
- FZU 1894 志愿者选拔
- 如何通俗易懂地解释欧拉公式(e^πi+1=0)?
- 程序员1w5以下的,2020年就要面对现实了...
- axure9数据统计插件_WMDA:大数据技术栈的综合实践
- Jmeter操作之跨线程组传递参数
- 华为隐藏功能扩大内存代码大全_发现将华为手机这3个功能打开,竟然可以将手机性能极限发挥...
- python常见的控制流结构有_【Python】控制流语句、函数、模块、数据结构
- C语言学习资料----快速排序
- 家庭农场海边作弊工具的Andr​​oid的ios
- LGTM,XGBOOST,LIGHTGBM
- python中jieba分词,并输出词云(基础版)
- stlink故障修复
- 通读JavaScript红皮书(第二三章)
- 碳纤维复合材料加工难点及铣削加工电主轴应用方案
- DDR4时序标准规范(一)
- 【软件构造】实验一的心得体会
- UE4C++ 调用蒙太奇动画
- OSChina 周四乱弹 —— 剁手过双十一
热门文章
- ODP.NET 10.2.0.20发布了
- Java黑皮书课后题第10章:10.3(MyInteger类)设计一个名为MyInteger的类
- 程序员面试100题之十六:二叉树中两个节点的最近公共父节点
- KMP算法详解及各种应用
- gitlab+jenkins 搭建
- python7.1处理异常
- 浅谈APP的分享功能,有时候社交裂变形式比内容更“重要”
- git/github使用详解
- 【bzoj1212】[HNOI2004]L语言 AC自动机
- 关于EGE图形库在CodeBlocks下的配置