【问题标题】:How can I print underlined text in C/C++?如何在 C/C++ 中打印带下划线的文本?
【发布时间】:2019-05-26 11:36:42
【问题描述】:

我正在编写一个应用程序,并且想要打印带下划线的文本。我做错了什么?

我使用的是来自 C# 的“翻译”代码,通常它在 C# 中效果很好,但在 C++ 中却不行。修复错误后,代码根本不起作用。它显示了一些通常不会显示的字符。这就是它打印的内容 (https://i.imgur.com/V1X2uWk.png)

这是我使用的代码

auto DllHandler = GetStdHandle(-11);
unsigned int Mode;
GetConsoleMode(DllHandler,PDWORD(Mode));
Mode |= 4;
SetConsoleMode(DllHandler,DWORD(Mode));
cout << "\x1b[5mUnderlined \x1b[0mtext" << endl;

这是原始 (C#) 代码:

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern IntPtr GetStdHandle(int nStdHandle);
    [DllImport("kernel32.dll")]
    public static extern IntPtr GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);
    [DllImport("kernel32.dll")]
    public static extern IntPtr SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);
        var DllHandler = Kernel32.GetStdHandle(-11);
        uint Mode;
        GetConsoleMode(DllHandler,out Mode);
        Mode |= 4;
        SetConsoleMode(DllHandler, Mode);
        Console.Write("\x1b[5mUnderlined \x1b[0mText");

提前致谢。

【问题讨论】:

  • 这主要取决于您的终端字体设置以及如何控制这些设置。
  • Windows 控制台真的支持 ANSI 转义序列吗?它在 C# 中工作似乎很奇怪。我想Console 对象可能会将这些解释为执行实际的 API 调用以更改控制台模式。
  • 使用\x1b[4m 代替\x1b[5mstackoverflow.com/questions/5237666/…
  • @Ruslan - 是的,真的支持。不要检查哪个版本,但支持ENABLE_VIRTUAL_TERMINAL_PROCESSING - 寻找Console Virtual Terminal Sequences
  • 用于文本格式使用 ESC [ m 代码和 4 Underline 添加下划线 - 所以需要使用\x1b[4m

标签: c++ winapi


【解决方案1】:

就像@RbMm 说的那样,使用ULONG 类型可以编译成功并达到预期的效果。

但是真正造成错误的原因是指针传输的错误。 如果要使用unsigned int,首先要申请指针并为指针分配内存,然后在GetConsoleMode中强制类型转换。

    auto DllHandler = GetStdHandle(-11);
    unsigned int *Mode = new unsigned int;
    GetConsoleMode(DllHandler, PDWORD(Mode));
    *Mode = *Mode | 4;
    SetConsoleMode(DllHandler, DWORD(*Mode));
    cout << "\x1b[4mUnderlined \x1b[4mtext" << endl;

    delete Mode;

【讨论】:

    猜你喜欢
    • 2014-04-29
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    相关资源
    最近更新 更多