콘솔 글자색, 배경색 수정(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
댓글을 사용할 수 없습니다.