아래 코드의 의미를 정확히 모르겠어요.
setwindowExtEx(canvas.handle, 500, 500, nil);
setviewportExtEx(cnavas.handle, ClientWidth, Clientheight, nil);
책에서는
이렇게 되면 폼의 클라이언트 영역의 좌표계는 클라이언트 영역의 실제 픽셀 단위 크기에 상관없이 500*500이 된다. 즉, 폼의 크기를 변경하더라도 우측 최하단은 항상 (499,499)이다.
라고 이야기하는데 통 이해가 잘 안돼네요.
책에서 말하는 최하단 좌표라는게 윈도우 좌표가 그렇다는 건가요? 아니면 뷰포트의 좌표가 그렇다는 건가요?
제가 알기로는 두 함수는 논리 좌표와 장치 좌표간의 축척 비율을 결정하기 위해서 하용하는 걸로 이해하는데요 저 두 함수가 클라이언트 영역의 크기도 결정하게 되나요??
그리고 x,y축 증가 방향도 이 함수를 사용해서 결정하는 것 같은데 어떻게 하는 건지요?
만일 두 함수중 하나만 사용할 경우는 어떻게 되나요?
그리고 모든 매핑 모드의 기본 원점은 (0,0)인가요?
누구 리풀좀 부탁해요....
디바이스좌표계와 논리좌표계만 이해하신다면 되겠네요...
디바이스좌표계는 우리가 흔히 쓰는 좌표계입니다. 대부분 Pixel단위를 쓰죠.모니터 해상도와 같은...
이 디바이스 좌표계는 말 그대로 디바이스(해상도)에 민감합니다.
예를 들어 100, 100에 점을 찍는다면 1024x768에서 찍을 때와 640x480에서 찍을 때 우리 눈에 보이는 위치가 틀려지죠...
반면에 논리 좌표계는 Pixel단위가 아니라 Inch나 mm같은 논리적인 단위를 써서 디바이스(해상도)가 다르다고 해도 똑같은 위치에 찍히죠...
참고로 윈도우에서 쓰이는 좌표계는 수학에서 쓰이는 좌표계와 달리 한계가 있습니다. 수학에서 쓰이는 좌표계처럼 무한한 축값을 가지기에는 메모리가 부족하기 때문이죠... 때문에 좌표축의 크기를 정해야 하는데 이때 쓰이는 함수가 예제에서처럼 Ext가 붙은 함수들이죠...
ViewPort는 디바이스 좌표계와 관련이 있습니다.
예제에서 처럼 클라이언트 영역으로 좌표축의 한계를 정하는 거구요...
Window는 논리 좌표계와 관련이 있습니다.
예제에서는 500으로 정했네요...
즉, ClientWidth를 논리적으로 500으로 나누어서 쓰겠다는 이야기입니다.
(ClientWidth, ClientHeight) = (500, 500)
(ClientWidth/2, ClientHeight/2) = (250, 250)
이런식으로 매칭이 되는거죠...
아래에서 말하는 499, 499는 픽셀을 다루는 디바이스 좌표가 아니라 논리좌표입니다. 디바이스 좌표는 폼의 클라이언트 영역의 크기에 따라서 달라지겠죠...
님께서 어렵게 생각하는 부분이 이것일겁니다. 우리가 일상적으로 쓰이는 좌표게는 디바이스 좌표계이니까요...
모든 좌표계의 원점은 기본적으로 (0, 0)이구요. SetViewPortOrgEx, SetWindowOrgEx를 이용해서 원점을 바꿀 수가 있습니다.
X, Y축 증가 방향은 Mapping Mode와 관계가 있습니다. SetMapMode로 변경가능하구요... 우리가 수학에 쓰이는 좌표계처럼 위로 올라갈수록 Y값이 증가되도록 이 함수를 이용해서 바꿀 수도 있습니다. 기본적으로 MM_TEXT로 아래로 내려갈수록 Y값이 증가합니다.
^^ 항상 즐코하세요...