将文本装饰添加到控制台输出

时间:2011-03-08 20:04:57

标签: c# console ansi text-decorations

我有一个c#.net 3.5应用程序,它使用StreamWriter将文本写入控制台。有没有办法可以在打印到控制台的文本中添加下划线和删除线等文本装饰?可能使用ANSI转义序列?

TextWriter writer = new StreamWriter(Console.OpenStandardOutput());
writer.WriteLine("some underlined text");

谢谢, PaulH

5 个答案:

答案 0 :(得分:17)

<html>
<head>
    <title>Transition</title>
    <style type="text/css">
    .box {
        width:30%;
        height: 200px;
        margin: 10px;
        float:left;
    }
    #first {
        background-color: red;
    }
    #second {
        background-color: green;
    }
    #third {
        background-color: blue;
    }
    </style>
</head>
<body>
    <div class="container">
        <div id="first" class="box"></div>
        <div id="second" class="box"></div>
        <div id="third" class="box"></div>
    </div>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script type="text/javascript">
        $(function() {
            var containerWidth = $(".container").width();
            $(".box").click(function() {
                var id = $(this).attr("id");
                $("#"+id).animate({width: "100%"});
            });
        });
    </script>
</body>
</html>

Console with underlined text

答案 1 :(得分:6)

简短回答,不;控制台不允许在输出中使用带下划线的字符。

更长的答案:控制台使用的屏幕缓冲区只是一个字节数组。每个光标位置是一个字节或一个字符。要创建下划线,您需要重叠两个字符(这在控制台中是不可能的),或者您需要访问使用较高128个字符值的代码页作为低128的下划线或删除线版本(我不知道一个。)

如果您愿意为具有下划线的行“双倍行距”,则可以解决此问题。字符代码0x00AF(十进制175)是一个“文本艺术”字符,表示字符空间顶部的边框。如果您在文本下方的行中使用这些内容,则为presto,下划线。

答案 2 :(得分:6)

Windows控制台不支持ANSI转义序列。据我所知,改变输出字符属性的唯一方法是在写字符之前调用SetConsoleTextAttribute。或者,在.NET中,修改Console.ForegroundColorConsole.BackgroundColor属性。

可以使用类型转换将这些属性设置为自定义值(即未由ConsoleColor定义的值)。但我不知道你会有什么好处。

我不知道我曾经在Windows控制台上看到过删除文字,自从我看到下划线以来已经有好几年了。我想这是可能的,但我不知道它是如何完成的。

答案 3 :(得分:1)

很容易改变控制台的前景/背景颜色:http://www.dotnetperls.com/console-color但是AFAIK没有办法放置一些粗体文字,例如。但我并没有真正尝试实现这一目标,所以我不确定。

答案 4 :(得分:1)

我使用此代码。这是弗拉基米尔·列谢尼科夫(Vladimir Reshetnikov)答案的固定版本,使用正确的转义码进行重置。

    private static void WriteUnderline(string s)
    {
        var handle = GetStdHandle(STD_OUTPUT_HANDLE);
        uint mode;
        GetConsoleMode(handle, out mode);
        mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
        SetConsoleMode(handle, mode);
        Console.WriteLine($"\x1B[4m{s}\x1B[24m");
    }

这将在文本上加上下划线,并且具有不重置您设置的任何颜色的优点。