C-贪吃蛇小项目-窗口设置函数

窗口设置函数:SetWinodwInfo()
复制代码
bool SetWindowInfo(char * title, int Width, int Height) {
    SetConsoleTitleA(title);
    HANDLE handleStd = GetStdHandle(STD_OUTPUT_HANDLE);  //获取当前控制台的句柄
    SMALL_RECT sr;
    sr.Bottom = Height;
    sr.Right = Width;
    sr.Top = 0;
    sr.Left = 0;
    SetConsoleWindowInfo(handleStd,true, &sr);
​
    //设置控制台缓冲区
    COORD crd = { Width + 1,Height + 1};
    SetConsoleScreenBufferSize(handleStd, crd);
​
    //不显示光标
    CONSOLE_CURSOR_INFO cci;
    cci.dwSize = sizeof(CONSOLE_CURSOR_INFO);
    cci.bVisible = false;
​
    return true;
}

当我们看这个函数时,我们可以将其分为几个步骤来理解它是如何设置控制台窗口的信息的:

  1. 设置控制台窗口标题:
复制代码
SetConsoleTitleA(title);

这一行代码通过 SetConsoleTitleA 函数设置控制台窗口的标题,即窗口的顶部文本。title 参数是一个指向字符数组的指针,它包含了我们想要设置的窗口标题的内容。(SetConsoleTitle函数有两个不同的版本)

复制代码
SetConsoleTitleA:用于使用 ANSI 字符集(通常是单字节字符集)作为参数的版本。
SetConsoleTitleW:用于使用 Unicode 字符集作为参数的版本。

如果发现设置的窗口标题出现乱码,则需要更换一下函数。

2.获取标准输出设备的句柄:

复制代码
HANDLE hStd = GetStdHandle(STD_OUTPUT_HANDLE);

这一行代码通过 GetStdHandle 函数获取了标准输出设备的句柄,即控制台窗口的句柄。这个句柄将在后续的操作中被使用。

3.设置控制台窗口的位置和大小:

复制代码
SMALL_RECT sr;
sr.Bottom = Height;
sr.Top = 0;
sr.Right = Width;
sr.Left = 0;

这段代码定义了一个 SMALL_RECT 结构体 sr,用于指定控制台窗口的位置和大小。通过设置 srBottomTopRightLeft 成员变量,我们确定了窗口的左上角和右下角的坐标位置,从而确定了窗口的大小。

SMALL_RECT 结构体用于定义一个矩形区域,其中包含了左上角和右下角的坐标位置。该结构体有四个成员变量:

复制代码
Left:矩形区域的左上角 X 坐标。
Top:矩形区域的左上角 Y 坐标。
Right:矩形区域的右下角 X 坐标。
Bottom:矩形区域的右下角 Y 坐标。

通常情况下,左上角的坐标是 (0, 0),而右下角的坐标是 (Width-1, Height-1),其中 WidthHeight 是窗口的宽度和高度。

举个例子,如果我们有一个控制台窗口的宽度为 80 个字符,高度为 24 个字符,那么 SMALL_RECT 结构体的成员变量可以这样设置:

  • Left = 0:左上角的 X 坐标为 0。

  • Top = 0:左上角的 Y 坐标为 0。

  • Right = 79:右下角的 X 坐标为 79(80个字符宽度减去1)。

  • Bottom = 23:右下角的 Y 坐标为 23(24个字符高度减去1)。

这样,SMALL_RECT 结构体所定义的矩形区域就包含了整个控制台窗口的范围,左上角是 (0, 0),右下角是 (79, 23)。

4.应用控制台窗口的大小和位置设置:

复制代码
SetConsoleWindowInfo(hStd, true, &sr);

这行代码使用 SetConsoleWindowInfo 函数应用了我们刚刚设置的窗口大小和位置信息。它将控制台窗口的句柄、要设置的信息类型(在这里为 true,表示设置窗口信息)以及指向 sr 结构体的指针作为参数传递给了函数。

5.设置控制台缓冲区的大小:

复制代码
cppCopy codeCOORD crd = { Width + 1, Height + 1 };
SetConsoleScreenBufferSize(hStd, crd);

这一段代码定义了一个 COORD 结构体 crd,用于指定控制台缓冲区的大小。通过设置 crd 的成员变量,我们确定了缓冲区的宽度和高度。然后,我们使用 SetConsoleScreenBufferSize 函数将这个缓冲区大小应用到控制台窗口上。

控制台缓冲区是用来存储控制台输出的字符数据的内存区域。控制台窗口上显示的文本和图形实际上是从缓冲区中读取的。控制台缓冲区的大小对控制台的显示和交互有着重要的影响,具体来说,它的作用有以下几点:

复制代码
显示区域大小: 控制台缓冲区的大小决定了在控制台窗口中可以显示的字符数。如果缓冲区较小,那么即使窗口足够大,也无法显示超出缓冲区范围的文本内容。
​
滚动条: 当控制台窗口大小小于缓冲区大小时,会出现水平和垂直滚动条,允许用户在整个缓冲区范围内滚动浏览文本内容。
​
保留输出历史: 控制台缓冲区会保留之前输出的文本内容,即使控制台窗口无法显示所有的文本,用户也可以通过滚动条或者使用命令来查看之前的输出历史。
​
性能优化: 控制台缓冲区的大小可以影响控制台的性能。如果缓冲区足够大,那么系统就可以更高效地处理大量的输出,而不需要频繁地刷新控制台窗口。
​
图形绘制: 控制台缓冲区不仅用于存储文本字符,还可以用于绘制简单的图形,比如用 ASCII 字符画出的简单图形。较大的缓冲区可以提供更多的绘图空间。

总的来说,控制台缓冲区的大小对于控制台的显示、交互和性能都有着重要的影响,因此需要根据实际需求和系统性能来合理设置缓冲区的大小。

6.设置控制台光标的信息:

复制代码
CONSOLE_CURSOR_INFO cci;
cci.dwSize = sizeof(CONSOLE_CURSOR_INFO);
cci.bVisible = false;

这段代码定义了一个 CONSOLE_CURSOR_INFO 结构体 cci,用于指定控制台光标的信息。在这里,我们将光标的大小设置为 sizeof(CONSOLE_CURSOR_INFO),即默认大小,而光标的可见性设置为 false,即不可见。

7.返回设置成功的标志:

复制代码
return true;

最后,函数返回 true,表示设置窗口信息成功。

在main函数中进行函数调用进行窗口的基本设置

复制代码
int main() {
    SetWindowInfo("Gluttonous Snake",100,30);//设置窗口信息
    getchar();//控制台保持,且不显示内容
}

初步获得一个游戏窗口。

相关推荐
群联云防护小杜4 分钟前
云服务器主动防御策略与自动化防护(下)
运维·服务器·分布式·安全·自动化·音视频
Jtti4 分钟前
Jtti:nginx服务器如何限制访问频率
服务器·网络·nginx
视觉&物联智能40 分钟前
【杂谈】-人工智能驱动的网络安全威胁:新一代网络钓鱼
网络·人工智能·web安全·网络安全·安全威胁分析
struggle20251 小时前
LinuxAgent开源程序是一款智能运维助手,通过接入 DeepSeek API 实现对 Linux 终端的自然语言控制,帮助用户更高效地进行系统运维工作
linux·运维·服务器·人工智能·自动化·deepseek
只可远观1 小时前
Flutter 泛型 泛型方法 泛型类 泛型接口
服务器·windows·flutter
学习溢出2 小时前
【网络安全】网络钓鱼的类型
网络·安全·网络安全·网络钓鱼·社会工程
雨声不在3 小时前
debian切换用户
linux·服务器·debian
两点王爷3 小时前
springboot项目文件上传到服务器本机,返回访问地址
java·服务器·spring boot·文件上传
遇到我又惊又喜4 小时前
佛山大旺高新区3650 M5 ERP服务器维修案例
运维·服务器
柴郡猫^O^5 小时前
OSCP - Proving Grounds - Wpwn
安全·网络安全·安全性测试