Консоль: не может заполнять нижнюю и правую области - PullRequest
1 голос
/ 10 июля 2020

Может ли кто-нибудь объяснить мне, почему при запуске этого кода есть область внизу и справа от консоли, я не могу ничего выбрать в этой области, код создает прямоугольник без углов, это изображение как это выглядит для меня:

console window image

EDIT: the area seems to only appear for me, it doesn't show on other's images even when I tried their code. Very weird.

EDIT 2: area highlighted in red:

выделена область окна консоли

class Program
{
    static void Main(string[] args)
    {
        int w = 50;
        int h = 10;

        Console.SetWindowSize(w, h);
        Console.SetBufferSize(w, h);

        Console.SetCursorPosition(0, 0);
        Console.Write(" " + new string('#', w-2));

        for(int i = 0; i < h - 2; i++)
        {
            Console.SetCursorPosition(0, i + 1);
            Console.Write("#" + new string(' ', w-2) + "#");
        }

        Console.SetCursorPosition(0, h-1);
        Console.Write(" " + new string('#', w - 2));
        Console.ReadKey();
    }
}

Ответы [ 2 ]

1 голос
/ 11 июля 2020

Вы можете сделать размер окна и размер буфера на 1 символ больше, чем ваша справочная область. Это позволяет записывать все символы, заполняющие область, не вызывая полос прокрутки.

Вы не указываете последний символ в позиции (w, h), иначе консоль будет прокручиваться. Затем используйте Console.MoveBufferArea () , чтобы скопировать символ в буфере в последнюю позицию. Этот метод просто использует буфер, он на самом деле не записывает в консоль, поэтому окно консоли не будет прокручиваться.

Замените символ, перемещенный функцией - на этот раз запись в консоль - и область заполнено полностью.

В случае, если Консоль показывает , не связанное с размером буфера диапазоны : если вы не сделали этого раньше, откройте Свойства консоли из в меню консоли и выберите Discard old duplicates в разделе Command History панели Options. Вы также можете сделать это, установив значение HKEY_CURRENT_USER\Console\HistoryNoDup на 1 в реестре. Я обычно делаю это при запуске консольного приложения и повторно устанавливаю предыдущее значение при его закрытии (вам просто нужно установить его один раз - он находится в ветке текущего пользователя, права администратора не требуются).

Консоль MoveBufferArea

static void Main(string[] args)
{
    DrawConsoleArea(50, 10, '#', false);
}

internal static void DrawConsoleArea(int width, int height, char chr, bool showCursor)
{
    Console.CursorVisible = showCursor;

    Console.SetWindowSize(width + 1, height + 1);
    Console.SetBufferSize(width + 1, height + 1);

    for (int i = 1; i < height; i++) {
        Console.SetCursorPosition(0, i);
        Console.Write(chr + new string(' ', width - 1) + chr);
    }

    Console.SetCursorPosition(0, 0);
    Console.Write(new string(chr, width + 1));
    Console.SetCursorPosition(0, height);
    Console.Write(new string(chr, width));

    Console.MoveBufferArea(0, 0, 1, 1, width, height);
    Console.SetCursorPosition(0, 0);
    Console.Write(chr);
}
0 голосов
/ 10 июля 2020

То, что вы видите курсор из Console.ReadKey();

Если бы вы могли увеличить высоту окна на 1 строку, а затем pu sh курсор внизу.

Console.SetWindowSize(w, h+1);
Console.SetBufferSize(w, h+1);

//...

Console.WriteLine(" " + new string('#', w - 2));

Console.Write("Press any key to exit.");
Console.ReadKey();

Или скрыть видимость курсора до false. Кроме того, вы можете захотеть выполнить ReadKey (true), иначе символ, нажатый на клавиатуре, будет записан в углу.

Однако не забудьте сделать его видимым позже, на случай, если он вам понадобится любое взаимодействие с пользователем.

Console.CursorVisible = false;
Console.ReadKey(true);

//...

Console.CursorVisible = true;

Редактировать с изображениями: с вашим кодом: With your code

With Console.CursorVisible = false; With Cursor Visible false

...