본문 바로가기
프로그래밍/API

API-TextOut

by 리뷰하는 (게임)프로그래머_리프TV 2010. 4. 19.


아직도........... 3개나 더남았네 ㅋㅋ 슈디두바 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

다 끝나면 씻고 자야겠구만 ㅋㅋㅋ





Window창에 Text를 출력해 보자.

#include <windows.h>
#include <string>
#include <string.h>

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("TextOut");

// 문자열 출력을 위한 나만의 함수
void MyTextOut( HDC hdc, int x, int y, LPCTSTR Text )
{
	TextOut( hdc, x, y, Text, lstrlen( Text ) );
}

int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
					 LPSTR lpszCmdParam, int nCmdShow )
{
	HWND hWnd;
	MSG Message;
	WNDCLASS WndClass;
	g_hInst = hInstance;

	WndClass.cbClsExtra = 0;
	WndClass.cbWndExtra = 0;
	WndClass.hbrBackground = (HBRUSH)GetStockObject( COLOR_WINDOW+1 );
	WndClass.hCursor = LoadCursor( NULL, IDC_NO );
	WndClass.hIcon = LoadIcon( NULL, IDI_ERROR );
	WndClass.hInstance = hInstance;
	WndClass.lpfnWndProc = WndProc;
	WndClass.lpszClassName = lpszClass;
	WndClass.lpszMenuName = NULL;
	WndClass.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass( &WndClass );

	hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, (HMENU)NULL, hInstance, NULL );
	ShowWindow( hWnd, nCmdShow );

	while( GetMessage( &Message, NULL, 0, 0 ) )
	{
		TranslateMessage( &Message );
		DispatchMessage( &Message );
	}
	return (int)Message.wParam;
}

LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
	HDC hdc;
	PAINTSTRUCT ps;

	switch( iMessage )
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	//case WM_LBUTTONDOWN:		// 화면이 가리면 내용이 지워진다.
	//	hdc = GetDC(hWnd);
	//	TextOut(hdc, 100, 100, TEXT("Beautiful Korea"),15);
	//	ReleaseDC( hWnd, hdc );
	//	return 0;
	case WM_PAINT:		// 화면에 꾸준히 등장
		TCHAR* str = TEXT("Beautiful Korea");	// 추가적인 변수를 사용
		TCHAR str2[128];	// 문자열 배열을 사용
		int score = 85;		// int형 배열
		hdc = BeginPaint(hWnd, &ps);
//		TextOut(hdc, 100, 100, TEXT("Beautiful Korea"),15);		// 번거롭다.
//		TextOut(hdc, 100, 100, str,lstrlen(str));	// 문자열의 길이와 출력을 하고 있다.
		// 하지만 이것조차 번거롭다면, 함수를 만들면 된다.
		MyTextOut( hdc, 100, 100, str );	// str만을 보내줌으로써 불편함을 해결 했다.
		// 문자열에 대한 정렬
		SetTextAlign( hdc, TA_CENTER );	// 좌표의 기준은 문자열의 중앙으로 본다.
		MyTextOut( hdc, 100, 150, str );	// Y축만 바꿨지만 x축의 기준이 다르기 때문에 서로 위치는 직선이 아니다.
		MyTextOut( hdc, 100, 200, str );
		
		SetTextAlign( hdc, TA_UPDATECP );	// 문자열을 연달아 쓰고 싶을 때
		MyTextOut( hdc, 100, 500, str );	// x, y의 위치는 중요치 않다. 초기 cp = 0, 0 부터
		MyTextOut( hdc, 100, 200, str );	// 위의 문자열의 바로 다음 부터, 삽입

		SetTextAlign( hdc, TA_TOP | TA_LEFT );	// 설정해 주지 않았을때 디폴트 값
		// wsprintf 를 사용하여 str2에 문자열을 삽입하고 있다.
		wsprintf( str2, TEXT("현재 점수는 %d점입니다."), score );
		MyTextOut( hdc, 400, 400, str2 );

		EndPaint(hWnd, &ps);
		return 0;
	}
	return( DefWindowProc( hWnd, iMessage, wParam, lParam));
}​



소스를 전부 올리긴 했지만, 창띄우는 기본적인것을 제외하고, Text에 대해서만 보자.
먼저 전역으로 선언되어있는 MyTextOut에 대해서는 잠시 미뤄두고,
WndProc에 지역변수로 hdc와,
ps를 각각 선언해 주었는데,
hdc = DC에 대한 핸들이라고 보면 될거 같다.

DC란, Device Context의 약자로,
문자열의 폰트, 선의 색상, 굵기, 채움 무늬와 색상, 그리디 모드 등등 출력에 필요한 정보들을 가지고 있다고 보면된다.
실제로 LBUTTONDOWN에서 보면,
GetDC를 사용해서 hWnd에서 DC를 받아오는 것을 볼 수 있고,
마찬가지로 PAINT에서도,
BeginPaint에서 dc를 가져 오는 것을 볼 수 있다.

BeginPaint를 보면 hWnd를 보내주고, &ps를 하는걸 알 수 있는데,
그때 ps에 paint에 필요한 정보가 삽입 된다고 보면 된다.

그리고 추가적으로 GetDC - ReleaseDC 는 각각 DC를 받고, DC를 지우는 역활을 한다고 볼 수 있다.
PAINT에 있는 BeginPaint - EndPaint도 같은 의미이다.
단, GetDC - EndPaint 처럼은 짝지을 수 없다는 것을 기억하자.

TextOut은 그렇게 어려운 함수는 아니다. TextOut(hdc, 100, 100, TEXT("Beautiful Korea"),15);
hdc을 보내고, 시작x, 시작y, 문자열, 문자열의 길이가 저장되는데,
문자열을 보내주기 위해선 TEXT()안에 넣어야 한다는 것을 주의하자.
변수 또한 TCHAR, TCHAR *를 사용해서 값을 넣고 있는 것을 볼 수 있다.
또한 strlen이 아닌 lstrlen을 사용해야 하고,
wsprintf를 사용해서 문자열을 변수에 넣어 주는 것을 확인 할 수 있다.

SetTextAlign는 문자열에 대한 기준(정렬)을 해주는 것인데, 시작점을 Center로 할 것인가. TA_TOP | TA_LEFT로 할것인가, 또는 다른 무엇인가로 할 것인가에 대해 설정해 줄 수 있다.
그 외 내용은 모두 소스 주석에 삽입 시켜 놓았다.
cp대해서 언급하고 있지만, 단순히 내부에서 가지고 있는 일종의 커서 정도로 생각하면 될것 같다.
출력 결과

'프로그래밍 > API' 카테고리의 다른 글

API-Key입력(1)  (0) 2010.04.21
API-MessageBox  (0) 2010.04.19
API-GraphOut  (0) 2010.04.19
API-DrawText  (0) 2010.04.19
API-창만들기  (0) 2010.04.19