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();//控制台保持,且不显示内容
}

初步获得一个游戏窗口。

相关推荐
qq_2430507912 分钟前
aflplusplus:开源的模糊测试工具!全参数详细教程!Kali Linux教程!(一)
linux·web安全·网络安全·黑客·渗透测试·模糊测试·kali linux
sunny-ll3 小时前
【C++】详解vector二维数组的全部操作(超细图例解析!!!)
c语言·开发语言·c++·算法·面试
成工小白3 小时前
【Linux】C语言模拟实现shell命令行(程序替换原理)
linux·运维·服务器
西装没钱买4 小时前
C语言多进程TCP服务器与客户端
服务器·c语言·tcp/ip·进程
嵌入式@秋刀鱼4 小时前
《第五章-心法进阶》 C++修炼生涯笔记(基础篇)指针与结构体⭐⭐⭐⭐⭐
c语言·开发语言·数据结构·c++·笔记·算法·visual studio code
whoarethenext5 小时前
使用 C/C++的OpenCV 裁剪 MP4 视频
c语言·c++·opencv
福理原乡大王5 小时前
Linux信号详解
linux·运维·服务器·c++·ubuntu·信号处理
ldq_sd5 小时前
centos 8.3(阿里云服务器)mariadb由系统自带版本(10.3)升级到10.6
服务器·阿里云·centos
hao_wujing5 小时前
轻量级顺序监控器监控 LLM 中的分解攻击
网络安全
tiandyoin6 小时前
如何给 C:\Windows\WinSxS\ 瘦身?
c语言·开发语言·windows