3-2-나. DrawText

TextOut는 너무 단순하다. 이보다 조금 더 복잡한(=기능이 많은) 문자열 출력 함수로 DrawText라는 함수가 있다.

int DrawText( HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat );

이 함수는 사각영역을 정의하여 영역안에 문자열을 출력할 수 있으며 여러가지 포멧을 설정할 수 있는 기능이 있다. 윈도우즈에서 사각영역을 정의할 때는 RECT구조체를 사용하며 다음과 같이 정의되어 있다.

typedef struct _RECT {    // rc  
    LONG left; 
    LONG top; 
    LONG right; 
    LONG bottom; 
} RECT; 

DrawText의 4번째 인수는 이 구조체의 포인터이며 문자열이 출력될 사각 영역을 지정한다. 첫번째 인수는 물론 hdc이며 두번째 인수가 출력할 문자열, 세번째 인수는 출력할 문자열의 길이이되 이 값이 -1이면 널 종료 문자열로 간주한다. 다섯 번째 인수 uFormat은 DrawText 함수가 문자열을 출력할 방법을 지정하는 플레그이다.

설명
DT_LEFT 수평 왼쪽 정렬한다.
DT_RIGHT 수평 오른쪽 정렬한다.
DT_CENTER 수평 중앙 정렬한다.
DT_BOTTOM 사각 영역의 바닥에 문자열을 출력한다.
DT_VCENTER 사각 영역의 수직 중앙에 문자열을 출력한다.
DT_WORDBREAK 사각영역의 오른쪽 끝에서 자동 개행되도록 한다.
DT_SINGLELINE 한줄로 출력한다.
DT_NOCLIP 사각 영역의 경계를 벗어나도 문자열을 자르지 않고 그대로 출력한다.

WM_PAINT의 코드를 다음과 같이 바꾸어 보자.

long FAR PASCAL WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rt={100,100,400,300};
	char str[]="님은 갔습니다. 아아 사랑하는 나의 님은 갔습니다. 푸른 산빛을 "
		"깨치고 단풍나무 숲을 향하여 난 작은 길을 걸어서 차마 떨치고 갔습니다."
		"황금의 꽃같이 굳고 빛나던 옛 맹세는 차디찬 티끌이 되어 한숨의 미풍에"
		"날아갔습니다.";
	switch(iMessage) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd,&ps);
		DrawText(hdc,str,-1,&rt,DT_CENTER | DT_WORDBREAK);
		EndPaint(hWnd,&ps);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

사각역역 rt를 (100,100)-(400,300)으로 정의하고 출력할 문자열 str에 긴 문자열을 대입해 두었다. 그리고 이 문자열의 끝까지 중앙 정렬 및 자동개행 플레그를 주어 출력하였다. 실행 결과는 다음과 같다.

지정한 사각영역안에 문자열이 자동 개행되며 여러줄로 출력되었다. 포멧을 바꾸어 가며 다양하게 실습해 보기 바란다.


목록 보기  다음 강좌            written by http://www.winapi.co.kr