출력에 대해 다시 알아보자,
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 |