การระบายสีข้อความในคอนโซลด้วย C ++


99

ฉันจะเขียนข้อความสีลงในคอนโซลด้วย C ++ ได้อย่างไร นั่นคือฉันจะเขียนข้อความที่แตกต่างกันด้วยสีที่ต่างกันได้อย่างไร


ทำ แต่ไม่มีทรัพยากรในการค้นหาสีที่แตกต่างกันในคอนโซล C ++ :)
Sudantha

2
คอนโซล C ++ คืออะไร ??
Edward Strange

อาจซ้ำกันได้จาก: stackoverflow.com/questions/3585846/…
karlphillip

ระวังคำตอบเหล่านี้ คอนโซลของคุณจะมีการเปลี่ยนแปลงหลังจากโปรแกรมออกหากคุณไม่เปลี่ยนกลับเอง
kayleeFrye_onDeck

คำตอบ:


123

เพิ่มสีเล็กน้อยให้กับข้อความคอนโซลของคุณ

  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;
  }

ข้อความแสดงแทน

แอตทริบิวต์ของอักขระ นี่คือวิธีตีความค่า "k"


42
โปรดทราบว่านี่เป็น Windows เท่านั้น
DarkDust

2
จะเกิดอะไรขึ้นถ้าฉันต้องการเพิ่มหลายสีในบรรทัดเดียว?.
Fadwa

3
@ มิซากิฉันยังไม่ได้ทดสอบ แต่ลองลบบิต 'endl' ได้ไหม
Sheen

3
ฉันต้องรวมไลบรารีใดบ้างเพื่อให้รู้จักคลาส HANDLE
STF

2
@STF ใช้ <windows.h>
Sheen

36

ANSI Escape รหัสสี:

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

โค้ดตัวอย่างสำหรับ 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 ฉันมี Windows 10 และรหัสหลบหนีของคุณจะทำงานสำหรับฉัน แต่ปรากฏว่าผมว่าคุณได้มีเบื้องหน้าและรหัสพื้นหลังตรงกันข้าม คุณช่วยย้อนกลับหัวเรื่อง 'FG' และ 'BG' ได้ไหม?
yamex5

ฉันต้องเห็นด้วยกับ @ yamex5
smoothware

สวัสดี yamex5 & smoothware ขอบคุณตกลง
Mehdi Mohammadpour

23

C ++ มาตรฐานไม่มีแนวคิดเรื่อง 'สี' ดังนั้นสิ่งที่คุณถามขึ้นอยู่กับระบบปฏิบัติการ

สำหรับ Windows คุณสามารถตรวจสอบSetConsoleTextAttributeฟังก์ชัน

ใน * nix คุณต้องใช้ลำดับการหลีกเลี่ยงANSI


3
โปรดทราบว่าลำดับ ASNI (หรืออย่างน้อยก็บางส่วน) ทำงานบน CMD.EXE ของ Windows ได้เช่นกัน
คดีของ Fund Monica

3
@Asu พวกเขาไม่มาก่อน Win10 Anniversary Edition หาก Win10 us ของคุณทันสมัยคุณก็มีมัน
kayleeFrye_onDeck

7

คุณสามารถเขียนวิธีการและเรียกแบบนี้


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
โปรดทราบว่าSetConsoleTextAttribute(hConsole, 15);ชุดสีเพื่อสีขาวสว่างไม่ขาว 7 - สีขาว และ15 - Bright White
GooDeeJaY

5

ใน Windows 10 คุณสามารถใช้ Escape sequences ด้วยวิธีนี้:

#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

สมมติว่าคุณกำลังพูดถึงหน้าต่างคอนโซลของ Windows ให้ค้นหาฟังก์ชันคอนโซลในเอกสาร MSDN Library

มิฉะนั้นหรือโดยทั่วไปขึ้นอยู่กับคอนโซล ไลบรารี C ++ ไม่รองรับสี แต่ไลบรารีสำหรับการจัดการคอนโซลอาจ / จะรองรับสี เช่น Google "ncurses colors"

สำหรับเทอร์มินัลอนุกรมที่เชื่อมต่อและตัวเลียนแบบเทอร์มินัลคุณสามารถควบคุมสิ่งต่างๆได้โดยการส่งออก โดยทั่วไปสิ่งเหล่านี้เริ่มต้นด้วย ASCII 27 (อักขระหลีกใน ASCII) มีมาตรฐาน ANSI และรูปแบบที่กำหนดเองจำนวนมาก


ตั้งแต่เขียนคำตอบนั้น Windows 10 จึงได้รับการสนับสนุนลำดับการหลีกเลี่ยง ANSI สำหรับสตรีมคอนโซลแคบ
ไชโยและ hth - Alf

2

ฉันไม่แน่ใจว่าคุณต้องการทำอะไรจริงๆ แต่ฉันเดาว่าคุณต้องการให้โปรแกรม C ++ ของคุณแสดงข้อความสีในคอนโซลใช่ไหม? ไม่รู้เกี่ยวกับ Windows แต่ใน Unices ทั้งหมด (รวมถึง Mac OS X) คุณเพียงแค่ใช้ลำดับการหลีกเลี่ยง ANSIสำหรับสิ่งนั้น


2

ใน Windows คุณสามารถใช้สีเขียวแดงและน้ำเงินผสมกันบนพื้นหน้า (ข้อความ) และพื้นหลังได้

/* 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;

ที่มา: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682088(v=vs.85).aspx#_win32_character_attributes


2

วิธีที่ง่ายที่สุดที่คุณสามารถทำได้คือ:

#include <stdlib.h>

system("Color F3");

โดย "F" คือรหัสสำหรับสีพื้นหลังและ 3 คือรหัสสำหรับสีข้อความ

ยุ่งกับมันเพื่อดูการผสมสีอื่น ๆ :

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;

หมายเหตุ: ฉันทดสอบบน Windows เท่านั้น ผลงาน ดังที่ได้กล่าวไปแล้วนี่ไม่ใช่การข้ามแพลตฟอร์ม แต่จะไม่ทำงานบนระบบ Linux


4
นี่เป็นแนวทางที่ไม่ดี! โค้ดไม่ใช่ข้ามแพลตฟอร์มจะใช้ไม่ได้ในระบบ Linux
GooDeeJaY

1

คุณไม่จำเป็นต้องใช้ไลบรารีใด ๆ เพียงแค่เขียนระบบ ("สี 4f");


4
นี่เป็นหน้าต่างเท่านั้นและ IIRC จะทำให้ทั้งหน้าจอเป็นสีเดียว
nathanfranke

0

อย่าใช้ "ระบบ (" สี ... ")" หากคุณไม่ต้องการให้เต็มไปด้วยสีทั้งหน้าจอ นี่คือสคริปต์ที่จำเป็นในการสร้างข้อความสี:

#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;
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.