Мне нужно нарисовать прямоугольник с числом внутри в консольном приложении С# и с использованием расширенного ASCII. Как мне это сделать?
Это для демо.
Мне нужно нарисовать прямоугольник с числом внутри в консольном приложении С# и с использованием расширенного ASCII. Как мне это сделать?
Это для демо.
Нравится это?
Это сработало для меня:
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("└─┘");
Это метод расширения для 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();
}
Вы можете использовать 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 Alex K.; 24.01.2019
║
- person Herrgott; 11.05.2019