2012-02-14 2 views
2

좌표를 통해 출력 할 프로그램을 작성하려고합니다. 나는 windows.h include와 WriteConsoleOutputCharacter 함수를 사용하여 화면에 문자를 인쇄하지만 SetConsoleTextAttribute로 설정된 색상은 무시합니다. 모든 아이디어를 컬러로 출력하는 방법은 무엇입니까? 콘솔에 출력WriteConsoleOutputCharacter 및 SetConsoleTextAttribute 사용

코드 :

:

void Card::printFancy(COORD coord, bool top) const 
{ 
    paint(); 
    LPDWORD written(0); 
    for (int row(0); row < CARD_WIDTH; ++row) 
    { 
     coord.Y += 1; 
     WriteConsoleOutputCharacter(Colorizer::getInstance().getCon(), _card[row], CARD_WIDTH, coord, written); 
    } 
    unpaint(); 
} 

그리고 기본적으로 페인트 적절한 색상 Colorizer 페인트 페인트에 의해 호출 된 함수 (()와 unpain() 내 Colorizer 클래스에서 페인트 함수를 호출

_con

void paint(uint color) 
{ 
    SetConsoleTextAttribute(_con, color); 
} 
그것은 W의 상대 인 _con = GetStdHandle(STD_OUTPUT_HANDLE);

+0

빠른 참고 : 나는'표준 :은'페인트 사이 cout'()'와'사용하는 경우 unpaint() '함수는하지만 그 방법을 것입니다 사용하여 텍스트 색상 _does_ 화면 업데이트를 훨씬 더 과세하고 코드를 더 복잡하게 만든다. – Rakosman

답변

1

통해 설정된 핸들이며 riteConsoleOutputAttribute(). 하나는 문자를 쓰지 만 속성은 변경하지 않습니다. 다른 하나는 속성을 쓰지만 문자는 변경하지 않습니다.

대신 WriteConsole()을 사용하십시오.

+0

환상적이지는 않지만 속임수를 범했다. 'SetConsoleCursorPosition()'과 함께 사용하십시오. – Rakosman

0

Hans Passant에 의해 제안 된대로 https://stackoverflow.com/a/9275247/15485WriteConsoleOutputCharacterWriteConsoleOutputAttribute을 일치시킬 수 있습니다.

enter image description here

#include <windows.h> 
#include <stdio.h> 

void write_symbol_in_color(HANDLE h, SHORT x, SHORT y, const char* symbol, WORD color) 
{ 
    COORD here; 
    here.X = x; 
    here.Y = y; 

    WORD attribute = color; 
    DWORD written; 
    ::WriteConsoleOutputAttribute(h, &attribute, 1, here, &written); 
    ::WriteConsoleOutputCharacterA(h, symbol, 1, here, &written); 
} 

int main() 
{ 
    HANDLE hStdOut = ::GetStdHandle(STD_OUTPUT_HANDLE); 
    if (hStdOut == INVALID_HANDLE_VALUE) 
    { 
     printf("Invalid handle"); 
     return 1; 
    } 

    write_symbol_in_color(hStdOut, 0, 0, "R", FOREGROUND_RED | FOREGROUND_INTENSITY); 
    write_symbol_in_color(hStdOut, 1, 0, "G", FOREGROUND_GREEN | FOREGROUND_INTENSITY); 
    write_symbol_in_color(hStdOut, 2, 0, "B", FOREGROUND_BLUE | FOREGROUND_INTENSITY); 
    write_symbol_in_color(hStdOut, 3, 0, "C", FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); 
    write_symbol_in_color(hStdOut, 4, 0, "M", FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY); 
    write_symbol_in_color(hStdOut, 5, 0, "Y", FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); 

    return 0; 
}