C # - Как предотвратить переход курсора на следующую строку, когда текущая строка заполняется - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь создать рамку нестандартного размера в зависимости от размера окна консоли.Проблема в том, что когда он рисует последнюю строку, курсор перемещается вниз к следующей строке, что, в свою очередь, перемещает самую верхнюю строку за пределы экрана.

Размер буфера консоли такой же, как и размер консоли, чтобы удалить полосы прокрутки,что делает это возможным.

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;
    }

Размер консоли также определяется в начале как размер размеров фреймов.

Edit1: Для тех, кто пытается отладить мой код, я свяжу его здесь .

1 Ответ

0 голосов
/ 19 октября 2018

Вы можете использовать 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, и как ее исправить без видимой полосы прокрутки.

Согласно этому длинному объяснению 1036 *, очень многоизменился в консоли между Windows 7 и Windows 10. Я не такой эксперт, но я могу с уверенностью заключить, что все эти изменения напрямую влияют на разницу между выводом кода, работающего на Win7 и на Win10.

...