窗口设置函数: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;
}
当我们看这个函数时,我们可以将其分为几个步骤来理解它是如何设置控制台窗口的信息的:
- 设置控制台窗口标题:
SetConsoleTitleA(title);
这一行代码通过 SetConsoleTitle
A 函数设置控制台窗口的标题,即窗口的顶部文本。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
,用于指定控制台窗口的位置和大小。通过设置 sr
的 Bottom
、Top
、Right
和 Left
成员变量,我们确定了窗口的左上角和右下角的坐标位置,从而确定了窗口的大小。
SMALL_RECT
结构体用于定义一个矩形区域,其中包含了左上角和右下角的坐标位置。该结构体有四个成员变量:
Left:矩形区域的左上角 X 坐标。
Top:矩形区域的左上角 Y 坐标。
Right:矩形区域的右下角 X 坐标。
Bottom:矩形区域的右下角 Y 坐标。
通常情况下,左上角的坐标是 (0, 0),而右下角的坐标是 (Width-1, Height-1),其中 Width
和 Height
是窗口的宽度和高度。
举个例子,如果我们有一个控制台窗口的宽度为 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();//控制台保持,且不显示内容
}

初步获得一个游戏窗口。