※요약

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



※요약

rename : 파일 및 디렉토리의 이름을 변경한다.



※특징

이름 변경 말고도 파일을 이동할 때 사용할 수 있다.



※함수 원형 및 설명

int rename( const char *oldname, const char *newname );
//oldname : 파일 또는 디렉토리의 경로나 이름
//newname : 변경할 파일 또는 디렉토리의 이름
//반환값 : 성공 시 0, 실패 시 errno ( EACCES, ENOENT, EINVAL )



※예제

#include <stdio.h>
#include <direct.h>		//mkdir, rename

int main( )
{
	char strOldFolder[] = "d:\\TestOldFolder";
	char strNewFolder[] = "d:\\TestNewFolder";

	//테스트 폴더를 만든다.
	mkdir( strOldFolder );
	
	//이름을 바꾸고 결과를 리턴 받는다.
	int nResult = rename( strOldFolder, strNewFolder );

	if( nResult == 0 )
	{
		printf( "이름 변경 성공" );
	}
	else if( nResult == -1 )
	{
		perror( "이름 변경 실패 - " );
	}

	return 0;
}



※요약

_getdrive : 현재 작업 중인 드라이브를 구한다.



※함수 원형 및 설명

int _getdrive( );
//반환값 : A드라이브=1 ~ Z드라이브=26 일때 현재 드라이브 값



※예제 설명

아래 예제의 getdrive는 int형을 반환하지만 반환값이 1에서 26으로 정해져 있어 

char형 데이터 범위에 들어가므로 char형으로 변환해도 문제가 없다.

int형 데이터를 char형으로 명시적 형 변환을 해줘서 각 드라이브명을 출력하게 했다.

96을 더해준건 아스키 코드표를 보면 알 수 있다.



※예제

#include <stdio.h>
#include <direct.h>    //_getdrive

int main( )
{
	int nDrive = 0;

	nDrive = _getdrive( );

	printf( "현재 드라이브는 %c입니다.", char(nDrive)+96 );

	return 0;
}


※결과





※요약

chdir : 현재 작업 디렉토리를 변경한다.

change directory



※함수 원형 및 설명

int chdir( const char *dirname );
//dirname : 변경할 디렉토리의 경로
//반환값 : 정상 일 때 0, 에러 시 -1



※예제

#include <stdio.h>
#include <direct.h>	//chdirㅐ

#ifndef _MAX_PATH
#define _MAX_PATH 260
#endif

int main( )
{
	char strBuffer[_MAX_PATH] = { 0, };
	char strChangeDir[_MAX_PATH] = { "C:\\Windows" };

	int nResult = chdir( strChangeDir );

	if( nResult == 0 )
	{
		printf( "이동 성공" );
	}
	else if( nResult == -1 )
	{
		perror( "이동 실패 - " );
	}

	return 0;
}





※요약

getcwd : 현재 작업 중인 디렉토리의 경로를 얻는다.



※특징

버퍼가 작으면 에러가 발생할 수 있으므로 크게 잡는다.



※함수 원형 및 설명

char *getcwd( char *buffer, int maxlen );
//buffer : 파일의 경로
//maxlen : 파일에 설정할 접근 모드 값
//반환값 : 정상 일 때 0, 에러 시 -1



※예제

#include <stdio.h>
#include <direct.h>	//getcwd

#ifndef _MAX_PATH
#define _MAX_PATH 260
#endif

int main( )
{
	char strBuffer[_MAX_PATH] = { 0, };
	char *pstrBuffer = NULL;

	pstrBuffer = getcwd( strBuffer, _MAX_PATH );

	return 0;
}




※요약

chmod : 파일이나 디렉토리의 읽기/쓰기 접근 권한을 변경한다.

change mode



※특징

pmode 값은 _S_IREAD와 _S_IWRITE 값만 사용한다.



※함수 원형 및 설명

int chmod( const char *filename, int pmode );
//filename : 파일의 경로
//pmode : 파일에 설정할 접근 모드 값
//반환값 : 정상 일 때 0, 에러 시 -1

접근 권한

설 명

비 고

_S_IREAD

읽기 접근 권한

-

_S_IWRITE

쓰기 접근 권한

_S_IREAD 속성 해제



※예제

#include <stdio.h>
#include <sys⁄stat.h>    //_S_IREAD, _S_IWRITE
#include <io.h>          //chmod

int main( )
{
	char strPath[] = { "D:\\Text.txt" };
	
	int nResult = chmod( strPath, _S_IREAD );

	if( nResult == 0 )
	{
		printf( "읽기 전용으로 속성 변경 성공" );
	}
	else if( nResult == -1 )
	{
		perror( "실패 - " );
	}

	return 0;
}





※요약

mkdir : 디렉토리(폴더)를 생성한다.

make directory


※특징

만들려는 폴더가 이미 존재하면 errno는 EEXIST,

폴더가 부정확하면 errno는 ENOENT


※함수 원형 및 설명

int mkdir( const char *dirname );
//dirname : 생성할 디렉토리 경로와 이름
//반환값 : 정상 일 때 0, 에러 시 -1



※예제

#include <stdio.h>
#include <direct.h>		//mkdir
#include <errno.h>		//errno

int main( )
{
	char strFolderPath[] = { "D:\\CreateFolder" };
	
	int nResult = mkdir( strFolderPath );

	if( nResult == 0 )
	{
		printf( "폴더 생성 성공" );
	}
	else if( nResult == -1 )
	{
		perror( "폴더 생성 실패 - 폴더가 이미 있거나 부정확함\n" );
		printf( "errorno : %d", errno );
	}

	return 0;
}





※요약

rmdir : 디렉토리(폴더)를 삭제한다.



※특징

디렉토리 내에 파일이 존재하거나 사용중이면 삭제할 수 없다.

삭제 전에 디렉토리의 존재 유무 확인 후 삭제하면 좋다.



※함수 원형 및 설명

int rmdir( const char *dirname );
//dirname : 삭제할 디렉토리 경로
//반환값 : 정상 일 때 0, 에러 시 -1



※예제

#include <stdio.h>
#include <direct.h>		//rmdir
#include <errno.h>		//errno

int main( )
{
	char strFolderPath[] = { "D:\\TestFolder2" };
	
	int nResult = rmdir( strFolderPath );

	if( nResult == 0 )
	{
		printf( "폴더 삭제 성공" );
	}
	else if( nResult == -1 )
	{
		perror( "폴더 삭제 실패 - 폴더 안에 파일이 있거나 사용중\n" );
		printf( "errorno : %d", errno );
	}

	return 0;
}





※요약

remove : 지정한 경로의 파일을 삭제한다.



※특징

읽기 전용, 숨김, 시스템 속성 등을 갖는 파일은 삭제할 수 없다.

또 현재 사용 중인 파일도 삭제할 수 없다.



※함수 원형 및 설명

int remove( const char *path );
//path : 파일 경로
//반환값 : 정상 일 때 0, 에러 시 -1



※예제

#include <stdio.h>

int main( )
{
	char strPath[] = { "D:\\Text2.txt" };
	
	int nResult = remove( strPath );

	if( nResult == 0 )
	{
		printf( "파일 삭제 성공" );
	}
	else if( nResult == -1 )
	{
		perror( "파일 삭제 실패" );
	}

	return 0;
}




※요약

access : 파일이나 디렉토리(폴더)의 존재 유무, 혹은 파일의 권한 및 속성을 조사할 때 사용한다.



※특징

주로 파일 및 디렉토리가 존재하는 지 조사할때 사용한다.



※함수 원형 및 설명

int access( const char *path, int mode );
//path : 파일이나 폴더의 전체 경로 또는 이름
//mode : 파일이나 폴더의 존재 유무 검사 또는 권한 조사(아래 표 참고)
//반환값 : 정상 시 0, 에러 시 -1



모드 설명

모 드

설 명

00

파일 및 디렉토리가 존재 하는지 조사

02

쓰기 접근이 허용되는지 조사

04

읽기 접근이 허용되는지 조사

06

읽기 및 쓰기가 허용되는지 조사




※예제

#include <stdio.h>
#include <io.h>		//access

int main( )
{
	char strPath[] = { "C:\\Windows" };
	
	int nResult = access( strPath, 0 );

	if( nResult == 0 )
	{
		printf( "지정한 경로에 파일⁄폴더가 존재 합니다." );
	}
	else if( nResult == -1 )
	{
		printf( "지정한 경로에 파일⁄폴더가 존재하지 않습니다." );
	}

	return 0;
}


+ Recent posts