2012-03-30 28 views
10

Tôi cần có khả năng tạo một số văn bản trên thiết bị đầu cuối đáng chú ý hơn và những gì tôi nghĩ là làm cho văn bản được tô màu. Hoặc là văn bản thực tế hoặc không gian trong chữ cái hình chữ nhật của mỗi chữ cái (con trỏ suy nghĩ của vi). Chỉ hai thông số bổ sung mà tôi cho là quan trọng đối với đơn đăng ký của tôi là: chương trình phải độc lập với distro (chắc chắn mã sẽ chỉ được chạy dưới BASH) và không được xuất các ký tự thừa khi ghi vào tệp (hoặc từ mã thực tế, hoặc khi đường ống đầu ra)Sản lượng màu của chương trình chạy dưới BASH

Tôi đã tìm kiếm trên web để biết một số thông tin, nhưng tôi chỉ có thể tìm thông tin cho cstdlib không dùng nữa (stdlib.h), và tôi cần (thực sự, nó nhiều hơn một "muốn") để làm điều đó bằng cách sử dụng chức năng của iostream.

Trả lời

12

Hầu hết các thiết bị đầu cuối đều tuân thủ chuỗi màu ASCII. Chúng hoạt động bằng cách xuất ra ESC, theo sau là [, sau đó một danh sách giá trị màu được phân cách bằng dấu chấm phẩy, sau đó là m. Đây là các giá trị phổ biến:

Special 
0 Reset all attributes 
1 Bright 
2 Dim 
4 Underscore 
5 Blink 
7 Reverse 
8 Hidden 

Foreground colors 
30 Black 
31 Red 
32 Green 
33 Yellow 
34 Blue 
35 Magenta 
36 Cyan 
37 White 

Background colors 
40 Black 
41 Red 
42 Green 
43 Yellow 
44 Blue 
45 Magenta 
46 Cyan 
47 White 

Vì vậy, đầu ra "\033[31;47m" sẽ làm cho đầu màu (văn bản) màu đỏ và màu nền trắng.

Bạn có thể quấn nó độc đáo trong C++ dạng:

enum Color { 
    NONE = 0, 
    BLACK, RED, GREEN, 
    YELLOW, BLUE, MAGENTA, 
    CYAN, WHITE 
} 

std::string set_color(Color foreground = 0, Color background = 0) { 
    char num_s[3]; 
    std::string s = "\033["; 

    if (!foreground && ! background) s += "0"; // reset colors if no params 

    if (foreground) { 
     itoa(29 + foreground, num_s, 10); 
     s += num_s; 

     if (background) s += ";"; 
    } 

    if (background) { 
     itoa(39 + background, num_s, 10); 
     s += num_s; 
    } 

    return s + "m"; 
} 
+1

Đừng quên chấm dứt ' 'm'' của dãy, như' "\ 033] 31; 47m" '. –

+0

@JoachimPileborg: đã sửa. – orlp

4

Dưới đây là một phiên bản của mã ở trên từ @nightcracker, sử dụng stringstream thay vì itoa. (Điều này chạy bằng kêu vang ++, C++ 11, OS X 10.7, iTerm2, bash)

#include <iostream> 
#include <string> 
#include <sstream> 

enum Color 
{ 
    NONE = 0, 
    BLACK, RED, GREEN, 
    YELLOW, BLUE, MAGENTA, 
    CYAN, WHITE 
}; 

static std::string set_color(Color foreground = NONE, Color background = NONE) 
{ 
    std::stringstream s; 
    s << "\033["; 
    if (!foreground && ! background){ 
     s << "0"; // reset colors if no params 
    } 
    if (foreground) { 
     s << 29 + foreground; 
     if (background) s << ";"; 
    } 
    if (background) { 
     s << 39 + background; 
    } 
    s << "m"; 
    return s.str(); 
} 

int main(int agrc, char* argv[]) 
{ 
    std::cout << "These words should be colored [ " << 
     set_color(RED) << "red " << 
     set_color(GREEN) << "green " << 
     set_color(BLUE) << "blue" << 
     set_color() << " ]" << 
     std::endl; 
    return EXIT_SUCCESS; 
} 
Các vấn đề liên quan