我试图根据控制台窗口的大小创建一个自定义大小的边框。问题在于,当绘制最后一行时,光标会跳至下一行,这又会将最上面的行移到屏幕外。
控制台的buffersize与用于删除滚动条的consolesize相同,这使之成为可能。
最右边的是完整的边框,因为它填满了整行,因此创建了一个额外的空间。左边的行恰好在执行最后一行之前,这没有任何问题(因为它没有绘制最后一行)。
我当前的代码是:
static void DrawFrame(string[,] frame)
{
string[] array = new string[frame.GetLength(1)];
string output;
for (int y = 0; y < frame.GetLength(1); y++)
{
output = "";
Console.SetCursorPosition(0, y);
for (int x = 0; x < frame.GetLength(0); x++)
{
output += frame[x, y];
}
array[y] = output;
Console.Write(output);
}
}
字符串变量框架的值为:
╔══════════════════════╗
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
║ ║
╚══════════════════════╝
预期的行为是在执行最后一行时不创建额外的行,到目前为止,我还没有找到任何解决方案。
感谢您的帮助!
PS: Console.CursorVisible = false;
不是解决方案。
PS2:创建边框的代码如下:
static string[,] SetBorder(string[,] frame)
{
for (int y = 0; y < frame.GetLength(1); y++)
{
for (int x = 0; x < frame.GetLength(0); x++)
{
if (y == 0)
{
if (x == 0)
{
frame[x, y] = "╔";
}
else if(x == frame.GetLength(0) - 1)
{
frame[x, y] = "╗";
}
else
{
frame[x, y] = "═";
}
}
else if (y == frame.GetLength(1) - 1)
{
if (x == 0)
{
frame[x, y] = "╚";
}
else if (x == frame.GetLength(0) - 1)
{
frame[x, y] = "╝";
}
else
{
frame[x, y] = "═";
}
}
else
{
if (x == 0 || x == frame.GetLength(0) - 1)
{
frame[x, y] = "║";
}
else
{
frame[x, y] = " ";
}
}
}
}
return frame;
}
控制台尺寸在开始时也定义为框架尺寸的尺寸。
编辑1::对于那些尝试调试我的代码的人,我将其链接为here。
答案 0 :(得分:1)
您可以在代码末尾使用Console.SetCursorPosition
:
Console.SetCursorPosition(0, 0);
请记住,因为您说缓冲区的大小等于控制台的大小。如果在设置缓冲区大小之前使用SetCursorPosition
,仍然可以完成此操作。
我以这种方式使用它并起作用:
DrawFrame(SetBorder(new string[Console.WindowWidth, Console.WindowHeight]));
Console.SetCursorPosition(0, 0);
Console.SetBufferSize(Console.WindowWidth, Console.WindowHeight);
Console.ReadKey();
输出:
更新:
我假定您正在Windows 10上运行代码。为什么?当我第一次在这里发布答案时,我正在工作,并且在Windows 7机器上运行代码,它给出了我在几个小时前发布的输出。
现在,我在家中,在一台Windows 10机器上,并检查了您告诉我的怪异场景,我测试了我在这里工作的相同代码,然后猜测是什么,我也遇到了与您所说的相同的故障关于。
要解决此问题,我将SetBufferSize
函数更改为:
Console.SetBufferSize(Console.WindowWidth, Console.WindowHeight+1);
我将+1
添加到了高度。是的,它确实有效。但是,它保持滚动条显示。我将更深入地研究为什么Win7和Win10之间存在差异,以及如何在不显示滚动条的情况下进行修复。
根据this long explanation,Windows 7和Windows 10之间的控制台发生了很多变化。我不是那个专家,但是我可以肯定地说,所有这些变化都直接影响了我们之间的差异。在Win7和Win10上运行的代码的输出。