C#-如何防止光标在当前行填满时跳到下一行

时间:2018-10-19 12:49:28

标签: c# arrays .net console-application

我试图根据控制台窗口的大小创建一个自定义大小的边框。问题在于,当绘制最后一行时,光标会跳至下一行,这又会将最上面的行移到屏幕外。

控制台的buffersize与用于删除滚动条的consolesize相同,这使之成为可能。

Border so far without last row Complete border with last row, creating new row

最右边的是完整的边框,因为它填满了整行,因此创建了一个额外的空间。左边的行恰好在执行最后一行之前,这没有任何问题(因为它没有绘制最后一行)。

我当前的代码是:

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

1 个答案:

答案 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();

输出:

Console Windows Output

更新:

我假定您正在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上运行的代码的输出。