如何在C / C ++中打印带下划线的文本?

时间:2019-05-26 11:36:42

标签: c++ winapi

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

我正在使用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");

谢谢。

1 个答案:

答案 0 :(得分:0)

就像@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;