个人主页:星纭-CSDN博客
系列文章专栏 : C语言
踏上取经路,比抵达灵山更重要!一起努力一起进步!
一.Win32 API
1.Win32 API介绍
Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外,它同时也是⼀个很⼤ 的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启 视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application),所以便 称之为Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows 32位平台的应⽤程序编程接⼝。Win32 API(Windows API)是一组用于开发Windows应用程序的编程接口。它提供了许多功能,包括图形界面、文件和设备操作、网络通信、多媒体处理等。Win32 API是基于C语言的,开发者可以使用C或C++来编写应用程序。
2.控制台程序
平常我们运行程序出来的那个黑框程序就是控制台程序
有些读者的电脑,可能运行程序得到是这样的:
读者可以按照如图所示的操作将其进行更改。
然后关闭重新运行程序。 就可以得到以下效果。
这样的控制我们是可以对其进行许多的操作的。
我们可以使用cmd命令来设置控制台窗口的大小。参考:mode
system("mode con cols=100 lines=30");
第一个参数con指的是命令提示符窗口,第二个就是列,第三个就是行。我们可以将这个更改为我们自己想要的值。
如果你觉得窗口最左上角的内容不想要,也可以进行更改。通过命令设置控制台窗口的名字。
system("title 贪吃蛇");
#include<windows.h>
int main()
{
system("mode con cols=100 lines=30");
system("title 贪吃蛇");
}
使用system函数 是需要包含头文件windows.h的。
如果读者自行尝试运行以上的代码,会发现,控制台窗口的名字,并没有更改成我们想要的样子。
这是为什么呢?
因为运行完以上代码后,程序就结束了,它就变成了之前的名字。
如果我们再加上一行代码就可以看到想要更改的名字了。
此时的程序会停止下来,如果我们随便按一个键,此时程序就会继续运行,当程序结束后名字又会变回去。
参考:title
3.控制台程序上的坐标COORD
COORD是windows API中定义的一个结构体,定义控制台屏幕缓冲区中字符单元的坐标。 坐标系 (0,0) 的原点位于缓冲区的顶部左侧单元格。
COORD类型的声明
typedef struct _COORD{
SHORT X;
SHORT Y;
}COORD,*PCOORD;
给坐标赋值:
COORD pos = { 10,15 };
4.GetStdHandle函数
GetStdHandle函数是一个windowsAPI函数,它用于从一个特定的标准设备(标准输入,标准输出或者标准错误)中获得一个句柄(来表示不同的设备的数值),使用这个句柄可以操作设备。
//获得标准输出设备的句柄(来标识不同的设备)
HANDLE houtput = NULL;
houtput = GetStdHandle(STD_OUTPUT_HANDLE);
这个函数的返回值是一个HANDLE类型的值。
5.GetConsoleCursorInfo 函数
GetConsoleCursorInfo 函数可以用于对得到有关指定控制台屏幕缓冲区的光标的大小和可以信息。
对于这个光标来说,此时的光标是只有25%的,并且可见的,我们可以通过更改光标信息,让其占据满整个字符,或者不可见。
BOOL WINAPI GetConsoleCursorInfo(
HANDLE hConsoleOutput,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);
PCONSOLE_CURSOR_INFO 是指向 CONSOLE_CURSOR_INFO 结构的指针,该结构接收有关主机游标。
第一个参数是控制台的句柄,第二个参数是类型是控制光标信息的一个变量的指针。
调用这个函数会把控制台光标的信息存放在第二个参数所指向的变量中。
6.CONSOLE_CURSOR_INFO
这个结构体,包含了控制台光标的信息
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize;
BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
第一个成员变量是控制光标填充字符单元的百分比大小,比如开始的时候,填充大概是25.
第二个成员变量就是控制光标是否可见,如果我们想完成一个游戏,当这个光标一直在屏幕上一闪一闪,难免影响游戏体验,这时候就可以将其设置为不可见。
7.SetConsoleCursorInfo 函数
SetConsoleCursorInfo 函数可以为指定的控制台屏幕缓冲区设置光标的大小和可见性。
第一个参数句柄,第二个参数是控制台信息。
8.修改光标
学习了上面的知识点,我们就可以尝试按照自己的想法更改光标了。
//}
int main()
{
//获得标准输出设备的句柄
HANDLE houtput = NULL;
houtput = GetStdHandle(STD_OUTPUT_HANDLE);
//定义一个光标信息的结构体
CONSOLE_CURSOR_INFO cursor_info = {0};
//获取和houput句柄相关的控制台上的光标的信息,存放在cursor_info中
GetConsoleCursorInfo(houtput,&cursor_info);
//修改光标信息
cursor_info.dwSize = 100;//占比
cursor_info.bVisible = false;//可见度
//设置和houtput句柄相关的控制台上的光标的信息
SetConsoleCursorInfo(houtput, &cursor_info);
printf("光标占比 :%d\n",cursor_info.dwSize);
printf("光标可见度:%d\n",cursor_info.bVisible);
system("pause");
return 0;
}
讲解上面的代码:
HANDLE houtput是一个变量。通过这个函数GetStdHandle(STD_OUTPUT_HANDLE)从标准输出设备中得到有关其的句柄。返回值用houtput这个接收,这样我们就可以通过这个变量来控制标准输出设备。
CONSOLE_CURSOR_INFO cursor_info这是一个有关控制台光标信息的一个结构体。
GetConsoleCursorInfo(houtput,&cursor_info);从句柄中得到有关光标的信息,并且存放在上面的结构体中。
然后就可以通过这个结构体更改光标信息,但是实际上,电脑中的这个光标信息是没有变化的,这个结构体只不过是一个光标信息的复制品。
SetConsoleCursorInfo(houtput, &cursor_info);这个函数就根据这个结构体中存储的光标信息,对真正的光标信息,进行更改。
最后打印出这个光标信息。
9.SetConsoleCursorPosition函数
语法:
BOOL WINAPI SetConsoleCursorPosition(
_In_ HANDLE hConsoleOutput,
_In_ COORD dwCursorPosition
);
设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的变量中,调用该函数将光标位置移动到指定的位置。
//获得标准输出设备的句柄
HANDLE houtput = NULL;
houtput = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = {10, 5};
SetConsoleCursorPosition(houtput, pos);
Sleep(10000);
可以观察到光标的位置在10,5的位置。
为了方便,我们可以单独封装一个函数来设置光标的位置。
10.getAsyncKeyState 函数
SHORT GetAsyncKeyState(
int vKey
);
这个函数将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果 返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬 起;如果最低位被置为1则说明,该按键被按过,否则为0。 如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1
#define KEY_PRESS(vk) ((GetAsyncKeyState(vk) & 1) ? 1 : 0)
通过按位与操作符就可以判断最地位是否为1.
虚拟键码:虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn
也可以通过这个返回值是否小于0来判断这个键有没有被按下。
#define KEY_PRESS_sustained(vk) ((GetAsyncKeyState(vk) < 0) ? 1 : 0)