Develop
2013.04.23 14:51

[c] 윈도우 API Viewport와 Window

Views 5958 Votes 0 Comment 0
Atachment
Attachment '1'
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
디바이스 좌표를 가지고 있는 어떤 좌표 평면의 영역이을 Viewport라고 하고 로직좌표를 가지고 있는 어떤 좌표 평면을 Window라고 한다.
이런 개념을 쓰는 이유는 좌표 평면의 정보를 수정하고자 할경우가 있기 때문이다.
그림의 (a)처럼  MM_TEXT에서는 좌측 상단 이 (0,0)의 초기점이다. 이때 때로는 화면 영역의 중앙이 (0,0)으로 하고자 할경우가 있다 그림의 (b)처럼 말이다. 이럴 경우 SetWindowOrgEx라는 함수를 사용하여 이동시킬수 있다.

viewport.gif

BOOL SetWindowOrgEx(
    HDC hdc, // 디바이스 컨텍스 핸들
    int X, // 이동 X좌표
    int Y, // 이동 Y좌표
    LPPOINT lpPoint // 이전 좌표
);

예를 들어 화면의 현재 전체 영역이 (400,400)이라고 가정을 하고 (b)같은 좌표로 전환하고자 할 경우 다음과 같이 할수 있다.

SetWindowOrgEx(hdc,200,200,NULL);

SetWindowOrg라는 함수는 로직 좌표계에서 초기 좌표를 이동하는 함수이다.
전항목에서 좌표계를 디바이스 좌표계와 로직좌표계 두 개를 사용한다고 하였습니다.
SetWindowOrg함수에 의해서 로직 좌표계의 좌표원점이 이동하였다하여도 디바이스 좌표계의 원점이 이동되는 것은 아닙니다.
다바이스 좌표계의 원점을 이동하고자 한다면 SetViewportOrgEx라는 함수를 사용한다.

BOOL SetViewportOrgEx(
    HDC hdc, // 디바이스 컨텍스 핸들
    int X, // 이동 X좌표
    int Y, // 이동 Y좌표
    LPPOINT lpPoint // 이전 좌표
);

MM_LOMETRIC 로 맵핑모드를 설정하고 로직좌표와 디바이스좌표 중앙에 원점을 설정하고자 한다면 다음과 같은 형식이 될것이다.

1) 클라이언트 전체 영역을 얻는다.
   GetClientRect(hwnd,&rect)
    
2) rect좌표는 dc와 상관되는 좌표가 아닙니다. 이좌표는 디바이스 좌표이다.
   디바이스좌표를 이용하여 원점을 이동하는 함수가 SetViewportOrg이므로
SetViewportOrgEx(hdc,rect.right/2,rect.bottom/2,NULL);

3) 이제 rect를 로직좌표로 전환을 하고 로직좌표계의 원점을 이동한다.
DPtoLP(hdc,(PPOINT)&rect,2);
SetWindowOrgEx(hdc,rec,right/2,rect.bottom/2,NULL);

좌표를 리턴하는 함수들중에 디바이스 좌표만 리턴하는 경우의 함수들이 있다.
위의 예에서 보듯이 GetClientRect함수는 dc에서 얻는 함수가 아니기 때문에 디바이스 좌표를 리턴한다.
이외에 GetDeviceCaps라는 함수는 DC를 이용하지만 로직좌표계가 아닌 디바이스좌표를 리턴한다.
프로그래밍 할 경우 특정 맵핑모드를 선언하였을 경우 함수가 디바이스좌표를 리턴하는가? 또는 로직좌표를 리턴하는가에 대해서 주의를 해주어야 한다.
좌표평면 정보를 수정할 경우 어떤 좌표평면을 수정할것인가를 알려주어야 하기 때문에 디바이스 좌표평면을 보통 Viewport라고하며 로직좌표 평면을 Window라고 한다.

?

List of Articles
No. Category Subject Author Date Views
181 Develop [c++] 소켓 프로그래밍 관련 링크.. (퍼올려고 올린거) hooni 2013.04.23 7029
180 Develop [c++] 바탕화면 테두리에 자석처럼 붙는 스냅효과.. file hooni 2013.04.23 8904
179 Develop [c++] 문자열 뒤집기(문자열 거꾸로 출력) hooni 2013.04.23 17287
178 Develop [c++] 마방진 소스코드 file hooni 2013.04.23 9558
177 Develop [c++] 링크리스트(linked list) 클래스(스택,큐) file hooni 2003.04.23 9553
176 Develop [c++] 레지스트리 편집하는 부분..ㅡㅡ; file hooni 2013.04.23 8275
175 Develop [c++] 레지스트리 등록 예제 1 file hooni 2013.04.23 8789
174 Develop [c++] 디렉토리 내의 파일 찾기 FindFirstFile() 함수 6 hooni 2013.04.23 20574
173 Develop [c++] 데이터 압축 프로그램 소스 (lzw) file hooni 2013.04.23 9935
172 Develop [c++] 더블 링크리스트(linked list) 학습용 초간단 단어장 file hooni 2003.04.23 9323
171 Develop [c++] 기초강좌 #04(클래스) hooni 2003.04.23 11834
170 Develop [c++] 기초강좌 #03(함수의 매개변수 전달) hooni 2003.04.23 12084
169 Develop [c++] 기초강좌 #02(레퍼런스,메모리할당) hooni 2003.04.23 11430
168 Develop [c++] 기초강좌 #01(입출력,영역지정) hooni 2003.04.23 11408
167 Develop [c++] 가짜 인증서(하나은행) 프로그램 file hooni 2013.04.23 10754
166 Develop [c++] winsock을 이용한 서버,클라이언트와 ssl서버,클라이언트 file hooni 2013.04.23 7612
Board Pagination Prev 1 ... 61 62 63 64 65 ... 74 Next
/ 74