🌈前言:此篇博客是为下一篇的《贪吃蛇》的做的前戏工作,这篇会讲到贪吃蛇所用到的一些工具以及函数。
首先在讲WIN32的内容时我们想了解一下他的基本概念:
目录
💫一.控制台程序编辑
✈️二.控制台屏幕上的坐标COORD
=͟͟͞͞🏀三.GetStdHandle
🔎四.GetConsoleCursorInfo和CONSOLE_CURSOR_INFO
🚀五.SetConsoleCursorInfo
🛸六.SetConsoleCursorPosition
编辑 🥎七.GetAsyncKeyState
🍓八.宽字符的使用
1.前景
2.本地化
3.类项
4.setlocale函数
💫一.控制台程序
看到这个我们是不是绝大很熟悉,没错这就是我们写代码经常使用的控制台。
我们可以在电脑上搜索cmd可以打开我们的控制台
并且我们可以在里面输入mode con cols= lines= 来调整它的行高和列宽。
就向这样就可以调整我们的行高和列宽。
那么我们在做一些程序的时候想把控制台右上角的标题改一下需要怎么做呢?
可以使用title 名称的方式来改变。
那么在我们的c语言中怎么能将他们改变呢?
这是就需要用到我们的system函数,前面我们也可能接触过他。它的库函数是《stdlib.h》。
#include<stdlib.h>
int main()
{
system("mode con cols=100 lines=30");
system("title 贪吃蛇");
system("pause");
printf("hello world!");
return 0;
}
同意可以实现相同的效果。
✈️二.控制台屏幕上的坐标COORD
typedef struct _COORD {
SHORT X;
SHORT Y;
} COORD, *PCOORD;
COORD pos = { 30, 10 };
=͟͟͞͞🏀三.GetStdHandle
这个函数可以获取到当前使用设备的控制信息。并且配合其他函数可以实现对光标以及光标位置大小的修改。
会返回过来一个HANDLE的参数
HANDLE GetStdHandle(DWORD nStdHandle);
HANDLE handle= NULL;
handle = GetStdHandle(STD_OUTPUT_HANDLE);
🔎四.GetConsoleCursorInfo和CONSOLE_CURSOR_INFO
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize;
BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
🚀五.SetConsoleCursorInfo
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CurInfor;
GetConsoleCursorInfo(handle, &CurInfor);
CurInfor.bVisible = false;
SetConsoleCursorInfo(handle, &CurInfor);
可以看到我们的光标信息以及被隐藏。
🛸六.SetConsoleCursorPosition
BOOL WINAPI SetConsoleCursorPosition(HANDLE hConsoleOutput, COORD pos);
//获得设备句柄
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
//根据句柄设置光标的位置
COORD pos={20,5};
SetConsoleCursorPosition(handle, pos);
根据pos的数值对光标位置进行调整。
我们可以将上述代码分装成一个setpos函数,参数为x,y。
x代表控制台以右上角黑框部分顶点为原点两条边为横纵坐标的横坐标,y则代表纵坐标。
🥎七.GetAsyncKeyState
获取按键情况,GetAsyncKeyState的函数原型如下:
SHORT GetAsyncKeyState(
int vKey
);
我们可以用宏定义将他包装起来,将返回值与0x1按位与则可以得到是否按过此键位。
#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )
🍓八.宽字符的使用
1.前景
这⾥简单的讲⼀下C语⾔的国际化特性相关的知识,过去C语⾔并不适合⾮英语国家(地区)使⽤。
C语⾔字符默认是采⽤ASCII编码的,ASCII字符集采⽤的是单字节编码,且只使⽤了单字节中的低7 位,最⾼位是没有使⽤的,可表⽰为0xxxxxxxx;可以看到,ASCII字符集共包含128个字符,在英语 国家中,128个字符是基本够⽤的,但是,在其他国家语⾔中,⽐如,在法语中,字⺟上⽅有注⾳符 号,它就⽆法⽤ ASCII 码表⽰。于是,⼀些欧洲国家就决定,利⽤字节中闲置的最⾼位编⼊新的符 号。⽐如,法语中的é的编码为130(⼆进制10000010)。这样⼀来,这些欧洲国家使⽤的编码体 系,可以表⽰最多256个符号。但是,这⾥⼜出现了新的问题。不同的国家有不同的字⺟,因此,哪 怕它们都使⽤256个符号的编码⽅式,代表的字⺟却不⼀样。⽐如,130在法语编码中代表了é,在希 伯来语编码中却代表了字⺟Gimel
2.<locale.h>本地化
• 数字量的格式• 货币量的格式• 字符集• ⽇期和时间的表⽰形式
3.类项
• LC_COLLATE(影响字符串比较函数strcoll()和strfrm())• LC_CTYPE(影响处理函数的行为)• LC_MONETARY(影响货币格式)• LC_NUMERIC(影响printf的数字格式)• LC_TIME(影响时间格式strftime()和wcsftime())• LC_ALL - 针对所有类项修改
4.setlocale函数
char* setlocale (int category, const char* locale);
setlocale(LC_ALL, "C");
setlocale(LC_ALL, " ");//切换到本地环境
我们可以用wchar_t ch=L'●'来创建宽字符的变量。
用wprintf来打印。