※요약

COLORREF : 

-윈도우즈에서는 색상값을 표현하기 위해 COLORREF라는 데이터형을 사용

-부호없는 32비트 정수형

-R, G, B 각각 1바이트(8비트)이며 0~255 범위의 농도를 표현


RGB : 

-빛의 3원색인 적, 녹, 청을 혼합하여 색을 나타내는 방식



※특징

아래 소스는 윈도우 및 리눅스에서 사용 가능하고 필요한 부분만 붙여넣고 사용하면 됩니다.

윈도우 상에서만 사용할 소스 코드라면 아래와 같이 긴 소스 코드가 필요 없고 

RGB매크로와 GetRValue, GetGValue, GetBValue매크로만 사용하면 됩니다.


매크로가 있는데 굳이 함수로도 만든 이유는, 리눅스 상에서 사용할 때 편할 걸로 하기 위해서 입니다.


비트 연산이 이해가 안되면 직접 종이에 써 보면서 하면 쉽습니다.



※예제

#include <stdio.h>

#ifdef WIN32	//윈도우 환경이면 windows.h를 추가(윈도우 환경이어도 컴파일 환경에 따라 WIN32가 없을 수 있음)
#include <windows.h>
#else			//윈도우 환경이 아닐 경우 WinDef.h나 WinGDI.h에 선언, 정의된 내용 중 필요한 것들을 아래에 작성
//아래의 DWORD, WORD, BYTE, COLORREF는 WinDef.h에 선언된 내용
typedef unsigned long		DWORD;
typedef unsigned short      WORD;
typedef unsigned char       BYTE;
typedef DWORD				COLORREF;

//아래의 RGB, GetRValue, GetGValue, GetBValue는 WinGDI.h에 선언된 내용
#ifndef RGB
#define RGB(r,g,b)			((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
#endif

#ifndef GetRValue							//GetRValue가 선언되어 있지 않다면
#define GetRValue(rgb)		( (BYTE)(rgb) )	⁄⁄GetRValue를 내가 선언
#endif
#ifndef GetGValue
#define GetGValue(rgb)		( (BYTE)(((WORD)(rgb))>>8) )
#endif
#ifndef GetBValue
#define GetBValue(rgb)		( (BYTE)((rgb)>>16) )
#endif
#endif

//아래 3개의 함수들은 int대신 BYTE형으로 내부 처리 및 반환을 해도 상관없지만
//32비트 CPU의 기본 처리 단위는 4byte이므로 int형으로 처리하는 게 더 낫다.
int REF2R( COLORREF rgb );
int REF2G( COLORREF rgb );
int REF2B( COLORREF rgb );

int main( )
{
	DWORD dwTemp = RGB( 56, 128, 108 );

	int nR1 = REF2R( dwTemp );
	int nG1 = REF2G( dwTemp );
	BYTE nB1 = BYTE( REF2B(dwTemp) ); //int형을 반환하지만, 반환하는 값의 범위가 BYTE형 범주이므로 상관없음

	//int로 받아도 되고 BYTE로 받아도 된다.
	BYTE nR2 = GetRValue( dwTemp );
	BYTE nG2 = GetGValue( dwTemp );
	BYTE nB2 = GetBValue( dwTemp );

	printf( "R:%d, G:%d, B:%d\n", nR1, nG1, nB1 );
	printf( "R:%d, G:%d, B:%d\n", nR2, nG2, nB2 );

	return 0;
}

int REF2R( COLORREF rgb )
{
	int nBitmaskRed = 0x0000ff;  //255
	int nRed = rgb & nBitmaskRed;

	return nRed;
}

int REF2G( COLORREF rgb )
{
	int nBitmaskGreen = 0x00ff00; //65280
	int nGreen = ( rgb & nBitmaskGreen ) >> 8;

	return nGreen;
}

int REF2B( COLORREF rgb )
{
	int nBitmaskBlue = 0xff0000;  //16711680
	int nBlue = ( rgb & nBitmaskBlue ) >> 16;

	return nBlue;
}



※결과


'C > 기타' 카테고리의 다른 글

[C언어] 콘솔 창에서 컬러 텍스트 출력  (0) 2013.11.28



콘솔창은 형형색색으로 꾸며도 정말 촌스럽네요.




※소스 코드

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

#define RED         (FOREGROUND_RED | FOREGROUND_INTENSITY)
#define BLUE        (FOREGROUND_BLUE | FOREGROUND_INTENSITY)
#define PINK        (RED | BLUE)
#define WHITE       (RED | GREEN | BLUE)
#define GREEN       (FOREGROUND_GREEN | FOREGROUND_INTENSITY)
#define YELLOW      (RED | GREEN)
#define SKYBLUE     (GREEN | BLUE)

#define RED_BG      (BACKGROUND_RED | BACKGROUND_INTENSITY)
#define BLUE_BG     (BACKGROUND_BLUE | BACKGROUND_INTENSITY)
#define PINK_BG     (RED_BG | BLUE_BG)
#define WHITE_BG    (RED_BG | GREEN_BG | BLUE_BG)
#define GREEN_BG    (BACKGROUND_GREEN | BACKGROUND_INTENSITY)
#define YELLOW_BG   (RED_BG | GREEN_BG)
#define SKYBLUE_BG  (GREEN_BG | BLUE_BG)

void PrintString( HANDLE hStdOut, WORD Attribute, LPCSTR str )
{
    SetConsoleTextAttribute( hStdOut, Attribute );
    puts(str);
}

int main( )
{
    HANDLE hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );

    PrintString(hStdOut, RED, "빨간색");
    PrintString(hStdOut, BLUE, "파란색");
    PrintString(hStdOut, PINK, "분홍색");
    PrintString(hStdOut, WHITE, "하얀색");
    PrintString(hStdOut, GREEN, "초록색");
    PrintString(hStdOut, YELLOW, "노란색");
    PrintString(hStdOut, SKYBLUE, "하늘색\n");

    PrintString(hStdOut, RED_BG, "빨간배경");
    PrintString(hStdOut, BLUE_BG, "파란배경");
    PrintString(hStdOut, PINK_BG, "분홍배경");
    PrintString(hStdOut, WHITE_BG, "하얀배경");
    PrintString(hStdOut, GREEN_BG, "초록배경");
    PrintString(hStdOut, YELLOW_BG, "노란배경");
    PrintString(hStdOut, SKYBLUE_BG, "하늘배경\n");

    PrintString(hStdOut, YELLOW_BG | PINK, "노란배경 빨간글씨");
	PrintString(hStdOut, WHITE_BG | GREEN, "하얀배경 빨간글씨");
	PrintString(hStdOut, GREEN_BG | WHITE, "초록배경 빨간글씨");
	PrintString(hStdOut, BLUE_BG | RED, "파랑배경 빨간글씨");

    CloseHandle(hStdOut);

    return 0;
}


'C > 기타' 카테고리의 다른 글

[C언어] 플랫폼 독립적 COLORREF <-> RGB 서로 변환  (0) 2014.03.12

+ Recent posts