windows.h——c++开发应用程序必不可少的函数库
一 引入——头文件的重要性
windows.h 是 c++ 语言里的一个头文件,它在算法竞赛中几乎是毫无用处,但是它依然很重要,因为如果你想开发一些应用程序或者是小游戏,则这个头文件是必不可少的。
为什么是必不可少的呢?
理由是:这个头文件里有很多底层函数,就是那种无从手写的那种。
二 简介——头文件里有什么
点开头文件,我们能看到这个:
windows.h里包含这些头文件
"这些头文件定义了Windows的所有资料型态、函数调用、资料结构和常数识别字,它们是Windows文件中的一个重要部分。” ——百度百科
是不是很难理解,简单来说,头文件里的函数有的用来控制界面,还有的用来沟通不同的设备(比如鼠标、键盘)。
三 一些简单好用的函数
1 控制输出字体的颜色
假想一下,如果您设计了一个游戏,但是游戏界面都是黑白的,那么游玩体验是不是大打折扣,于是我们就先来看一下如何设置输出字体的颜色。
众所周知,计算机的三原色是红、绿、蓝(RGB),你电脑上的色彩就是由这三种颜色调配出来的。windows.h 头文件中有一个SetConsoleTextAttribute 函数,它可以来调整输出字体的颜色。 函数是这样使用的:
void green()
{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE)/*这里是固定的*/,/*若干颜色的混合*/); }
函数的第一个参数是固定的,第二个参数有以下选择:
//字体颜色
FOREGROUND_GREEN
FOREGROUND_RED
FOREGROUND_INTENSITY
FOREGROUND_BLUE
//背景颜色
BACKGROUND_GREEN
BACKGROUND_RED
BACKGROUND_INTENSITY
BACKGROUND_BLUE
7 //正常编译器的颜色
做一个实验:
#include <iostream>
#include <cstdlib>
#include <windows.h>
using namespace std;
void white()
{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); }
void red()
{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED); }
void blue()
{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE); }
void green()
{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN); }
int main()
{
red();
cout << "red" << endl;
blue();
cout << "blue" << endl;
green();
cout << "green" << endl;
white();
return 0;
}
结果是这样的:
当然红绿蓝也是可以叠加在一起的,产生更多颜色,具体可问美术老师,这里给一点现成的函数。
#define in inline
il void red_back()
{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_RED); }
il void blue_back()
{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_BLUE); }
il void blue()
{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE); }
il void green()
{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN); }
il void yellow()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
}
il void pink()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);
}
il void red_yellow()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
BACKGROUND_RED
| FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
}
il void blue_yellow()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_BLUE
| BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN);
}
il void yellow_green()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
BACKGROUND_GREEN
| FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
}
il void sky_blue()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
il void sky_blue_back()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
BACKGROUND_INTENSITY | BACKGROUND_GREEN | BACKGROUND_BLUE);
}
il void pink_back()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
BACKGROUND_RED | BACKGROUND_BLUE);
}
il void yellow_pink()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_BLUE
| FOREGROUND_RED | FOREGROUND_GREEN);
}
当然,函数不知这么一点,大家也可以仿照这这样的格式调出更多颜色,调色的话,不同颜色用“|”隔开。
2 获取键盘信息
我之前开发小游戏时在这里卡了很久,感谢在讨论区-学术版里提示我的用户们。
如果您向开发应用程序或小游戏,这一部分是重点。
想象一下,您开发了一个游戏,但是游戏用户必须要向制造输入样例那般输入,那么用户的游玩体验将会多差。
更致命的是,有时候你并不知道用户会不会输入(比如一个飞机大战游戏中,用户可能不选择攻击,你总不能让用户啥都不干却也要输入 0 吧)
GetKeyState 函数能帮助您解决这个问题,我直接把打包好的函数贴过来:
#include <cstdio>
#include <windows.h>
using namespace std;
bool tab_press()
{
return (GetKeyState(VK_TAB)&0x8000);
}
bool shift_press()
{
return (GetKeyState(VK_SHIFT)&0x8000);
}
bool right_press()
{
return (GetKeyState(VK_RIGHT)&0x8000);
}
bool up_press()
{
return (GetKeyState(VK_UP)&0x8000);
}
bool down_press()
{
return (GetKeyState(VK_DOWN)&0x8000);
}
bool space_press()
{
return (GetKeyState(VK_SPACE)&0x8000);
}
int main()
{
for (int i = 1; i <= 500; ++i)
{
printf("%d\n", up_press());
Sleep(100);
}
return 0;
}
3 移动光标位置
有时候,你可能在屏幕左半边输出了一些汉字,但是右半边是空的,导致页面很长,这在显示动态图像上很不方便,于是我们有一个 SetConsoleCursorPosition 函数可以把光标移动到相应位置,为了方便,我也给大家打包好了:
void move(short y, short x)
{
HANDLE place;
place = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(place, pos);
}
函数功能:move(x, y) 可以把光标移动到第 x 行第 y 列。
有人可能会问:为什么传参的时候是反着的?
因为原函数的功能是吧光标移动到第 x 列 y 行,但是一般人都是先说行后说列,所以打包时候传参是反的,可放心使用。
四 结语
有了这三个函数,您就可以自己开发出很多好玩有用的应用程序呢,这就是我自己开发的一个飞机大战游戏截图。
其实 windows.h 头文件真的很好用呢!
福利:中考英语单词复习器、高考英语单词复习器应用程序+代码