Mewarnai teks di konsol dengan C ++


99

Bagaimana saya bisa menulis teks berwarna ke konsol dengan C ++? Artinya, bagaimana saya bisa menulis teks berbeda dengan warna berbeda?


Apakah tetapi tidak ada sumber daya untuk menemukan warna yang berbeda di konsol C ++ :)
Sudantha

2
Apa itu konsol C ++ ??
Edward Strange


Berhati-hatilah dengan jawaban ini. Konsol Anda akan memiliki perubahan setelah program keluar jika Anda tidak mengembalikannya sendiri.
kayleeFrye_onDeck

Jawaban:


123

Tambahkan sedikit Warna ke Teks Konsol Anda

  HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  // you can loop k higher to see more color choices
  for(int k = 1; k < 255; k++)
  {
    // pick the colorattribute k you want
    SetConsoleTextAttribute(hConsole, k);
    cout << k << " I want to be nice today!" << endl;
  }

teks alt

Atribut Karakter Berikut adalah bagaimana nilai "k" diinterpretasikan.


42
Perhatikan bahwa ini hanya untuk Windows.
DarkDust

2
Bagaimana jika saya ingin menambahkan beberapa warna dalam satu baris ?.
Fadwa

3
@ Misaki Saya belum menguji tetapi dapatkah Anda mencoba menghapus bit 'endl'?
Kemilau

3
Perpustakaan apa yang perlu saya sertakan untuk mengetahui kelas HANDLE?
STF

2
@STF cukup gunakan <windows.h>
Sheen

36

Kode warna pelolosan ANSI:

Name            FG  BG
Black           30  40
Red             31  41
Green           32  42
Yellow          33  43
Blue            34  44
Magenta         35  45
Cyan            36  46
White           37  47
Bright Black    90  100
Bright Red      91  101
Bright Green    92  102
Bright Yellow   93  103
Bright Blue     94  104
Bright Magenta  95  105
Bright Cyan     96  106
Bright White    97  107

Kode contoh untuk C / C ++:

#include <iostream>
#include <string>

int main(int argc, char ** argv){
    
    printf("\n");
    printf("\x1B[31mTexting\033[0m\t\t");
    printf("\x1B[32mTexting\033[0m\t\t");
    printf("\x1B[33mTexting\033[0m\t\t");
    printf("\x1B[34mTexting\033[0m\t\t");
    printf("\x1B[35mTexting\033[0m\n");
    
    printf("\x1B[36mTexting\033[0m\t\t");
    printf("\x1B[36mTexting\033[0m\t\t");
    printf("\x1B[36mTexting\033[0m\t\t");
    printf("\x1B[37mTexting\033[0m\t\t");
    printf("\x1B[93mTexting\033[0m\n");
    
    printf("\033[3;42;30mTexting\033[0m\t\t");
    printf("\033[3;43;30mTexting\033[0m\t\t");
    printf("\033[3;44;30mTexting\033[0m\t\t");
    printf("\033[3;104;30mTexting\033[0m\t\t");
    printf("\033[3;100;30mTexting\033[0m\n");

    printf("\033[3;47;35mTexting\033[0m\t\t");
    printf("\033[2;47;35mTexting\033[0m\t\t");
    printf("\033[1;47;35mTexting\033[0m\t\t");
    printf("\t\t");
    printf("\n");

    return 0;
}

GCC:

g++ cpp_interactive_terminal.cpp -o cpp_interactive_terminal.cgi
chmod +x cpp_interactive_terminal.cgi
./cpp_interactive_terminal.cgi

3
@Mehdi Mohammadpour Saya memiliki Windows 10, dan kode melarikan diri Anda sedang bekerja untuk saya, tapi tampaknya bagi saya bahwa Anda punya Foreground dan kode Background terbalik. Bisakah Anda membalikkan judul 'FG' dan 'BG'?
yamex5

Saya harus setuju dengan @ yamex5
smoothware

Hai yamex5 & smoothware, Terima kasih, OK
Mehdi Mohammadpour

23

Standar C ++ tidak memiliki pengertian tentang 'warna'. Jadi apa yang Anda tanyakan tergantung pada sistem operasi.

Untuk Windows, Anda dapat memeriksa fungsi SetConsoleTextAttribute .

Di * nix, Anda harus menggunakan urutan escape ANSI .


3
Perhatikan bahwa urutan ASNI (atau setidaknya beberapa di antaranya) berfungsi pada CMD.EXE Windows juga.
Mendanai Gugatan Monica

3
@Asu, mereka tidak melakukannya sebelum Edisi Peringatan Win10. Jika Win10 Anda up-to-date, Anda memilikinya.
kayleeFrye_onDeck

7

Anda dapat menulis metode dan memanggil seperti ini


HANDLE  hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
int col=12;

// color your text in Windows console mode
// colors are 0=black 1=blue 2=green and so on to 15=white  
// colorattribute = foreground + background * 16
// to get red text on yellow use 4 + 14*16 = 228
// light red on yellow would be 12 + 14*16 = 236

FlushConsoleInputBuffer(hConsole);
SetConsoleTextAttribute(hConsole, col);

cout << "Color Text";

SetConsoleTextAttribute(hConsole, 15); //set back to black background and white text

2
Perhatikan bahwa SetConsoleTextAttribute(hConsole, 15);mengatur warna ke Putih Cerah , bukan Putih . 7 - Putih. dan 15 - Putih Cerah
GooDeeJaY

5

Di Windows 10 Anda dapat menggunakan urutan escape dengan cara ini:

#ifdef _WIN32
SetConsoleMode(GetStdHandle(STD_OUTPUT_HANDLE), ENABLE_VIRTUAL_TERMINAL_PROCESSING);
#endif
// print in red and restore colors default
std::cout << "\033[32m" << "Error!" << "\033[0m" << std::endl;

4

Dengan asumsi Anda berbicara tentang jendela konsol Windows, cari fungsi konsol di dokumentasi Perpustakaan MSDN.

Jika tidak, atau lebih umum, itu tergantung pada konsol. Warna tidak didukung oleh pustaka C ++. Tapi perpustakaan untuk penanganan konsol mungkin / akan mendukung warna. Misalnya google "warna ncurses".

Untuk terminal serial dan emulator terminal yang terhubung, Anda dapat mengontrol berbagai hal dengan mengeluarkan "urutan escape". Ini biasanya dimulai dengan ASCII 27 (karakter escape di ASCII). Ada standar ANSI dan banyak skema khusus.


Sejak jawaban itu ditulis, Windows 10 memperoleh dukungan untuk urutan escape ANSI untuk aliran konsol sempit.
Cheers and hth. - Alf

2

Saya tidak yakin apa yang sebenarnya ingin Anda lakukan, tetapi tebakan saya adalah Anda ingin program C ++ Anda menampilkan teks berwarna di konsol, bukan? Tidak tahu tentang Windows, tetapi pada semua Unix (termasuk Mac OS X), Anda cukup menggunakan urutan escape ANSI untuk itu.


2

Di Windows, Anda dapat menggunakan kombinasi warna merah hijau dan biru di latar depan (teks) dan latar belakang.

/* you can use these constants
FOREGROUND_BLUE
FOREGROUND_GREEN
FOREGROUND_RED
FOREGROUND_INTENSITY
BACKGROUND_BLUE
BACKGROUND_GREEN
BACKGROUND_RED
BACKGROUND_INTENSITY
*/

HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
std::cout << "I'm cyan! Who are you?" << std::endl;

Sumber: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682088(v=vs.85).aspx#_win32_character_attributes


2

Cara paling sederhana yang dapat Anda lakukan adalah:

#include <stdlib.h>

system("Color F3");

Dimana "F" adalah kode untuk warna latar dan 3 adalah kode untuk warna teks.

Berantakan dengannya untuk melihat kombinasi warna lain:

system("Color 1A");
std::cout << "Hello, what is your name?" << std::endl;
system("Color 3B");
std::cout << "Hello, what is your name?" << std::endl;
system("Color 4c");
std::cout << "Hello, what is your name?" << std::endl;

Catatan: Saya hanya menguji di Windows. Bekerja. Seperti yang ditunjukkan, ini bukan lintas platform, ini tidak akan berfungsi pada sistem Linux.


4
Ini pendekatan yang buruk! Kode tidak lintas platform, itu tidak akan berfungsi di sistem Linux
GooDeeJaY

1

Anda tidak perlu menggunakan perpustakaan apa pun. Hanya sistem tulis saja ("color 4f");


4
Ini hanya untuk jendela, dan IIRC ini hanya akan membuat seluruh layar menjadi satu warna
nathanfranke

0

Jangan gunakan "sistem (" Warna… ")" jika Anda tidak ingin seluruh layar diisi dengan warna. Ini adalah skrip yang dibutuhkan untuk membuat teks berwarna:

#include <iostream>
#include <windows.h>

int main()
{
const WORD colors[] =
{
0x1A, 0x2B, 0x3C, 0x4D, 0x5E, 0x6F,
0xA1, 0xB2, 0xC3, 0xD4, 0xE5, 0xF6
};

HANDLE hstdin = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hstdout = GetStdHandle(STD_OUTPUT_HANDLE);
WORD   index = 0;


    SetConsoleTextAttribute(hstdout, colors[index]);
    std::cout << "Hello world" << std::endl;
FlushConsoleInputBuffer(hstdin);
return 0;
}

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.