当前位置: 移动技术网 > IT编程>开发语言>C/C++ > 【C语言】控制台窗口图形界面编程(一)句柄和文本属性

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

2019年06月03日  | 移动技术网IT编程  | 我要评论

玳瑁棕,碎玉娃娃,中国移动社会渠道

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

执行结果

05. 十进制颜色对照表

06. 十六进制颜色对照表

参考博客:

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网