콘솔 글자색, 배경색 수정(1) - Win11
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