본문 바로가기

 

window11
C 언어

콘솔
출력 색

 

 공식문서

SetConsoleTextAttribute 함수 - Windows Console | Microsoft Learn

② 함수 원형

# 원형

BOOL WINAPI SetConsoleTextAttribute(
  _In_ HANDLE hConsoleOutput, // 핸들 (콘솔 화면 버퍼)
  _In_ WORD   wAttributes     // 색상 ()
);                            // return 0; 성공

③ 함수 매개 변수

③. hConsoleOutput

// 표준 핸들 반환 (콘솔출력, 고정값)
GetStdHandle(STD_OUTPUT_HANDLE)

// 사용 예시
// SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 색상);

 

③.② wAttributes

문자 특성 링크

// 색상 지정
// typedef unsigned short WORD

// 사용 예시
// SetConsoleTextAttribute(핸들, 0b00000000+배경색4bit+글자색4bit);
// SetConsoleTextAttribute(핸들, 1);

unsigned short 2 Byte

8bit + 뒤 4bit 배경색 + 4bit 글자색

0 0000 Black 8 1000 Bright Black
1 0001 Blue 9 1001 Bright Blue
2 0010 Green 10 1010 Bright Green
3 0011 Cyan 11 1011 Bright Cyan
4 0100 Red 12 1100 Bright Red
5 0101 Magenta 13 1101 Bright Magenta
6 0110 Brown 14 1110 Yellow
7 0111 White 15 1111 Bright White

④ 사용법

④.①

#include <stdio.h>
#include <Windows.h>

int main()
{		
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 3); // 0011 Cyan 
    printf("■ ♡ ☆ 가");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15); // 리셋
    printf("\n\n");
    printf("■ ♡ ☆ 가");
    printf("\n\n");

	return 0;
}

④.②

#include <stdio.h>
#include <Windows.h>

int main()
{
    unsigned short backgourndColor_num = 14; //앞 8bit + 뒤 4bit 배경색 + 4bit 글자색
    unsigned short textColor_num = 2;
    unsigned short setting_num = (backgourndColor_num << 4) | textColor_num ; // 뒤 8bit 연산

    SetConsoleTextAttribute ( GetStdHandle(STD_OUTPUT_HANDLE), setting_num);
    printf("■ ♡ ☆ 가");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15); // 리셋
    printf("\n\n");
    printf("■ ♡ ☆ 가 나");
    printf("\n\n");

	return 0;
}

④.

#include <stdio.h>
#include <Windows.h>

void SetColor(int bgd_num, int txt_num) {

    unsigned short backgourndColor_number = bgd_num; //앞 8bit + 뒤 4bit 배경색 + 4bit 글자색
    unsigned short textColor_number = txt_num;
    unsigned short settingColer_number = (backgourndColor_number << 4) | textColor_number ; // 뒤 8bit 연산

    SetConsoleTextAttribute ( GetStdHandle(STD_OUTPUT_HANDLE), settingColer_number);
}

int main()
{
    char str[3][4] = { "★", "☆", "★"};

    printf("1. 특수 문자 출력\n");
    for (size_t i = 0; i < 3; i++)
    {
        printf("%s  ", str[i]);
    }
    
    printf("\n\n");

    printf("2. 색 변경\n");
    for (size_t j = 0; j < 3; j++)
    {
        SetColor(j, j+2);    
        printf("%s  ", str[j]);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15); // 리셋
    }
    
    printf("\n\n");

	return 0;
}

④.

#include <stdio.h>
#include <Windows.h>


typedef enum Color {
	Black	      =  0, // 0000  
	Blue	      =  1, // 0001  
	Green	      =  2, // 0010  
	Cyan	      =  3, // 0011  
	Red	          =  4, // 0100  
	Magenta       =  5, // 0101  
	Brown	      =  6, // 0110  
	White	      =  7, // 0111  
	BrightBlack   =  8, // 1000  
	BrightBlue    =  9, // 1001  
	BrightGreen   = 10, // 1010  
	BrightCyan    = 11, // 1011  
	BrightRed     = 12, // 1100  
	BrightMagenta = 13, // 1101  
	Yellow        = 14, // 1110  
	BrightWhite   = 15	// 1111  
} CRL;

void SetColor(int bgd_num, int txt_num) {

    unsigned short backgourndColor_number = bgd_num; //앞 8bit + 뒤 4bit 배경색 + 4bit 글자색
    unsigned short textColor_number = txt_num;
    unsigned short settingColer_number = (backgourndColor_number << 4) | textColor_number ; // 뒤 8bit 연산

    SetConsoleTextAttribute ( GetStdHandle(STD_OUTPUT_HANDLE), settingColer_number);
}

int main()
{
    char str[16][5] = { "★", "☆", "★","♔", "♕", "♖", "♗", "♘", 
                        "♙", "♚", "♛", "☹", "🧪", "🪓", "💍", "💰"};

    printf("1. 특수 문자 출력\n");
    for (size_t i = 0; i < 3; i++)
    {
        printf("%s  ", str[i]);
    }
    
    printf("\n");
    
    printf("2. 색 변경\n");
    for (size_t j = 0; j < 16; j++)
    {
        SetColor(Black, Blue+j);    
        printf("%4s  ", str[j]);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), White); // 리셋
    }

    printf("\n");

    for (size_t j = 0; j < 16; j++)
    {        
        SetColor(Black+j, Blue+j);    
        printf("%4s  ", str[j]);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), White); // 리셋
    }
    
    printf("\n\n");

	return 0;
}

④.⑤

FOREGROUND_INTENSITY​은 밝은 색을 의미

4가지 색을 섞어서 색을 만듭니다.

NULL, 검은색

#include <stdio.h>
#include <Windows.h>

int main(void)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), NULL);
    printf("■ ♡ ☆ 가\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
    printf("■ ♡ ☆ 가\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE);
    printf("■ ♡ ☆ 가\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
    printf("■ ♡ ☆ 가\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_BLUE);
    printf("■ ♡ ☆ 가\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN);
    printf("■ ♡ ☆ 가\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_RED);
    printf("■ ♡ ☆ 가\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN);
    printf("■ ♡ ☆ 가\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
    printf("■ ♡ ☆ 가\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_INTENSITY);
    printf("■ ♡ ☆ 가\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_INTENSITY);
    printf("■ ♡ ☆ 가\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    printf("■ ♡ ☆ 가\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
    printf("■ ♡ ☆ 가\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    printf("■ ♡ ☆ 가\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
    printf("■ ♡ ☆ 가\n");
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    printf("■ ♡ ☆ 가\n");

    return 0;
}

④.⑥

#include <Windows.h>//COORD, SetConsoleCursorPosition, SetConsoleTextAttribute, Sleep
#include <stdio.h>//puts
#include <stdlib.h>//system
#include <conio.h>//_kbhit

void gotoxy(short x, short y)
{
    COORD Pos = {x, y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}

enum colorCode
{
	BLACK, BLUE, GREEN, JADE, RED, PURPLE, YELLOW, WHITE, GRAY,
	LIGHT_BLUE, LIGHT_GREEN, LIGHT_JADE, LIGHT_RED, LIGHT_PURPLE, LIGHT_YELLOW, LIGHT_WHITE
};

typedef enum colorCode colorCode;

void changecolor(int color)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
}

const char* msgs[2] = { "★☆★☆★☆★☆ 광고판 ★☆★☆★☆★☆",
                        "☆★☆★☆★☆★ 게  임 ☆★☆★☆★☆★" };
colorCode colors[2] = {RED, LIGHT_BLUE };

void draw_msg(int on_off)
{
	gotoxy(20, 10);//커서 x좌표 이동
	changecolor(colors[on_off]);//글자색 지정 on_off가 0이면 RED , 1이면 LIGHT_BLUE
	puts(msgs[on_off]);//메시지 출력 on_off값에 따라 msgs[0] 혹은 msgs[1] 출력
	Sleep(500);//0.5초 멈춤
}

int main()
{
	int on_off = 0;
	//system("mode con:cols=100 lines=100"); //관리자 모드 필요
	system("cls");
	system("COLOR A8"); //배경색을 녹색(A), 글자색은 흰색(8)로 설정
	while (1)
	{
		if (_kbhit())//키를 누르면
		{
			break;//반복문 탈출하여 프로그램 종료함
		}		
		draw_msg(on_off);//메시지 출력
		on_off = (on_off + 1) % 2;//메시지 번호 토글 0-1-0-1-0-...
	}	
	return 0;
}

⑤ 주의점

#include <stdio.h>
#include <Windows.h>

int main()
{
    unsigned short backgourndColor_num = 14; //앞 8bit + 뒤 4bit 배경색 + 4bit 글자색
    unsigned short textColor_num = 2;
    unsigned short setting_num = (backgourndColor_num << 4) | textColor_num ; // 뒤 8bit 연산

    SetConsoleTextAttribute ( GetStdHandle(STD_OUTPUT_HANDLE), setting_num);
    printf("■ ♡ ☆ 가\n"); // 줄바꿈까지 포함, 다음 라인까지 색변경이 진행된다
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15); // 리셋
    printf("■ ♡ ☆ 가 나\n"); // 해당 문자가 덮어씌워질 뿐이다. 

	return 0;
}

 

 

참고 링크

공식, 링크1, 링크2, 링크3, 링크4, 링크5, 링크6, 링크7, 링크8

 

 

 

 

BasicLike

어? 나 프로그래밍 좋아하네?