閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

C++で標準出力

適当にググって見ると、色周りは以下のブログが分かりやすかったです。まぁ情報としては先日のと同じなんですが。

jafrog.com

この辺のコードとか定数で定義されていると楽なんだけどなぁ、と思ったけどそうもいかないか。

面白みはありませんが、とりあえず書いてみるとこんな感じですか。

#include <iostream>
#include <string>
#include <Windows.h>

constexpr const char* ESC = "\x1b";
constexpr const char* CSI = "\x1b[";

bool EnableVTMode()
{
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hOut == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    DWORD dwMode = 0;
    if (!GetConsoleMode(hOut, &dwMode))
    {
        return false;
    }

    dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    if (!SetConsoleMode(hOut, dwMode))
    {
        return false;
    }
    return true;
}

int main()
{
    if (!EnableVTMode()) {
        return -1;
    }
   
    for (auto i = 1; i < 7; ++i) {
        std::cout << CSI << std::to_string(30 + i) << "m"; // 文字の色を変更
        std::cout << "Hello World";
        
        Sleep(500);

        std::cout << "\r";          // カーソルを先頭に戻す
        std::cout << CSI << "K";    // 行末まで出力した文字列を削除
    }

    return 0;
}

f:id:wata_d:20201229200900g:plain

どうでもいいけれどC++CLIという単語を組み合わせるとCommon Language Infrastructureの方が出てきてしまって具合が悪いですね。