Как нарисовать прямоугольник в консольном приложении?

Мне нужно нарисовать прямоугольник с числом внутри в консольном приложении С# и с использованием расширенного ASCII. Как мне это сделать?

Это для демо.


person user712923    schedule 15.05.2011    source источник
comment
возможный дубликат Console.Write() - отображать расширенные символы ascii?   -  person Josh Lee    schedule 15.05.2011
comment
C# не использует ASCII, расширенный или иной.   -  person David Heffernan    schedule 15.05.2011


Ответы (4)


Нравится это?

Это сработало для меня:

Console.OutputEncoding = Encoding.GetEncoding(866);
Console.WriteLine("┌─┐");
Console.WriteLine("│1│");
Console.WriteLine("└─┘");

[ИЗМЕНИТЬ]

Ответ на подвопрос в комментарии:

Console.OutputEncoding = Encoding.GetEncoding(866);
Console.WriteLine("  ┌─┐");
Console.WriteLine("  │1│");
Console.WriteLine("┌─┼─┘");
Console.WriteLine("│1│");
Console.WriteLine("└─┘");
person Alex Aza    schedule 15.05.2011
comment
@Alex, спасибо за ваш пример. Это определенно поможет. Поправьте, если я ошибаюсь, но то, что вы сделали, не использует ascii, не так ли? Также что делает Encoding.GetEncoding(866)? - person user712923; 15.05.2011
comment
@ Алекс, как ты нарисовал верхнюю часть прямоугольника? - person user712923; 15.05.2011
comment
@ user712923 - Удерживая клавишу Alt, введите 218 на цифровой клавиатуре. Это покажет ┌. Затем вы делаете то же самое с 196 и 191. Важно - вам нужно использовать цифровую клавиатуру (NumLock включен). - person Alex Aza; 15.05.2011
comment
@ Алекс, ты был очень и очень полезен. Могу я спросить тебя еще об одном. Извини. Я нарисовал прямоугольник, мне нужно нарисовать еще один прямоугольник в верхнем правом углу с числом внутри. Есть шанс помочь? спасибо - person user712923; 15.05.2011

Это метод расширения для String, который рисует окно консоли вокруг заданной строки. Многострочная поддержка включена.

i.e. string tmp = "some value"; Console.Write(tmp.DrawInConsoleBox());

        public static string DrawInConsoleBox(this string s)
        {
            string ulCorner = "╔";
            string llCorner = "╚";
            string urCorner = "╗";
            string lrCorner = "╝";
            string vertical = "║";
            string horizontal = "═";

            string[] lines = s.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);


            int longest = 0;
            foreach(string line in lines)
            {
                if (line.Length > longest)
                    longest = line.Length;
            }
            int width = longest + 2; // 1 space on each side


            string h = string.Empty;
            for (int i = 0; i < width; i++)
                h += horizontal;

            // box top
            StringBuilder sb = new StringBuilder();
            sb.AppendLine(ulCorner + h + urCorner);

            // box contents
            foreach (string line in lines)
            {
                double dblSpaces = (((double)width - (double)line.Length) / (double)2);
                int iSpaces = Convert.ToInt32(dblSpaces);

                if (dblSpaces > iSpaces) // not an even amount of chars
                {
                    iSpaces += 1; // round up to next whole number
                }

                string beginSpacing = "";
                string endSpacing = "";
                for (int i = 0; i < iSpaces; i++)
                {
                    beginSpacing += " ";

                    if (! (iSpaces > dblSpaces && i == iSpaces - 1)) // if there is an extra space somewhere, it should be in the beginning
                    {
                        endSpacing += " ";
                    }
                }
                // add the text line to the box
                sb.AppendLine(vertical + beginSpacing + line + endSpacing + vertical);
            }

            // box bottom
            sb.AppendLine(llCorner + h + lrCorner);

            // the finished box
            return sb.ToString();
        }
person Brian    schedule 16.03.2017

Вы можете использовать CsConsoleFormat† для рисования с помощью символов границ ASCII в консоли.

Рисование числа внутри прямоугольника с «двойными» линиями:

ConsoleRenderer.RenderDocument(
    new Document()
        .AddChildren(
            new Border {
                    Stroke = LineThickness.Wide,
                    Align = HorizontalAlignment.Left
                }
                .AddChildren(1337)
        )
);

Вы можете изменить Stroke = LineThickness.Wide строку, чтобы изменить стиль линий. LineThickness.Single будет создавать тонкие одиночные линии, new LineThickness(LineWidth.Single, LineWidth.Wide) будет создавать одинарные вертикальные и двойные горизонтальные линии.

Вот как это выглядит:

Вы также можете использовать класс ConsoleBuffer для явного рисования линий (имена аргументов добавлены для ясности):

using static System.ConsoleColor;

var buffer = new ConsoleBuffer(width: 6);
buffer.DrawHorizontalLine(x: 0, y: 0, width: 6, color: White);
buffer.DrawHorizontalLine(x: 0, y: 2, width: 6, color: White);
buffer.DrawVerticalLine(x: 0, y: 0, height: 3, color: White);
buffer.DrawVerticalLine(x: 5, y: 0, height: 3, color: White);
buffer.DrawString(x: 1, y: 1, color: White, text: "1337");
new ConsoleRenderTarget().Render(buffer);

† ​​CsConsoleFormat был разработан мной.

person Athari    schedule 01.03.2018

person    schedule
comment
Как вы его используете, если мне нужно нарисовать число внутри прямоугольника - person user712923; 15.05.2011
comment
Если вы рисуете рамку вокруг всей области консоли, уменьшите ширину и высоту на два (поскольку первый и последний символы в каждом измерении недоступны / недоступны, их занимают угловые символы). - person Agi Hammerthief; 07.03.2015
comment
Есть ли способ изменить это, чтобы вы могли рисовать два прямоугольника (один внутри другого)? Из-за отступа второй прямоугольник перезаписывает первый прямоугольник левой горизонтальной линией - person Mike; 29.03.2016
comment
Если вы хотите скопировать/вставить:╔ ═ ╗ ╚ ╝ - person Alex K.; 24.01.2019
comment
@ Алекс, ты забыл - person Herrgott; 11.05.2019