1.글자에 색넣기

#include <windows.h>를 붙여줘야합니다.

HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleTextAttribute(hout,FOREGROUND_BLUE | FOREGROUND_INTENSITY);

위에 분홍색으로 표시한 부분은 변형 가능한겁니다.



만약

HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE);

으로 했으면 밑은

SetConsoleTextAttribute(Out,FOREGROUND_BLUE | FOREGROUND_INTENSITY);

가 되겠죠. 위에 있는데로 실행하면 글씨는 형광 파랑 이됩니다.



위의 FOREGROUND_BLUE | FOREGROUND_INTENSITY

에서 가운데의 | 부분이 보이십니까? 그 부분은 일종의 색을 섞어주는 역할을 합니다.

위의 INTENSITY 는 형광으로 나타내는 역할을 합니다.

즉, 파랑 + 형광 = 형광 파란색 이 되는거죠.



FOREGROUND의 종류에는 3가지가 있습니다.

FOREGROUND_RED 와 FOREGROUND_GREEN 과 FOREGROUND_BLUE 가 있죠.

이 색들을 섞어서 여러가지 색을 만들 수 있습니다.

예를 들어,내가 보라색을 만들고 싶다면,

SetConsoleTextAttribute(hout,FOREGROUND_BLUE | FOREGROUND_RED)

가 되는거죠.



물론, 세가지든 네가지든 섞을 수있습니다.다만 앞에 | 을 붙여줘야 합니다.

FOREGROUND 말고 BACKGROUND 도 있는데요, 이는 배경화면의 색을 나타냅니다.

마찬가지로 색은 BACKGROUND_RED,BACKGROUND_GREEN,BACKGROUND_BLUE가 있습니다.



그리고 중요한 건,만약, 내가

FORE_BLUE;(파랑색으로 define 되있다고 가정합니다)

하고서 ,

printf("Hello, World!\n");

printf("Hello, World!");

했다고 하면,Hello, World! 는 두개 모두 파랑색으로 됩니다.즉,색을 바꾸려면 두 printf가운데 원하는 색을 넣어야 하는거죠.

[출처] SetConsoleTextAttribute()|작성자 jjhbest1







// 콘솔창에서 텍스트에 색상입히기





전시간에 말이 나온김에 바로 이쪽을 살펴보기로 했습니다.



과거 textcolor()라는 함수가 있었습니다.



음. 역시 터보씨,볼랜드씨 사용하던 시절에 있던 함수인데 VC++에서 이 기능을 사용해보려고 합니다.



일단 표현할수 있는 색상이 그리 많지 않습니다.



그리고 빛의 3원색에 대해서 어느정도 이해를 하셔야 합니다.



아래 링크를 잠시 살펴보고



http://100.naver.com/100.nhn?docid=839807



이제 아래 그림을 봅시다.

 








최종적으로 표현가능한 색상은 이러합니다.



바로 RGB의 원리입니다. 고유 색상들이 섞여서 다른 색을 만들어 내는 것이죠.



총 16색이 가능합니다. 이걸 4비트 색상이라고도 하죠.



기본적으로 VC++에서 제공하는 콘솔용 색상은 이게 전부입니다.



일단 예제를 살펴보죠.





#include <stdio.h>
#include <windows.h> // win32 콘솔용 함수의 사용을 위해 불러옴


void txtcolor(unsigned short color)
{
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,color);
}



int main()
{

int i;

for(i=0 ; i<16 ;i++)
{
txtcolor(i); // txtcolor()속에 0부터 15까지의 값이 들어갑니다.
printf("색상값 %d의 색은 이렇습니다 \n",i);

}

return 0;
}



결과는 아래와 같습니다.


   




두가지 알고 지나가야할 할 점이 있습니다.



첫번째로 0번인 검정색은 배경이 검정색이라서 보이지 않습니다.



두번째로 Press and key to continue 색상이 프로그램의 영향을 받아서 흰색이 되었습니다.





검정색 글자가 보이지 않는건 당연한거죠.



꼭 검정색 글자를 쓰고 싶다면 글자의 배경색을 바꿔서 보이게 하는 방법을 써야 합니다.



이건 다음 시간에 하게 될 것 같군요.



두번째는 신경써야 할 부분으로 다시 본래의 색으로 돌아가는 방법은 두가지입니다.



기본색인 7(회색)으로 한번더 선언해주는 방법과 글자의 초기값을 기억해뒀다가



필요할때 다시 초기화시키는 방법이죠.



얼핏생각해보면 뒤에 방법이 좋아보이는데 막상 해보니 별 의미가 없어보이네요.



마치 전역변수처럼 함수를 벗어나도 값이 유지되기 때문에



txtcolor(7); 이렇게 한줄로 해결하는게 여러모로 좋은것 같습니다.





그럼 이 숫자에 대해서 알아봅시다.



WinApi에서 주로 사용하게 되는 방식인데 색상값을 공부하는 김에 지금 해보겠습니다.



아래에 콘솔용 4비트 색상표를 만들어봤습니다.



여기 있는 색상 중에 당장 기억하셔야 할 것은 1과 2 와 4 그리고 8 입니다.



조합이 가능한것은 이 네가지 뿐입니다.



아래 색상표를 보면서 3,5,6,7을 생각해봅시다.



1과 2를 더해서 3을 만듭니다. 즉 어두운파랑과 어두운초록을 합쳐서 청록을 만들죠.

5의 경우 1과 4를 더해서 만듭니다. 즉 어두운파랑과 어두운빨강을 합쳐서 자홍을 만들죠.

6의 경우는 2와 4를 더해서 만듭니다. 즉 어두운초록과 어두운빨강을 합쳐서 노랑을 만들죠.

7의 경우 1,2,4를 더해서 만듭니다. 어두운 3원색을 모두 합치니 어두운 흰색이 나오게 되죠.

8의 경우는 조금 특이합니다. 0인 검정색과 7인 어두운흰색을 섞은듯한 짙은 회색이 나오게 되죠.

더욱 특이한점은 단독으로 쓰였을 때만 그렇고 다른색과 같이 쓰이게 되면 밝은색으로 만들어줍니다.

가령 9를 보죠. 밝은 파랑색입니다. 1번 과 8번이 합쳐져서 9번이 나옵니다.

이후 15번까지 동일한 과정을 거치게 됩니다.





   



               



검정, 어두운파랑, 어두운초록, 어두운청록, 어두운빨강, 어두운자홍, 어두운노랑



이후 7번 부터는 회색, 짙은회색, 파랑, 초록, 청록, 빨강, 자홍, 노랑, 흰색 이라고 생각하시면 됩니다.





SetConsoleTextAttribute()에 관해서 조금 알아보면



이런식으로 글자색에 관해서 매크로로 정해져 있습니다.



#define FOREGROUND_BLUE 0x0001 // text color contains blue.
#define FOREGROUND_GREEN 0x0002 // text color contains green.
#define FOREGROUND_RED 0x0004 // text color contains red.
#define FOREGROUND_INTENSITY 0x0008 // text color is intensified.





txtcolor(FOREGROUND_BLUE); 이렇게 하셔도 어두운파랑색이 나오게 되죠.



txtcolor(FOREGROUND_GREEN | FOREGROUND_RED); 이렇게 하면 어두운노랑이 나옵니다.



| 대신에 + 를 넣으셔도 됩니다.



사실 숫자로는 분별하기 어렵기 때문에 저렇게 매크로로 지정해 놓은 것인데



그림과 숫자를 비교해서보면 이해에 도움이 될 것 같아서 숫자를 기준으로 설명을 드렸습니다.



다음 시간에는 글자색 이외의 다른 속성에 대해서 알아보겠습니다.







후... 비교적 간단해보이는 위의 그림들을 만드는데 2시간 넘게 걸렸습니다. ㅠㅠ



지금까지 링크로 해결하면서 날로 먹으려고 들었지만 아무리 검색해봐도



4비트 콘솔용 색상에 관해서는 원리부터 알기 쉽게 설명 나온 부분이 없더군요.



이래저래 포스팅 하나 하는데 5시간은 걸린듯하네요;



콘솔창상태에서 전체화면 시도했다가 모니터 다운된게 총 4회;;







XP는 윈도우98같이 정상적인 도스를 사용할 수 있는 환경이 아니라서



전체화면을 하면 속도도 상당히 느려지고 도스명령어도 완벽하게 사용할수가 없습니다.



전체화면시에 나오는 콘솔화면은 도스가 아닌 도스를 흉내낸 화면이라고 생각하셔도 좋겠네요.



가급적 전체화면은 하지 맙시다;




[출처] RPG 게임을 만들면서 C/C++ 언어와 친해지기 - Part 22|작성자 소라니