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

API-GraphOut

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


출력에 대해 다시 알아보자,

API에서는 기본적으로 간단한 원이나, 네모, 직선에 대해서 제공하는 그리기 함수가 존재하는데,

소스 전체를 일일이 저장한다는게 좀 불필요 하긴 하지만,

추후에 편리함을 위해서 전부다 저장하도록 하자.

#include <windows.h>

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

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( WHITE_BRUSH );
	WndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
	WndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
	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_PAINT:
		hdc = BeginPaint( hWnd, &ps );
		SetPixel( hdc, 10, 10, RGB(255, 0, 0) );	// 단순히 점을 찍는다 RGB로
		MoveToEx( hdc, 50, 50, NULL );		// CP를 이동
		SetTextAlign( hdc, TA_UPDATECP );	// 텍스트를 cp로 설정
		TextOut( hdc, 0, 0, TEXT(" One " ), 5);
		LineTo( hdc, 300, 90 );		// CP에서 300, 90까지 선을 긋고 CP = 300, 90
		TextOut( hdc, 0, 0, TEXT(" Two " ), 5);
		LineTo( hdc, 500, 190 );	// 300, 90에서 500, 190으로 선을 긋는다.
		TextOut( hdc, 0, 0, TEXT(" Three " ), 7);
		Rectangle( hdc, 50, 100, 200, 180 );	// 네모 그리기
		Ellipse( hdc, 220, 100, 400, 200 );		// 원 그리기
		EndPaint( hWnd, &ps );
		return 0;
	}
	return( DefWindowProc( hWnd, iMessage, wParam, lParam));
}​


SetPixel은 지정한 포인트에 RGB의 점을 찍는 것이고,
Rectangle과 Ellipse 또한 시작점x,y와, 끝점의 x,y를 입력하면, 사각형과, 그 사각형을 내접하는 원을 그리게 된다.
하지만 원을 그리는 부분에서 x,y의 을 기준으로 반지름 만큼의 원을 그리고 싶다면,
Ellipse( hdc, x-r, y-r, x+r, y+r ); 처럼 응용해서 사용 할 수도 있다.
이 예제에서 주의할 점은 MoveToEx와 그 이후에 LineTo이다.
MoveToEx를 하게 되면 CP(윈도우 내부의 커서포인트)를 이동하게 된다.
그리고 LineTo는 Cp에서 LineTo의 x,y 까지 선을 긋는것이다.
그리고 그 선을 그은 후에 Cp를 LineTo의 x,y로 변경해 준다는 것!
즉 여러번의 LineTo를 통해 이어지는 선들이 만들어 지는 것이다.
SetTextAlign를 사용해서 문자를 TA_UPDATECP로 하는 것 또한, CP를 기준으로 문자열을 출력하는 것을 재확인 하기 위해서라고 볼 수 있다.

/출력 화면

 

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

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