win32 API
1.控制台:平时的那个黑框框,还有cmd即命令提示符
2.使用cmd命令设置控制台窗口的大小:30行,100列
mode con cols=100 lines=30
3.通过命令设置控制台窗口的名字
title 贪吃蛇
4.我们能够用C语言中的system函数来执行系统命令
2.3.4例:
system("mode con cols=100 lines=30);
system("title 贪吃蛇);
注:在程序结束后,名字会恢复原样
可以用这个:system("pause");//pause叫暂停(按任意键继续)
5.坐标(0,0)表示最左上角哪个地方(注:是左上角顶部!)
COORD是一个结构体,表示一个字符在控制台屏幕缓冲区上的坐标
COORD的声明:
typedef struct_COORD{
SHORT X;
SHORT Y;
}COORD, *PCOORD;
5.例:
COORD pos = { 40, 10 };(头文件:windows.h)
6.获取句柄:
HANDLE GetStdHandle(DWORD nStdHandle);
nStdHandle参数仅有下列三个
STD_INPUT_HANDIE标准输入设备
STD_OUTPUT_HANDIE标准输出设备
STD_ERROR_HANDIE标准错误设备
6.例:
HANDLE operate = NULL;
operate = GetStdHandle(STD_OUTPUT_HANDIE);
然后便可以通过operate来操作标准输出流了
7.隐藏光标所要知晓的知识:
(1.)
typedef struct _CONSOLE_CURSOR_INFO
{
DWORD Size;
BOOL Visible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
Size是光标所占字符单元格的百分比
Visible是游标的可见性,默认为true
(2).
BOOL WINAPI GetConsoleCursorInfo
( HANDLE hConsoleOutput
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo );
第一个参数是句柄
二是上边那个结构体。
这个函数的功能是获取第一个参数所指向控制台中的光标信息,并放到第二个参数中去
(3).
BOOL WINAPI SetConsoleCursorInfo(
HANDLE hConsoleOutput,
const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
);
第一个参数是句柄
二是上边那个结构体。
这个函数的功能是将第二个参数所指向的光标信息,放到第一个参数所指向控制台中去
(4).使用示例:
先造一个结构体:
CONSOLE_CURSOR_INFO cursor info = {0};
接着获取当前句柄的光标信息
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleCursorInfo(handle,&cursor_info);
再设置相关信息
cursor info.bVisible = false;
再将这个信息赋予句柄
SetConsoleCursorInfo(handle,&cursor_info);
完成
8.
在指定位置打印信息所需要掌握的知识:
(1).
COORD pos = { 20, 50 };
(2).
BOOL WINAPI SetConsoleCursorPosition(
HANDLE hConsoleOutput,
COORD pos
);
第一个参数是句柄
二是储存着坐标信息的变量(储存方式和上边那个一样)
(3).使用示例:
先造一个句柄
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
再存储坐标信息:
COORD pos = { 10, 20 };
再将pos弄进去
SetConsoleCursorPosition(handle, pos);
printf("haha");
(4).将光标坐标的修改造成一个函数
void My_SetPos(int x, int y)
{
COORD pos = { x, y };
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(handle, pos);
}
9.
SHORT GetAsyncKeyState(
int vKey
);
将键盘上每一个键的虚拟键值都传递给函数,函数通过返回值来分辨按键的状态。
GetAsyncKeyState
的返回值是short类型,在上⼀次调⽤
GetAsyncKeyState
函数之后,如果
返回的16位short数据当中,最高位是1,说明按键状态是按下,如果最高是0,说明按键状态是抬 起;如果最低位被置为1,则说明该按键被按过,否则为0。
9.例:
将9封装成一个宏:
#define KEY_PRESS(VK) ((GetAsyncKeyState(VK)&0x1) ? 1 : 0)
10.
●▼★■等都叫宽字符
要想输出这种字符那么要具备的知识:
(1.)首先要适配到本地环境
用
char* setlocale (int category, const char* locale);
setlocale 函数用于修改当前的地区,不仅可以针对⼀个类项修改,还可以针对所有类项。
setlocale 的第⼀个参数可以是前面说明的类项中的⼀个,这样的话每次只会影响⼀个类项,而如果第⼀个参 数是LC_ALL,就会影响所有的类项。
C标准给第⼆个参数仅定义了2种可能取值:“C”(正常模式)和“”(本地模式)
在任意程序执行开始,都会隐藏式执行调用:
当地区设置为"C"时,库函数按正常方式执行,小数点是⼀个点。
当程序运行起来后想改变地区,就只能显示调用setlocale函数。用""作为第2个参数,调用setlocale 函数就可以切换到本地模式,这种模式下程序会适应本地环境。比如:切换到我们的本地模式后就支持宽字符(汉字)的输出等
(2).打印
一个汉字也是一个宽字符
宽字符的打印用wprintf(),对应的占位符是%lc;
还有%ls;
(2).例:
setlocale(LC_ALL, "");
wchar_t ch1 = L'古';
wprintf(L"%lc\n", ch1);
打印宽字符串:
setlocale(LC_ALL, "");
wchar_t ch[20] = L"落魄谷中寒风吹";
wprintf(L"%s\n", ch);
(3).注:一个宽字符占两个正常字符的宽度
11.初始化建议:地图27行58列,(24,5)处出现蛇,连续5个节点
12.注意事项:蛇的身体节点和食物的x坐标都是偶数
13.SetPos坐标函数那里进行一个补充:
第一个参数是x,第二个是y,x指的是X轴的,即横着的坐标,而不是第几行
14.
VK_LEFT | 0x25 | LEFT ARROW 键 |
VK_UP | 0x26 | UP ARROW 键 |
VK_RIGHT | 0x27 | RIGHT ARROW 键 |
VK_DOWN | 0x28 | DOWN ARROW 键 |
选自:虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn