【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. 十六进制颜色对照表
参考博客: