1.必备知识点-控制台相关方法
1.1 知识点
修改控制台为Windows控制主机的窗口
输入输出
知识回顾
cout << "任意信息\n";
cout << "任意信息" << endl;
string str;
cin >> str;
cout << str << endl;
不显示输入内容在控制台上,直接获取单键输入信息
- 引用一个系统写好的程序文件:
#include <conio.h>
- 使用
_getch()
获取输入的字符,无需按回车键,且输入内容不会显示在控制台上。
int c = _getch();
switch (c)
{
case 'W':
case 'w':
cout << "输入了一个w" << endl;
break;
case 'S':
case 's':
cout << "输入了一个s" << endl;
break;
default:
break;
}
- 对于特殊键位(比如方向键、功能键F1~F12等),需要调用两次
_getch()
方法:- 第一次得到的是特殊值
0
或224
,代表是一个特殊键。 - 第二次得到的是特殊键的具体编码。
- 第一次得到的是特殊值
while (true)
{
int c = _getch();
if (c == 0 || c == 224)
{
c = _getch();
switch (c)
{
case 72:
cout << "上箭头输入" << endl;
break;
case 80:
cout << "下箭头输入" << endl;
break;
case 75:
cout << "左箭头输入" << endl;
break;
case 77:
cout << "右箭头输入" << endl;
break;
default:
break;
}
}
else
{
cout << (char)c << endl;
}
}
导入写好的自定义控制台
导入步骤
- 导入代码
CustomConsole.cpp
和CustomConsole.h
。 - 将其复制到项目中,并在项目中选择“添加现有项”。
- 使用前需要引用导入的头文件:
#include "CustomConsole.h"
自定义控制台代码逻辑
#include "CustomConsole.h"
// 设置光标位置
void setCursorPosition(int x, int y) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
COORD cursorPosition;
cursorPosition.X = x;
cursorPosition.Y = y;
SetConsoleCursorPosition(hConsole, cursorPosition);
}
// 设置控制台大小
void setConsoleSize(int width, int height) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
COORD bufferSize;
bufferSize.X = width + 2;
bufferSize.Y = height + 1;
SetConsoleScreenBufferSize(hConsole, bufferSize);
SMALL_RECT windowSize;
windowSize.Left = 0;
windowSize.Top = 0;
windowSize.Right = width;
windowSize.Bottom = height;
SetConsoleWindowInfo(hConsole, TRUE, &windowSize);
}
// 设置文本颜色
void setTextColor(WORD color) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, color);
}
// 设置光标显隐
void setCursorVisibility(bool visible) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursorInfo;
GetConsoleCursorInfo(hConsole, &cursorInfo);
cursorInfo.bVisible = visible; // 设置光标是否可见
SetConsoleCursorInfo(hConsole, &cursorInfo);
}
// 关闭控制台
void closeConsole() {
HWND hConsole = GetConsoleWindow();
if (hConsole != NULL) {
PostMessage(hConsole, WM_CLOSE, 0, 0); // 发送关闭消息
}
}
// 获取随机数
int getRandom(int min, int max) {
random_device rd;
mt19937 gen(rd());
uniform_int_distribution<> dis(min, max); // 定义均匀分布 [min, max]
return dis(gen); // 返回生成的随机数
}
自定义控制台代码解析
自定义控制台代码包含了一些 Windows 控制台操作的函数和一个用于生成随机数的函数。下面是每个函数的详细解析。
setCursorPosition(int x, int y)
//设置光标位置
void setCursorPosition(int x, int y) {
// 获取当前的标准输出句柄
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// 设置光标位置的坐标
COORD cursorPosition;
cursorPosition.X = x; // 横坐标(列)
cursorPosition.Y = y; // 纵坐标(行)
// 调用 Windows API 函数设置光标位置
SetConsoleCursorPosition(hConsole, cursorPosition);
}
功能:设置控制台光标的位置。
参数:
x
:光标的横坐标(列)。y
:光标的纵坐标(行)。
实现步骤:
- 获取标准输出的句柄
hConsole
,通过GetStdHandle(STD_OUTPUT_HANDLE)
。 - 设置光标的位置
COORD cursorPosition
,将x
和y
分别赋值给cursorPosition.X
和cursorPosition.Y
。 - 使用
SetConsoleCursorPosition(hConsole, cursorPosition)
调用 Windows API 函数来设置光标的实际位置。
- 获取标准输出的句柄
setConsoleSize(int width, int height)
//设置控制台大小
void setConsoleSize(int width, int height) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// 设置控制台屏幕缓冲区大小
COORD bufferSize;
bufferSize.X = width+2;
bufferSize.Y = height+1;
SetConsoleScreenBufferSize(hConsole, bufferSize);
// 设置控制台窗口大小
SMALL_RECT windowSize;
windowSize.Left = 0;
windowSize.Top = 0;
windowSize.Right = width;
windowSize.Bottom = height;
SetConsoleWindowInfo(hConsole, TRUE, &windowSize);
}
功能:设置控制台的大小(包括缓冲区大小和窗口大小)。
参数:
width
:控制台窗口的宽度。height
:控制台窗口的高度。
实现步骤:
- 获取标准输出的句柄
hConsole
。 - 设置控制台的屏幕缓冲区大小,使用
COORD
结构体来设置bufferSize.X
和bufferSize.Y
,X
是宽度,Y
是高度。这里将宽度加 2,高度加 1,以确保能显示所有内容。 - 设置控制台窗口的大小,通过
SMALL_RECT windowSize
结构体来定义窗口的边界,Left
,Top
,Right
, 和Bottom
分别设置窗口的四个边界。 - 调用
SetConsoleScreenBufferSize
和SetConsoleWindowInfo
来分别设置屏幕缓冲区大小和窗口显示区域。
- 获取标准输出的句柄
setTextColor(WORD color)
//设置文本颜色
void setTextColor(WORD color) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, color);
}
功能:设置控制台文本的颜色。
参数:
color
:指定文本颜色的颜色代码。
实现步骤:
- 获取标准输出的句柄
hConsole
。 - 使用
SetConsoleTextAttribute
设置文本颜色为color
。
- 获取标准输出的句柄
setCursorVisibility(bool visible)
//设置光标显隐
void setCursorVisibility(bool visible) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursorInfo;
// 获取当前光标信息
GetConsoleCursorInfo(hConsole, &cursorInfo);
cursorInfo.bVisible = visible; // 设置光标是否可见
SetConsoleCursorInfo(hConsole, &cursorInfo);
}
功能:设置控制台光标的可见性。
参数:
visible
:布尔值,true
表示显示光标,false
表示隐藏光标。
实现步骤:
- 获取标准输出的句柄
hConsole
。 - 使用
GetConsoleCursorInfo
获取当前光标的信息。 - 设置光标的可见性
bVisible
,通过SetConsoleCursorInfo
将新的光标信息应用到控制台。
- 获取标准输出的句柄
closeConsole()
//关闭控制台
void closeConsole() {
HWND hConsole = GetConsoleWindow(); // 获取控制台窗口句柄
if (hConsole != NULL) {
PostMessage(hConsole, WM_CLOSE, 0, 0); // 发送关闭消息
}
}
功能:关闭控制台窗口。
- 实现步骤:
- 获取控制台窗口的句柄
hConsole
,使用GetConsoleWindow
。 - 如果窗口句柄不为空,使用
PostMessage
发送关闭消息WM_CLOSE
,从而关闭控制台窗口。
- 获取控制台窗口的句柄
getRandom(int min, int max)
int getRandom(int min, int max)
{
// 创建随机数生成器
random_device rd; // 获得随机数种子
mt19937 gen(rd()); // 使用 Mersenne Twister 生成器
uniform_int_distribution<> dis(min, max); // 定义均匀分布 [0, 99]
// 生成一个随机数
int randomNumber = dis(gen);
return randomNumber;
}
功能:生成一个指定范围内的随机整数。
参数:
min
:生成的随机数的最小值。max
:生成的随机数的最大值。
实现步骤:
- 使用
random_device rd
获取一个随机数种子。 - 使用 Mersenne Twister 算法(
mt19937
)生成随机数。 - 定义一个均匀分布
uniform_int_distribution<> dis(min, max)
,生成指定范围内的随机数。 - 返回生成的随机数。
- 使用
对控制台进行操作
- 清空控制台
system("cls");
cout << "清空后的打印" << endl;
- 设置控制台大小
setConsoleSize(50, 30);
- 设置光标位置
控制台左上角为原点 0, 0
,右侧是 X
轴正方向,下方是 Y
轴正方向。它是一个平面二维坐标系。
setCursorPosition(5, 1);
注意:边界问题,横纵距离单位不同,视觉上的1y = 2x。
- 设置文字颜色
setTextColor(4); // 红色
cout << "红色" << endl;
setTextColor(2); // 绿色
cout << "绿色" << endl;
setTextColor(1); // 蓝色
cout << "蓝色" << endl;
setTextColor(4 | 2); // 红色 + 绿色 = 黄色
cout << "黄色" << endl;
- 设置光标显隐
setCursorVisibility(true); // 显示光标
- 关闭控制台
closeConsole();
1.2 知识点代码
必备知识点1_控制台相关方法.cpp
#include <iostream>
#include <conio.h>
#include "CustomConsole.h"
using namespace std;
int main()
{
std::cout << "控制台相关方法\n";
cout << "控制台相关方法\n";
#pragma region 知识点一 修改控制台为Windows控制主机的窗口
//操作系统不同,VS2022使用的控制台窗口类型也不同
//我们需要保证我们的控制台窗口为 "Windows控制台主机" 窗口
#pragma endregion
#pragma region 知识点二 输入输出
#pragma region 输入输出知识回顾
cout << "任意信息\n";
cout << "任意信息" << endl;
string str;
cin >> str;
cout << str << endl;
#pragma endregion
#pragma region 不显示输入内容在控制台上,直接获取单键输入信息
//引用一个系统写好的程序文件
//#include <conio.h>
//其中有一个写好的方法
// _getch()
// 可以通过它获取到输入的字符,并且无需按回车键,输入内容也不会显示在控制台上
//需要注意的是:
//1.对于字母、数字、符号,可以通过它返回的内容直接获取
//存储的是你输入内容的askii码
int c = _getch();
switch (c)
{
case 'W':
case 'w':
cout << "输入了一个w" << endl;
break;
case 'S':
case 's':
cout << "输入了一个s" << endl;
break;
default:
break;
}
//2.对于特殊键位(比如方向键、功能键F1~F12等),需要调用两次_getch()方法
// 第一次得到的是特殊值0或224,代表是一个特殊键
// 特殊键编码:
// 上箭头 = 224、72
// 下箭头 = 224、80
// 左箭头 = 224、75
// 右箭头 = 224、77
// F1 = 0、59
// F2 = 0、60
// F3 = 0、61
// 第二次得到的是特殊键的具体编码
//while (true)
//{
// int c = _getch();
// if (c == 0 || c == 224)
// {
// //得到才是真正的特殊案件相关的值
// c = _getch();
// switch (c)
// {
// case 72:
// cout << "上箭头输入" << endl;
// break;
// case 80:
// cout << "下箭头输入" << endl;
// break;
// case 75:
// cout << "左箭头输入" << endl;
// break;
// case 77:
// cout << "右箭头输入" << endl;
// break;
// default:
// break;
// }
// }
// else
// {
// cout << (char)c << endl;
// }
//}
#pragma endregion
#pragma endregion
#pragma region 知识点三 导入写好的自定义控制台
//导入韬老狮写好的代码CustomConsole.cpp和CustomConsole.h
//并复制到项目中,在项目中选择添加现有项
//使用前 需要引用导入的头文件 #include "CustomConsole.h"
#pragma endregion
#pragma region 知识点四 对控制台进行操作
//1.清空控制台
// system("cls");
system("cls");
cout << "清空后的打印" << endl;
//2.设置控制台大小
setConsoleSize(50, 30);
//3.设置光标位置
//控制台左上角为原点0 0 右侧是X轴正方向 下方是Y轴正方向 它是一个平面二维坐标系
setCursorPosition(5, 1);
//注意:
//1.边界问题
//2.横纵距离单位不同 1y = 2x 视觉上的
//4.设置文字颜色
// 红色:FOREGROUND_RED = 4
// 绿色:FOREGROUND_GREEN = 2
// 蓝色:FOREGROUND_BLUE = 1
// 可以位或计算进行颜色混合 RGB色混合
// 颜色设置后 之后打印的信息才会变色 之前的不会受到影响
setTextColor(4);
cout << "红色" << endl;
setTextColor(2);
cout << "绿色" << endl;
setTextColor(1);
cout << "蓝色" << endl;
setTextColor(4 | 2);
cout << "黄色" << endl;
//5.设置光标显隐
setCursorVisibility(true);
//6.关闭控制台
//closeConsole();
#pragma endregion
}
CustomConsole.cpp
#include "CustomConsole.h"
//设置光标位置
void setCursorPosition(int x, int y) {
// 获取当前的标准输出句柄
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// 设置光标位置的坐标
COORD cursorPosition;
cursorPosition.X = x; // 横坐标(列)
cursorPosition.Y = y; // 纵坐标(行)
// 调用 Windows API 函数设置光标位置
SetConsoleCursorPosition(hConsole, cursorPosition);
}
//设置控制台大小
void setConsoleSize(int width, int height) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
// 设置控制台屏幕缓冲区大小
COORD bufferSize;
bufferSize.X = width+2;
bufferSize.Y = height+1;
SetConsoleScreenBufferSize(hConsole, bufferSize);
// 设置控制台窗口大小
SMALL_RECT windowSize;
windowSize.Left = 0;
windowSize.Top = 0;
windowSize.Right = width;
windowSize.Bottom = height;
SetConsoleWindowInfo(hConsole, TRUE, &windowSize);
}
//设置文本颜色
void setTextColor(WORD color) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, color);
}
//设置光标显隐
void setCursorVisibility(bool visible) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursorInfo;
// 获取当前光标信息
GetConsoleCursorInfo(hConsole, &cursorInfo);
cursorInfo.bVisible = visible; // 设置光标是否可见
SetConsoleCursorInfo(hConsole, &cursorInfo);
}
//关闭控制台
void closeConsole() {
HWND hConsole = GetConsoleWindow(); // 获取控制台窗口句柄
if (hConsole != NULL) {
PostMessage(hConsole, WM_CLOSE, 0, 0); // 发送关闭消息
}
}
int getRandom(int min, int max)
{
// 创建随机数生成器
random_device rd; // 获得随机数种子
mt19937 gen(rd()); // 使用 Mersenne Twister 生成器
uniform_int_distribution<> dis(min, max); // 定义均匀分布 [0, 99]
// 生成一个随机数
int randomNumber = dis(gen);
return randomNumber;
}
1.3 练习题
通过W,A,S,D键在控制台中控制一个黄色方块上下左右移动
注意:边界问题
知识点:while,switch,输入输出等等
#include "CustomConsole.h"
// 设置窗口大小,光标隐藏,颜色 设置了窗口大小才能够知道边界是多少
int w = 50;
int h = 30;
setConsoleSize(w, h);
setCursorVisibility(false);
setTextColor(4 | 2);
// 定义光标位置的两个变量 清空控制台
int x = 0;
int y = 0;
system("cls");
// 定义死循环
while (true)
{
// 第一种擦除方式 绘制之前擦除之前的内容
// system("cls");
// 设置绘制位置 绘制内容
setCursorPosition(x, y);
cout << "■";
// 卡住 等待输入
int c = _getch();
// 第二种擦除方式
// 输入过后 意味着马上要移动了
// 移动之前 把老的位置的内容擦掉
setCursorPosition(x, y);
cout << " ";
switch (c)
{
case 'W':
case 'w':
y -= 1;
// 边界判断 如果超出边界范围 强行拉回来
if (y < 0)
y = 0;
break;
case 'A':
case 'a':
x -= 2;
if (x < 0)
x = 0;
break;
case 'S':
case 's':
y += 1;
// 下方边界由什么决定
if (y > h)
y = h;
break;
case 'D':
case 'd':
x += 2;
if (x > w - 2)
x = w - 2;
break;
default:
break;
}
}
1.4 练习题代码
必备知识点1_练习题.cpp
#include <iostream>
#include <conio.h>
#include "CustomConsole.h"
using namespace std;
int main()
{
std::cout << "控制台相关方法练习题\n";
//设置窗口大小,光标隐藏,颜色 设置了窗口大小才能够知道边界是多少
int w = 50;
int h = 30;
setConsoleSize(w, h);
setCursorVisibility(false);
setTextColor(4 | 2);
//定义光标位置的两个变量 清空控制台
int x = 0;
int y = 0;
system("cls");
//定义死循环
while (true)
{
//第一种擦除方式 绘制之前擦除之前的内容
//system("cls");
//设置绘制位置 绘制内容
setCursorPosition(x, y);
cout << "■";
//卡住 等待输入
int c = _getch();
//第二种擦除方式
//输入过后 意味着马上要移动了
//移动之前 把老的位置的内容擦掉
setCursorPosition(x, y);
cout << " ";
switch (c)
{
case 'W':
case 'w':
y -= 1;
//边界判断 如果超出边界范围 强行拉回来
if (y < 0)
y = 0;
break;
case 'A':
case 'a':
x -= 2;
if (x < 0)
x = 0;
break;
case 'S':
case 's':
y += 1;
//下方边界由什么决定
if (y > h)
y = h;
break;
case 'D':
case 'd':
x += 2;
if (x > w - 2)
x = w - 2;
break;
default:
break;
}
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com