그 동안 X,Y 좌표로 이루어진 2차원 평면 공간에 이미지나 텍스트들을 출력해 왔습니다.
WIn API에서는 4가지의 좌표 공간을 제공합니다.
월드 공간(논리 좌표를 사용하는 큰 공간) -> 페이지 공간 (논리 좌표) -> 디바이스 공간 (물리 좌표) -> 물리 장치(프린터 등등)
페이지 공간과 디바이스 공간에 대해서는 이전 시간에 맵핑을 하였기 때문에 생략하도록 하고, 이번 시간에는 월드 공간에서 페이지 공간으로
맵핑을 하도록 하겠습니다.
월드 공간은 디폴트로 사용되어 지지 않으며, 그래픽 모드를 변경하여 사용합니다.
이전에 사용했던 페이지 공간에서 디바이스 공간으로의 맵핑 만 사용해도 원점의 이동으로 화면 이동을 쉽게 구현 할 수 있습니다.
다만, 월드 좌표를 변환하게 되면 페이지 공간 자체를 변경하여, 다양한 좌표 변환이 가능해집니다.
월드 공간 좌표를 변환하기 위한 함수는 아래와 같습니다.
SetGraphicsMode
: SetGraphicsMode 함수는 지정된 디바이스 컨텍스트(DC) 에 대한 그래픽 모드를 설정합니다.
int SetGraphicsMode( _In_ HDC hdc, _In_ int iMode ); |
매개 변수 | 의미 |
hdc | DC(device context) 의 핸들값입니다. |
iMode | 그래픽 모드 입니다. 이 매개 변수는 다음값 중 하나 일 수 있습니다. |
GM_COMPATIBLE의 경우 디폴트로 설정된 그래픽 모드입니다.
창 뷰포트는 기본적으로 지원하며, SetMapMode를 통해 맵핑 모드의 변환을 할 수 있습니다.
GM_ADVANCED 는 디폴트와 다른 고급 그래픽 모드이며, 응용 프로그램의 DC에 대해한 월드 좌표를 변경해야 할 경우 해당 모드로 설정해야만 합니다.
XFORM(structure)
: 월드 공간에서 페이지 공간으로의 변경 값을 지정하는 구조체 입니다.
typedef struct _XFORM { FLOAT eM11; FLOAT eM12; FLOAT eM21; FLOAT eM22; FLOAT eDx; FLOAT eDy; } XFORM, *PXFORM; |
매개 변수 | 의미 | |
운용 | 기능 | |
eM11 | scaling |
수평 스케일 구성 요소입니다. |
rotation | 회전 각도의 코사인 입니다. | |
reflection | 수평 반사의 구성 요소입니다. | |
eM12 | shear | 수평 비례 상수 값입니다. |
rotation | 회전 각도의 사인 값입니다. | |
eM21 | shear | 수직 비례 상수 값입니다. |
rotation | 회전 각도의 마이너스 사인값입니다. | |
eM22 | scaling | 수직 스케일의 구성 요소입니다. |
rotation | 회전 각도의 코사인 값입니다. | |
reflection | 수직 반사의 구성 요소 입니다. | |
eDx | 논리 단위로 수평 변환 요소입니다. | |
eDy | 논리 단위로 수직 변환 요소 입니다. | |
각 용도에 따른 운용과 의미 표는 아래와 같습니다. 자세한 내용은 https://msdn.microsoft.com/en-us/library/windows/desktop/dd145228(v=vs.85).aspx 위 링크를 참고해 주십시오. |
SetWorldTransform
: 지정된 DC(Device Context)를 월드 공간과 페이지 공간의 이차원 선형 변환을 설정합니다.
이 변환에는 scale , rotate , shear 또는 그래픽 출력을 변환하기 위해서 사용될 수 있습니다.
BOOL SetWorldTransform( _In_ HDC hdc, _In_ const XFORM *lpXform ); |
매개 변수 | 의미 |
hdc | DC(device context)의 핸들 값입니다. |
lpXform | 변환 데이터를 포함하는 XForms의 구조에 대한 포인터입니다. |
그럼 코드를 작성해보겠습니다. (블루로 테마를 바꾸어 봤습니다. :D)
[결과] |
해당 프로그램을 실행하면 , -100, -100 좌표부터 그렸던 사각형을 볼 수 있습니다.
이전에 사용했던 SetViewPortOrgEx 함수로도 충분히 구현 가능한 내용입니다.
단, 더블 버퍼링을 하지 않았기 때문에 화면 떨림 현상이 발생합니다.
다음은 조금 업그레이드 해서 더블 버퍼와 함께 비트맵 이미지를 띄우고 SetViewPortOrgEx 함수로
y 좌표만 -100 상태로 처음 디바이스 공간에서 시작하도록 코딩하였습니다.
( 더블 버퍼시에 유의 할 점은 해당 기능으로 맵핑을 하더라도 결국에 논리 좌표에 그리는 것이기 때문에
0.0 좌표부터 더블 버퍼를 하였을 경우 - 좌표로 맵핑으로 이동시에 이미지가 해당 부분만큼 다시 그려지는
현상이 있습니다. 이 점을 참고하여 어색한 현상이 연출되지 않도록 해야합니다.)
[결과] |
이제 그림도 출력하였으니 XFORM(structure)를 통한 월드 좌표 변경 기능을 조금 더 알아보겠습니다.
'프로그래밍 관련 > Win API' 카테고리의 다른 글
WIndows API - #11-2 그래픽 처리 - (알파 블랜딩) (2) | 2015.10.19 |
---|---|
WIndows API - #11-1 그래픽 처리 - (특정 색상 제거 , 크기 변경) (0) | 2015.10.19 |
WIndows API - #10-2 그래픽 처리 - (맵핑 - 원점 바꾸기) (2) | 2015.10.11 |
WIndows API - #10-1 그래픽 처리 - (맵핑 - 윈도우 좌표) (0) | 2015.10.10 |
WIndows API - #9-7 그래픽 처리 - (여러개의 DC 이미지 출력하기) (2) | 2015.10.09 |