CreateFont

원형 HFONT CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int fnWeight, DWORD fdwItalic, DWORD fdwUnderline, DWORD fdwStrikeOut, DWORD fdwCharSet, DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality, DWORD fdwPitchAndFamily, LPCTSTR lpszFace );
MFC 원형 BOOL CFont::CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename );
인수

▶nHeight : 글자의 높이 또는 폰트 셀의 높이를 논리적인 단위로 지정한다. 글자의 높이는 폰트 셀의 높이에서 internal leading값을 뺀 값이다. 이 값이 0일 경우는 디폴트 크기가 사용되며 양수일 경우 셀의 높이를 지정하고 음수일 경우 글자의 높이를 절대값으로 지정한다.

▶nWidth : 폰트의 폭을 논리 단위로 지정하되 이 값이 0이면 nHeight에서 지정한 높이에 따라 폭을 자동으로 결정한다. 즉 이 값이 0이면 폰트의 종횡비(장평)가 일정하다.

▶nEscapement : 폰트의 각도를 0.1도 단위로 설정한다. 이 각도는 문자가 출력될 X축과 문자열과의 각도이며 일상적인 360분법의 각도 체계를 사용한다. 즉 세 시 방향이 0도로 사용되며 반시계 방향으로 각도가 증가한다.

▶nOrientation : 글자 한 자와 X축과의 각도를 지정한다. nEscapement는 전체 문자열의 기울기를 지정하는데 비해 이 인수는 개별 문자의 기울기를 설정한다. 이 값은 95/98에서는 의미가 없으며 NT에서 GM_ADVANCED 그래픽 모드인 경우에 한해 지정할 수 있다. GM_COMPATIBLE 모드에서는 nEscapement 인수가 이 인수값을 동시에 지정하며 두 값을 같게 지정해 주어야 한다.

▶fnWeight : 폰트의 무게를 0~1000까지의 값으로 설정한다. 쉽게 말해서 폰트의 두께를 설정한다. 0~1000까지의 값을 지정할 수 있으며 보통 굵기인 FW_NORMAL과 굵은 문자인 FW_BOLD만 사용된다.

두께
FW_DONTCARE 0
FW_THIN 100
FW_EXTRALIGHT 200
FW_ULTRALIGHT 200
FW_LIGHT 300
FW_NORMAL 400
FW_REGULAR 400
FW_MEDIUM 500
FW_SEMIBOLD 600
FW_DEMIBOLD 600
FW_BOLD 700
FW_EXTRABOLD 800
FW_ULTRABOLD 800
FW_HEAVY 900
FW_BLACK 900

▶fdwItalic : 기울임체 속성을 설정한다. 데이터형이 DWORD이지만 불린형처럼 사용한다. 속성을 주고 싶으면 0 이외의 값(TRUE)를 주고 속성을 주지 않으려면 0(FALSE)를 준다.

▶fdwUnderline : 밑줄 속성을 설정한다. 데이터형이 DWORD이지만 불린형처럼 사용한다. 속성을 주고 싶으면 0 이외의 값(TRUE)를 주고 속성을 주지 않으려면 0(FALSE)를 준다.

▶fdwStrikeOut : 취소헌 속성을 설정한다. 데이터형이 DWORD이지만 불린형처럼 사용한다. 속성을 주고 싶으면 0 이외의 값(TRUE)를 주고 속성을 주지 않으려면 0(FALSE)를 준다.

▶fdwCharSet : 문자 셋을 설정한다. 폰트 매퍼가 논리 폰트를 생성할 때 참조하는 중요한 값이므로 폰트의 타입 페이스를 지정할 경우 반드시 해당 폰트의 문자셋과 일치하도록 써 주어야 한다.

문자셋 실제값 설명
ANSI_CHARSET 0 윈도우즈에서 사용하는 문자셋
DEFAULT_CHARSET 1 이름과 크기만으로 폰트를 선택하도록 한다. 만약 이 문자셋으로 폰트를 생성할 때 지정한 폰트가 없으면 임의의 문자셋으로 대체될 수도 있기 때문에 원하지 않는 폰트가 생성될 수도 있다.
SYMBOL_CHARSET 2  
OEM_CHARSET 255 운영체제에 종속적인 문자셋
HANGUL_CHARSET 129 HANGUEL_CHARSET으로 중복 정의되어 있다.
BALTIC_CHARSET 186  
CHINESEBIG5_CHARSET 136  
EASTEUROPE_CHARSET 238  
GB2312_CHARSET 134  
GREEK_CHARSET 161  
MAC_CHARSET 77  
RUSSIAN_CHARSET 204  
SHIFTJIS_CHARSET 128  
TURKISH_CHARSET 162  
JOHAB_CHARSET 130 한글 윈도우즈에서만 사용 가능
HEBREW_CHARSET 177 중앙 아시아 윈도우즈에서만 사용 가능
ARABIC_CHARSET 178 중앙 아시아 윈도우즈에서만 사용 가능
THAI_CHARSET 222 타이 윈도우즈에서만 사용 가능

▶fdwOutputPrecision : 출력 정확도를 설정한다. 같은 이름의 폰트가 여러 벌 있을 경우 폰트 매퍼가 어떤 폰트를 선택할 것인가를 지정한다.

설명
OUT_CHARACTER_PRECIS 사용되지 않는 값이다.
OUT_DEFAULT_PRECIS 폰트 매퍼의 디폴트 동작을 정의한다.
OUT_DEVICE_PRECIS 디바이스 폰트를 선택하도록 한다.
OUT_OUTLINE_PRECIS 트루 타입 또는 외곽선 폰트를 선택하도록 한다.
OUT_RASTER_PRECIS 래스트 폰트를 선택하도록 한다.
OUT_STRING_PRECIS 폰트 매퍼가 사용하지 않는 값이되 래스트 폰트 열거시 리턴된다.
OUT_STROKE_PRECIS 폰트 매퍼가 사용하지 않는 값이되 래스트 폰트 열거시 리턴된다.
OUT_TT_ONLY_PRECIS 트루 타입 폰트를 선택하도록 한다. 트루 타입 폰트가 없으면 디폴트 동작대로 한다.
OUT_TT_PRECIS 트루 타입 폰트를 선택하도록 한다.

▶fdwClipPrecision : 클리핑 정확도를 설정한다. 클리핑 영역을 벗어난 문자의 일부를 어떻게 클립할 것인가를 지정하면 다음과 같은 값들이 있다.

설명
CLIP_DEFAULT_PRECIS 디폴트 클리핑 동작
CLIP_CHARACTER_PRECIS 사용되지 않음
CLIP_STROKE_PRECIS  
CLIP_MASK 사용되지 않음
CLIP_EMBEDDED  
CLIP_LH_ANGLES  
CLIP_TT_ALWAYS 사용되지 않음

▶fdwQuality : 논리적 폰트를 물리적 폰트에 얼마나 근접시킬 것인가를 지정한다.

설명
DEFAULT_QUALITY 폰트의 모양을 문제삼지 않는다.
DRAFT_QUALITY PROOF_QUALITY보다 한단계 낮은 품질 등급이다.
PROOF_QUALITY 논리 폰트의 속성보다 글자의 품질을 더 중요시한다. 래스터 폰트의 경우 크기가 가장 근접한 폰트가 선택된다.

▶fdwPitchAndFamily : 폰트의 피치와 그룹을 설정한다.하위 2비트는 폰트의 피치를 나타내며 상위 4비트는 폰트의 패밀리를 지정한다. 피치는 폰트의 폭이 글자마다 다른가 일정한가를 지정하며 DEFAULT_PITCH, FIXED_PITCH(고정폭), VARIABLE_PITCH(가변폭) 세가지가 있다. 패밀리는 획의 굵기와 세리프 특성이 같은 폰트의 모임이며 다음 다섯 가지 종류가 있다.

패밀리 설명
FF_DECORATIVE 장식체
FF_DONTCARE 패밀리를 상관하지 않는다. 또는 패밀리를 알 수 없다. 이 값은 실제로 존재하는 패밀리가 아니라 임의의 패밀리를 지칭한다.
FF_MODERN 고정폭이며 세리프는 있을 수도 있고 없을 수도 있따.
FF_ROMAN 세리프가 있고 가변폭이다.
FF_SCRIPT 손을 쓴 듯한 필기체 형식의 폰트
FF_SWISS 세리프가 없고 고정폭이다.

이 인수에 피치와 패밀리 값을 OR 연산자로 같이 지정한다. 예를 들어 고정폭의 Roman 패밀리 폰트를 원할 경우 FIXED_PITCH | FF_ROMAN값을 지정하면 된다.

▶lpszFace : 글꼴의 이름을 나타내는 문자열을 설정한다. 공백을 포함할 수 있으며 널 종료 문자열을 포함하여 최대 32문자까지의 길이를 가진다. "Times New Roman", "굴림" 등과 같이 폰트 이름을 적어준다. 만약 이 인수가 NULL이거나 빈 문자열일 경우 GDI는 다른 특성이 일치하는 최초의 폰트를 선택한다.

리턴 성공하면 논리 폰트의 핸들을 리턴하며 에러 발생시 NULL을 리턴한다.
설명

CreateFont는 인수가 지정하는 특성에 가장 일치하는 논리 폰트를 생성하며 이 함수로 생성한 논리 폰트는 SelectObject 함수에 의해 DC에 선택된다. 논리 폰트는 응용 프로그램이 사용하고자 하는 폰트에 대한 정의일 뿐이며 실제로 시스템에 존재하는 물리 폰트와는 다르다. GDI는 논리 폰트의 정보를 참조하여 시스템에 존재하는 물리 폰트 중 논리 폰트의 특성에 가장 근접 폰트를 선택해 준다. 논리 폰트에 가장 근접하는 물리 폰트를 찾는 과정을 폰트 맵핑이라고 하며 그 알고리즘을 폰트 매퍼라고 한다. CreateFont 함수는 인수가 지정하는 특성대로 논리 폰트를 만들 뿐이며 폰트 매퍼에 의해 물리 폰트를 선택하는 것은 SelectObject 함수가 한다.

폰트 매퍼가 폰트를 선택할 때 가장 우선적으로 고려하는 요소는 문자셋, 패치와 패밀리 그리고 타입 페이스이다. 따라서 정확한 결과를 얻기 위해서는 최소한 이 세값을 정확하게 요구해야 한다. 만약 "BaboFont"라는 이름을 가지는 폰트를 선택하고 싶다고 해서 타입 페이스만 "BaboFont"라고 요구하고 나머지 정보를 아무렇게나 요구할 경우 이 폰트가 설치되지 않은 시스템에서는 엉뚱한 폰트가 선택될 수도 있다. 문자셋, 피치, 패밀리 정보를 정확하게 요구했으면 설사 이 폰트가 없어도 최대한 비슷한 폰트를 찾아 선택할 수 있다.

예제 1

다음 예제는 30픽셀의 궁서 폰트를 만들어 이 폰트로 문자열을 화면으로 출력한다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	HFONT font, oldfont;
	char str[]="WinApi의 폰트 예제입니다.";

	switch(iMessage) {
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		font=CreateFont(30,0,0,0,0,0,0,0,HANGEUL_CHARSET,3,2,1,
			VARIABLE_PITCH | FF_ROMAN,"궁서");
		oldfont=(HFONT)SelectObject(hdc,font);
		TextOut(hdc, 50,50,str,lstrlen(str));
		SelectObject(hdc,oldfont);
		DeleteObject(font);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

CreateFont로 폰트를 생성하고 SelectObject 함수로 폰트를 선택한 후 문자열을 출력하였다. 폰트는 사용한 후에 반드시 DeleteObject 함수로 삭제해 주어야 한다. 실행 결과는 다음과 같다.

CreateFont에서 nHeight에 30을 지정함으로써 문자의 높이를 30으로 지정했으며 nWidth에 0을 지정함으로써 디폴트 폭을 사용하도록 하였다. nHeight를 -30으로 지정하면 문자 셀 높이가 30이 되어 문자의 크기가 조금 더 작아질 수도 있으나 한글 글꼴에서는 거의 차이가 없다. nWidth에 0이 아닌 폭을 주면 문자의 장평을 줄 수도 있다.

font=CreateFont(30,10,0,0,0,0,0,0,HANGEUL_CHARSET,3,2,1,
	VARIABLE_PITCH | FF_ROMAN,"궁서");

fdwItalic, fdwUnderline 등의 값을 0이 아닌 다른 값(TRUE)로 주면 밑줄 문자나 기울어짐 문자를 만들 수도 있다. 다음 코드는 Underline과 Italic 속성을 주어 문자를 만든 것이다.

font=CreateFont(30,10,0,0,0,1,1,0,HANGEUL_CHARSET,3,2,1,
	VARIABLE_PITCH | FF_ROMAN,"궁서");

궁서 폰트의 나머지 특성(HANGUL_CHARSET, VARIABLE_PITCH, FF_ROMAN)은 폰트 열거 함수로 미리 조사한 후 지정한 것이다. 따라서 만약 궁서 폰트가 설치되어 있지 않은 시스템에서 이 예제가 실행되더라도 최소한 한글 문자셋의 가변 폰트, Roman 패밀리의 가장 비슷한 폰트가 선택된다. 폰트를 좀 더 정확하게 선택하려면 열거 중에 원하는 폰트를 검색한 후 생성하는 방법을 사용할 수도 있다. 폰트 열거 방법에 대해서는 EnumFontFamilies 함수를 참조하기 바란다.

예제 2

다음 예제는 nEscapement, nOrientation 인수로 기울어진 폰트를 만든다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	HFONT font, oldfont;
	char str[]="WinApi의 폰트 예제입니다.";

	switch(iMessage) {
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		// SetGraphicsMode(hdc,GM_ADVANCED);
		font=CreateFont(20,0,200,200,0,0,0,0,HANGEUL_CHARSET,3,2,1,
			VARIABLE_PITCH | FF_ROMAN,"궁서");
		oldfont=(HFONT)SelectObject(hdc,font);
		TextOut(hdc, 50,100,str,lstrlen(str));
		SelectObject(hdc,oldfont);
		DeleteObject(font);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

nEscapement와 nOrientation에 각각 200의 값을 줌으로써 20도 기울어진 문자열을 만들었다.

nOrientation은 개별 문자의 기울기를 지정할 수 있되 단 이 인수는 NT에서 GM_ADVANCED 확장 그래픽 모드일 때, 그리고 트루타입 폰트인 경우에만 사용할 수 있다. 다음 코드는 개별 문자들만 20도 기울어진 형태로 폰트를 생성하여 출력한다. SetGraphicsMode 함수로 확장 그래픽 모드로 설정하였다. 이 예에는 NT이상에서만 실행된다.

SetGraphicsMode(hdc,GM_ADVANCED);
font=CreateFont(20,0,0,200,0,0,0,0,HANGEUL_CHARSET,3,2,1,
	VARIABLE_PITCH | FF_ROMAN,"궁서");

예제 3

다음 예제는 폰트 출력의 또 다른 형식을 보여준다. 시스템이 지원하는 글자의 속성은 밑줄, 굵게, 기울임, 취소선 정도밖에 없지만 출력문에서 응용하기에 따라서는 다양한 모양의 폰트 출력을 할 수 있다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	HFONT font, oldfont;
	int i,j;
	char str[128];

	switch(iMessage) {
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		font=CreateFont(50,0,0,0,FW_BOLD,0,0,0,HANGEUL_CHARSET,3,2,1,
			VARIABLE_PITCH | FF_ROMAN,"궁서");
		oldfont=(HFONT)SelectObject(hdc,font);

		SetBkMode(hdc,TRANSPARENT);
		strcpy(str,"외곽선 문자");
		for (i=-1;i<=1;i++)
			for (j=-1;j<=1;j++)
				TextOut(hdc,50+i,50+j,str,strlen(str));
		SetTextColor(hdc,RGB(255,255,255));
		TextOut(hdc,50,50,str,strlen(str));

		strcpy(str,"그림자 문자");
		SetTextColor(hdc,RGB(192,192,192));
		TextOut(hdc,50+5,150+5,str,strlen(str));
		SetTextColor(hdc,RGB(0,0,0));
		TextOut(hdc,50,150,str,strlen(str));

		SelectObject(hdc,oldfont);
		DeleteObject(font);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

외곽선 문자는 상하좌우 8방향으로 출력을 먼저 한 후 가운데에 다른색으로 문자열을 한번 더 출력하면 되며 그림자 문자는 5픽셀 아래쪽에 옅은 문자열을 먼저 출력하고 그 위에 짙은 색으로 문자열을 한번 더 출력하면 된다. 이외에도 다양한 형태의 응용을 할 수 있다.

참고함수

CreateFontIndirect :LOGFONT 구조체로 폰트를 생성한다.

SelectObject, GetStockObject, EnumFontFamilies

플렛폼 95이상
참조  

written by http://www.winapi.co.kr