이번에는 폰트에 대해서 실습을 해보자.
폰트도 페이나 브러시와 마찬가지로 gdi 오브젝트이다.
폰트를 만들기 위해서는 CreatePen 함수를 사용한다. 그런데 이 함수 원형은. 인수가 14개나 된다.
하지만 그중 쓰는건 거의 정해져있으니까 걱정할필요는 없다
포스팅하는 본인만 손가락이 아플 뿐 ...
HFONT CreateFont(int,int,int,int,int,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPCTSTR)
인수 | 내용 |
nHeight | 폰트의 높이를 논리적인 단위로 지정 값이0이면 디폴트값 |
nWidth | 폰트의 폭을 지정하되 이값이 0이면 nHeight에서 지정한 높이에 따라 폭을 자동으로 결정. |
nEscapement | 폰트의 각도를 0.1도 단위로 설정 |
nOrientation | 글자 한 자와 x축과의 각도를 지정한다. nEscapement는 전체의 문자열의 기울기를 지정하지만 이 인수는 개별 문자의 기울기 |
fnWeight | 폰트의 두께를 설정한다. |
fdwltalic | 기울임체, DWORD지만 True False 사용가능 |
fdwUnderline | 밑 줄,DWORD지만 True False 사용가능 |
fdwStrikeOut | 관통선,DWORD지만 True False 사용가능 |
fdwCharSet | 문자 코드와 문자의 대응관계를 정하는 문자셋 |
fdwOutputPrecision | 출력 정확도를 설정한다 |
fdwClipPrecision | 클리핑 정확도를 설정한다 |
fdwQuality | 논리적 폰트를 물리적 폰트에 얼마나 근접시킬 것인가 지정한다. |
fdwPitchAndFamily | 폰트의 피치와 그룹을 설정한다 |
lpszFace | 글꼴의 이름을 나타내는 문자열을 설정한다. |
많은 인자가 있찌만 이중 실질적으로 변경해 야 할 필요가 있는 인수는 문자의 크기를 지정하는 nHeight와 글꼴 모양을 지정하는
lpszFace정도이다. 나머지 인수는 디폴트나 폰트 열거툴로 조사한 정보를 사용하면 일단은 큰 무리 없이 사용 가능.
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){
HDC hdc;
PAINTSTRUCT ps;
HFONT hFont,saveFont;
TCHAR *str=TEXT("GFP입니다.");
switch(iMessage){
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
hFont=CreateFont(50,0,0,0,0,0,0,0,HANGEUL_CHARSET,0,0,0,VARIABLE_PITCH|FF_ROMAN,TEXT("궁서"));
saveFont=(HFONT)SelectObject(hdc,hFont);
TextOut(hdc,10,10,str,lstrlen(str));
DeleteObject(SelectObject(hdc,saveFont));
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}
그런데 저렇게 인수를 적어나가는건 상당히 헛갈리기도 한다.
그래서 저 인수를 하나로 묶어서[구조체로] 인자를 던져주는 방법이 있다.
함수명이 바뀌긴하는데 오히려 개인적으로는 이방법이 편하다.
이 함수의 인자는 LOGFNT구조체인데 폰트의 특을 다 정의하고 있기 때문에. 이 구조체에 값만 대입해서.
함수로 던져주면 된다.
한번 사용해보자.
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){
HDC hdc;
PAINTSTRUCT ps;
HFONT hFont,saveFont;
TCHAR *str=TEXT("GFP입니다.");
static LOGFONT lFont;
switch(iMessage){
case WM_CREATE:
lFont.lfHeight=50;
lFont.lfWidth=0;
lFont.lfEscapement=0;
lFont.lfOrientation=0;
lFont.lfWeight=0;
lFont.lfItalic=0;
lFont.lfUnderline=0;
lFont.lfStrikeOut=0;
lFont.lfCharSet=HANGEUL_CHARSET;
lFont.lfOutPrecision=0;
lFont.lfClipPrecision=0;
lFont.lfQuality=0;
lFont.lfPitchAndFamily=VARIABLE_PITCH|FF_ROMAN;
lstrcpy(lFont.lfFaceName,TEXT("궁서"));
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
hFont=CreateFontIndirect(&lFont);
saveFont=(HFONT)SelectObject(hdc,hFont);
TextOut(hdc,10,10,str,lstrlen(str));
DeleteObject(SelectObject(hdc,saveFont));
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}
이렇게 구조체를 사용하는게 개발할때 편할것이다.
결과는 위와 동일합니다.
참고로 CreatePenIndirect,CreateBrushIndirect 등의 함수도 있다.
'Computer > Win API' 카테고리의 다른 글
WinApi 컨트롤 (0) | 2010.07.23 |
---|---|
WinApi 그래픽 [TEXT COLOR] (0) | 2010.07.23 |
WinApi 그래픽 [비트맵 bitmap] (0) | 2010.07.22 |
WinApi RopMode2 [확장] (0) | 2010.07.22 |
WinApi 그래픽 [DrawMode] (1) | 2010.07.22 |