欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-29 07:57:10
00. 目录 [TOC] 01. 句柄 ​ 句柄 是Windows最常用的概念。它通常用来标识Windows资源(如菜单、图标、窗口等)和设备等对象。虽然可以把句柄理解为是一个指针变量类型,但它不是对象所在的地址指针,而是作为Windows系统内部表的索引值来使用的。 HANDLE在winnt.h中 ......

00. 目录

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;
}

执行结果

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

05. 十进制颜色对照表

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

06. 十六进制颜色对照表

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

参考博客: