그래픽 출력
COLORREF SetPixel(hdc, nXPos, nYPos, clrref)
DWORD MoveToEx(hdc, x, y, lpPoint)
BOOL LineTo(hdc, xEnd, yEnd)
BOOL Rectangle(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect)
BOOL Ellipse(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect)
보다시피 모든 GDI 함수의 첫번째 인수는 DC 핸들인 hdc이므로 TextOut 함수와 마찬가지로 DC핸들부터 얻어야 그래픽을 출력할 수 있다. DC의 개념만 알고 있다면 함수의 이름 자체가 아주 설명적이거나 도스와 동일하므로 직관적으로 이해할 수 있을 것이다. 우선 SetPixel 함수는 화면에 점을 출력하는데 (nXPos, nYPos) 좌표에 clrref 색상으로 점을 출력한다. 점은 가장 기본적인 그래픽 요소이지만 점만으로 표현할 수 있는 것이 거의 없어 윈도우즈 환경에서는 거의 사용되지 않는다.
선을 그을 때는 MoveToEx 함수와 LineTo 함수를 같이 사용해야 한다. GDI는 텍스트 모드의 커서에 해당하는 CP를 항상 유지하는데 LineTo 함수는 CP에서부터 지정한 좌표까지 선을 그으며 CP를 끝점으로 이동시켜준다. 그래서 LineTo를 연속적으로 호출하면 계속 이어지는 선을 그을 수 있다. MoveToEx는 CP를 지정한 좌표 (x,y)로 이동시켜 주며 이동전의 CP 좌표를 lpPoint에 대입해 주는데 이전 CP값이 필요치 않은 경우 lpPoint에 NULL을 넘겨주면 된다.
(A,B) - (C,D)까지 선을 긋고 싶다면 다음과 같이 두 함수를 연속적으로 호출해 준다.
MoveToEx(hdc, A, B, NULL);
LineTo(hdc, C, D);
MoveToEx 함수로 CP를 (A,B) 좌표로 이동시킨 후 LineTo 함수를 호출하면 현재 좌표인 (A,B)에서 LineTo 함수의 인수로 전달된 (C,D) 좌표로 선이 그어진다.
Rectangle 함수와 Ellipse 함수는 둘 다 인수가 동일하다. Rectangle 함수는 지정한 두 점 (Left, Top)과 (Right, Bottom)을 대각선으로 하는 사각형을 그리는데 도스에서와는 달리 사각형의 내부를 채운다는 점만 주의하도록 하자. Ellipse 함수는 지정한 사각형에 내접하는 타원을 그린다.
이 함수들을 테스트해보기 위해 GraphOut 프로젝트를 만들고 GraphOut.cpp를 만든다. 만드는 방법은 앞에서 설명한 방법과 동일하다. 새 프로젝트를 만들고 First.cpp의 소스를 복사한 후 WndProc만 변경해 주면 된다. 앞으로 예제를 만들 때 특별하지 않는 한은 만드는 방법에 대한 설명은 생략하도록 한다. GraphOut.cpp의 WM_PAINT 메시지 처리 부분을 다음과 같이 작성한다. 소스는 다음과 같다.
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
MoveToEx(hdc,150,150,NULL);
LineTo(hdc,180,200);
Rectangle(hdc,200,100,250,180);
Ellipse(hdc,200,200,250,280);
EndPaint(hWnd,&ps);
return 0;
BeginPaint 함수를 호출하여 DC 핸들을 먼저 얻은 후 그래픽 출력 함수들을 연속적으로 호출하였다. MoveToEx와 LineTo 함수로 선을 그었고 Rectangle 함수와 Ellipse 함수로 사각형과 타원을 각각 그려 보았다. 출력 결과는 다음과 같다.
DC의 개념만 이해되면 그래픽 출력은 아주 쉬운편에 속하므로 더 이상의 설명은 생략하도록 한다. 그래픽에 대한 좀 더 자세한 설명은 6장에서 다루는데 그려지는 선의 색상과 굵기, 채워지는 면의 무늬 등을 바꾸는 방법에 대해서도 알아볼 것이다.
written by http://www.winapi.co.kr
'WORK > Sotfware' 카테고리의 다른 글
EQU (0) | 2009.04.28 |
---|---|
컴퓨터에서 시간을 가져오기 (BCB) (0) | 2009.04.17 |
변수 명명법 (0) | 2008.11.26 |
pragma에 관한 사용법 정리 (0) | 2008.10.31 |
C++Builder extensions to C++ (0) | 2008.10.31 |
댓글