关于C语言——应用函数介绍

句柄较为复杂,可去问度娘;用法不准确请指正

1、HANDLE

本篇随笔主要内容是各个函数的使用,想了解句柄HANDLE的读者可以先看下这篇文章:深入了解Windows句柄到底是什么   

HANDLE在WindNT.h中的声明

句柄也可以映射到唯一的对象windows需要向程序员提供必要地编程接口,在这些接口中,允许程序员访问,创建和销毁对象,但是,出于封装的考虑,windows并不想向程序员返回指针如果作数据的话,句柄这种方式则允许你按自己的方式直接操作数据,但windows又不向你直接暴露数据。直接操作数据是程序员需要的,不暴露数据是windows所需要的,句柄封装方式实现了各取所需。

       “句柄”是Windows最常用的概念。它通常用来标识Windows资源(如菜单、图标、窗口等)和设备等对象。虽然可以把句柄理解为是一个指针变量类型,但它不是对象所在的地址指针,而是作为Windows系统内部表的索引值来使用的。

2、GetStdHandle函数

函数功能:获取指定的标准设备的句柄,使用GetStdHandle需要一个参数,参数的取值有三种

 

STD_INPUT_HANDLE----标准输入句柄

 

STD_OUTPUT_HANDLE----标准输出句柄

 

STD_ERROR_HANDLE----标准错误句柄

 

先回顾一下文件操作中输入输出重定向的概念

 

在默认情况下:

 

标准输入(stdin)----键盘

 

标准输出(stdout)----显示器(屏幕)

 

标准错误(stderr)----显示器(屏幕)

 

(注意:标准输出句柄和标准错误句柄默认情况下都是对应的屏幕

HANDLE hOut可理解为:定义了一个变量名为hOut的变量,变量的类型为HANDLE(句柄)类型

3、COORD

COORD是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标。其在头文件WinCon.h中的定义为:

1 typedef struct _COORD {

2 SHORT X;

3 SHORT Y;

4 } COORD, *PCOORD;

从上面可以看出 COORD是一个结构体类型,结构体里面有两个短整形变量X、Y,用来表示光标的坐标

 

(注意:X是横坐标(horizontal coordinate),Y是纵坐标(vertical coordinate)不要与二维数组的坐标表示搞混了,二维数组第一维是纵坐标,第二维是横坐标)

COORD pos = {x, y};/* x是横坐标 y是纵坐标 

4、CONSOLE_CURSOR_INFO

控制台光标信息,先去WinCon.h里面去瞧一瞧声明是什么样子的

 

typedef struct _CONSOLE_CURSOR_INFO {

    DWORD dwSize;

    BOOL bVisible;

} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;

从上面可以看出,CONSOLE_CURSOR_INFO是一个结构体,结构体里面有两个成员一个是dwSize表示光标的大小(取值范围1~100),第二个是成员是bVisible表示光标是否可见((TRUE)可见,(FALSE)不可见

5、SetConsoleCursorInfo函数

函数功能:设置控制台光标信息,使用这个函数需要两个参数,第一个参数的类型HADNLE,第二个参数的类型CONSOLE_CURSOR_INFO *类型

 1 #include <stdio.h>

 2 #include <windows.h>

 3 

 4 void ConsoleCursor ();

 5 

 6 int main() 

 7 {

 8     

 9 

10 return 0;

11 }

12 

13 void ConsoleCursor ()

14 {

15 HANDLE hOut;

16 CONSOLE_CURSOR_INFO cur; /* 定义了一个结构体变量 cur*/

17 

18 cur.dwSize = 100; /* 光标大小设置为100 */

19 hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标注输出句柄 */

20 SetConsoleCursorInfo(hOut, &cur); /* 设置控制台光标信息 */

21 }

上面的代码中,ConsoleCursor这个函数中没有设置光标是否可见(默认为可见),读者如果想设置为光标不可见将bVisible赋值为0就可以了(0(光标不可见)、非0(光标可见))

 

(注意:dwSize的取值范围是1~100,如果赋值的大小超过100则参数失效,光标大小为默认大小

在设置光标不可见时发现了一个有趣的现象,如果只把光标设置为不可见cur.bVisible = 0,而不对光标的大小赋值的话,用SetConsoleCursorInfo是不起作用的

 

 代码如下:

 

 18 #include <stdio.h>

 2 #include <windows.h>

 3 

 4 void ConsoleCursor ();

 5 

 6 int main() 

 7 {

 8 printf("***");

 9 ConsoleCursor();

10 return 0;

11 }

12 

13 void ConsoleCursor ()

14 {

15 HANDLE hOut;

16 CONSOLE_CURSOR_INFO cur; /* 定义了一个结构体变量 cur*/

17 

18 //cur.dwSize = 100; /* 光标大小设置为100 */

19 cur.bVisible = 0; /* 光标设置为不可见 */

20 hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标注输出句柄 */

21 SetConsoleCursorInfo(hOut, &cur); /* 设置控制台光标信息 */

22 }

光标并没有隐藏,想要隐藏光标需要给光标大小cur.dwSize赋值,赋值范围1~100(如果赋值大小超过1~100,那么赋值无效,光标还是无法隐藏---这也算个坑了 要注意一下)

 

给cur赋初值也可这样写

 

CONSOLE_CURSOR_INFO cur = {1, 0};

 

6、SetConsoleCursorPosition函数

SetConsoleCursorPosition这个函数的功能是:设置控制台光标坐标(Set--设置、Console--控制台、Cursor--光标、Position--坐标,还算蛮好记的),使用这个函数需要两个参数:第一个参数类型为HANDLE,第二个参数类型为COORD

 

代码示例:

 

 1 #include <stdio.h>

 2 #include <windows.h>

 3 

 4 void gotoxy(int x, int y);

 5 void ConsoleCursor ();

 6 

 7 int main() 

 8 {

 9 printf("***");

10 gotoxy(0,5);

11 printf("***");

12 

13 return 0;

14 }

15 

16 void gotoxy(int x, int y)

17 {

18 COORD pos = {x, y};/* x是横坐标 y是纵坐标 */

19 HANDLE hOut;

20 

21 hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标注输出句柄 */

22 SetConsoleCursorPosition(hOut,pos); /* 设置控制台光标坐标(设备句柄, 光标坐标) */

23 }

 运行效果图:

 

 

 

 

7、CONSOLE_SCREEN_BUFFER_INFO

控制台窗口缓冲区信息,先到WinCon.h头文件中瞧一下声明部分

typedef struct _CONSOLE_SCREEN_BUFFER_INFO {

    COORD dwSize;

    COORD dwCursorPosition;

    WORD wAttributes;

    SMALL_RECT srWindow;

    COORD dwMaximumWindowSize;

} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO;

这个比上面CONSOLE_CURSOR_INFO(控制台光标信息)的成员多了一些,一个一个成员来看

 

第一个成员:

 

COORD dwSize; 

dwSize缓冲区的宽度X和高度Y

第二个成员:

 

COORD dwCursorPosition;

dwCursorPosition当前光标在缓冲区中的坐标

第三个成员:

WORD wAttributes;

wAttributes文本的属性(前景色、背景色等信息)

第四个成员:

 

SMALL_RECT srWindow;

srWindow当前窗口显示的大小和位置

第五个成员:

 

COORD dwMaximumWindowSize;

dwMaximumWindowSize最大的窗口缓冲区大小

8、GetConsoleScreenBufferInfo函数

函数功能:获取控制台窗口缓冲区信息,使用这个函数需要两个参数,第一个参数HANDLE类型,第二参数CONSOLE_SCREEN_BUFFER_INFO*类型

 

使用这个函数就可以得到控制台缓冲区的一些有意思的信息了,下面来看一下可以得到哪些参数

 

代码示例:

 

#include <stdio.h>

#include <windows.h>

 

void TextAttribute(); /* 设置前景色、后景色、获取控制台信息 */

 

int main() 

{

    printf("***");

    TextAttribute();

    return 0;

}

/* Function: 设置前景色后景色和获取控制台信息 */

void TextAttribute ()

{

    HANDLE hOut;

    CONSOLE_SCREEN_BUFFER_INFO scr;

 

    hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标准输出句柄 */

    GetConsoleScreenBufferInfo(hOut, &scr);

    printf("当前光标:\n横坐标=%d 纵坐标=%d\n", scr.dwCu

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值