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 头文件真的很好用呢!

福利:中考英语单词复习器、高考英语单词复习器应用程序+代码