2012-03-01 41 views
11

Tôi đang cố gắng đặt màu phông chữ của ứng dụng bảng điều khiển win32 thành giá trị RGB cụ thể như 50, 75, 90 tương ứng. Tôi đã thử SetConsoleTextAttribute(), nhưng rất tiếc, dường như có giới hạn 0 hoặc 255 cho R, G hoặc B.Bàn điều khiển RGB cụ thể Màu văn bản C++

Điều này là có thể, vì trong cửa sổ thuộc tính nhắc lệnh, bạn có thể đặt màu cụ thể, như vậy

http://www.yourgamercard.net/screen/i/4a8c57.png

tôi đã tìm kiếm khá nhiều nhưng có vẻ như câu trả lời duy nhất là SetConsoleTextAttribute().

+0

Màu đỏ, xanh lục và xanh lam thực sự nằm trong khoảng từ 0 đến 255. Bất kỳ màu nào là sự kết hợp của 3 tám bit. Xem thêm - http://service.real.com/help/library/guides/realone/ProductionGuide/HTML/htmfiles/colors.htm –

+4

Thậm chí bạn có đọc câu hỏi của tôi không? –

+0

Tất nhiên. Nó là hoàn toàn không rõ ràng chính xác những gì là vấn đề của bạn. Bạn có bitmask, bạn có một chức năng - gọi nó và làm cho giao diện điều khiển của bạn đầy màu sắc. –

Trả lời

15

Bạn cần sử dụng SetConsoleScreenBufferInfoEx để đặt điều này, xem mục nhập ColorTable của cấu trúc CONSOLE_SCREEN_BUFFER_INFOEX.

Màu bảng điều khiển là một quy trình hai cấp: có thuộc tính bảng điều khiển, có bốn bit cho nền trước và nền (đỏ, lục, lam và cường độ), có vẻ như giới hạn màu sắc cho màu cơ bản và màu phụ . Nhưng các giá trị này được sử dụng làm chỉ mục cho bảng màu, để xác định giá trị hiển thị thực tế. Vì vậy, hãy suy nghĩ về các thuộc tính ký tự 'màu' bit như "hợp lý màu đỏ" vv thay vì màu đỏ vật lý. (Giá trị mà bản đồ thuộc tính nhân vật 'đỏ' thực sự là màu đỏ RGB, nhưng không nhất thiết phải là.) Vì vậy, bạn luôn bị giới hạn ở 16 màu được lập chỉ mục; nhưng bạn có thể đặt chúng cho bất kỳ 16 màu RGB đầy đủ nào bạn muốn thông qua ColorTable.

Dải ô vuông màu bạn nhìn thấy trong hộp thoại ở trên cơ bản là bảng màu và liệt kê các màu theo thứ tự Thuộc tính ký tự, dấu trang đầu tiên là 'đen hợp lý', v.v.

+0

Wow, lời giải thích tuyệt vời. Cám ơn vì cái này! Bạn đá. –

0

Có một cách để làm cho văn bản hoàn toàn RGB, nhưng nó yêu cầu 'SetPixel' nếu bạn tạo bản sao của văn bản, bạn có thể thay đổi giá trị RGB, đây là thứ tôi đã tạo cho A, khó làm, nhưng tôi đang tạo một tệp .h để mọi người có thể sử dụng nó, ở đây bạn đi:

void PrintA(int R, int G, int B) 
{ 
    HWND myconsole = GetConsoleWindow(); 
    HDC mydc = GetDC(myconsole); 
    SetPixel(mydc, i + 0, i2 + 3, RGB(R, G, B)); 
    SetPixel(mydc, i + 0, i2 + 4, RGB(R, G, B)); 
    SetPixel(mydc, i + 0, i2 + 5, RGB(R, G, B)); 
    SetPixel(mydc, i + 0, i2 + 6, RGB(R, G, B)); 
    SetPixel(mydc, i + 0, i2 + 7, RGB(R, G, B)); 
    SetPixel(mydc, i + 0, i2 + 8, RGB(R, G, B)); 
    SetPixel(mydc, i + 0, i2 + 9, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 2, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 3, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 4, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 5, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 6, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 7, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 8, RGB(R, G, B)); 
    SetPixel(mydc, i + 1, i2 + 9, RGB(R, G, B)); 
    SetPixel(mydc, i + 2, i2 + 1, RGB(R, G, B)); 
    SetPixel(mydc, i + 2, i2 + 2, RGB(R, G, B)); 
    SetPixel(mydc, i + 2, i2 + 6, RGB(R, G, B)); 
    SetPixel(mydc, i + 3, i2 + 1, RGB(R, G, B)); 
    SetPixel(mydc, i + 3, i2 + 2, RGB(R, G, B)); 
    SetPixel(mydc, i + 3, i2 + 6, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 2, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 3, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 4, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 5, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 6, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 7, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 8, RGB(R, G, B)); 
    SetPixel(mydc, i + 4, i2 + 9, RGB(R, G, B)); 
    SetPixel(mydc, i + 5, i2 + 3, RGB(R, G, B)); 
    SetPixel(mydc, i + 5, i2 + 4, RGB(R, G, B)); 
    SetPixel(mydc, i + 5, i2 + 5, RGB(R, G, B)); 
    SetPixel(mydc, i + 5, i2 + 6, RGB(R, G, B)); 
    SetPixel(mydc, i + 5, i2 + 7, RGB(R, G, B)); 
    SetPixel(mydc, i + 5, i2 + 8, RGB(R, G, B)); 
    SetPixel(mydc, i + 5, i2 + 9, RGB(R, G, B)); 
    i += 8; 

    if (i/80 == 8) 
    { 
     i = 0; 
     i2 += 12; 
    } 
} 
Các vấn đề liên quan