Windows GDI 의 좌표계 (1)

5609 단어 windows
Windows GDI 의 좌표계 (1)
By leezy_2000
2003-10-21 16:13
만약 GDI 로 텍스트, 비트 맵 을 출력 하거나 직선, 곡선 과 같은 도형 을 그 렸 다 면 좌표 계 를 사용 한 적 이 있 을 것 이다.화면 해상 도 는 96dpi (dot per inch) 이 고 프린터 해상 도 는 보통 600 dpi 입 니 다.
MoveTo(hDC,100,100);
LineTo(hDC,1300,1300);
둘 위 에 똑 같은 두 선 이 생 성 될 수 있 습 니 다.실현 원리 에 있어 좌 표 는 그 중에서 결정적 인 역할 을 하고 있다.
1. GDI 좌표계 가 무엇 입 니까?
먼저 수학의 관점 에서 볼 때 GDI 좌 표 는 2 차원 피리 칼 좌표계 로 두 축 과 원점 을 통 해 평면 상의 어느 한 점 의 위 치 를 확정 할 수 있다.
사용 의 측면 에서 볼 때 GDI 좌 표 는 변환 규칙 으로 당신 이 제정 한 논리 데 이 터 를 최종 장치 구동 에 사용 할 수 있 는 데이터 로 변환 합 니 다.예 를 들 어 (100, 100) 이라는 점 은 실제 변 화 를 거 쳐 96dpi 화면 에 서 는 (9.6, 9.6) 일 수 있 고 600 dpi 프린터 에 서 는 (60, 60) 일 수 있다.(주 1)
GDI 좌 표 는 4 층 좌표 공간 으로 구성 되 고 (주 2) 차원 의 높 고 낮 음 에 따라 다음 과 같다.
세계 좌표 공간 (World - space): affine 변환 을 지원 하고 아래 에 말 한 페이지 좌표 공간 에 적용 하 며 NT 류 운영 체제 에서 만 지원 합 니 다.
페이지 좌표 공간 (Page - space): 미리 정 의 된 맵 모드 를 지원 하 며 반드시 사용 되 는 좌표 공간 입 니 다.원점 과 상응하는 크기 조정 비율의 설정 은 페이지 좌표 공간 에서 설정 하기에 적합 하 다.
세계 좌표 공간 과 페이지 좌표 공간 을 논리 좌표 공간 이 라 고 통칭 하 며 GDI 사용자 가 직접 사용 할 수 있 는 좌표 공간 이다.즉, GDI 출력 을 할 때 지정 한 위치, 크기 등 정 보 는 논리 적 좌표 공간 에 대한 데이터 일 수 밖 에 없다.
장치 좌표 공간 (Device - space): 장치 컨 텍스트 와 연 결 된 장치 공간 입 니 다.물리 장치 의 작은 조각 이나 전체 물리 장 치 를 나 타 낼 수 있다.각종 GDI 출력 은 장치 상하 문 을 대상 으로 하기 때문에 논리 좌표 공간의 관련 데이터 도 자연히 장치 좌표 공간의 데이터 로 바 뀌 어야 한다.
물리 장치 좌표 공간 (Physical - Device Space): 도형 장치 의 물리 표면의 부분 또는 전부.그래 픽 드라이버 가 사용 하 는 좌표 공간 이다.모든 GDI 출력 이 최종 적 으로 모니터 나 프린터 에서 모양 을 이 루 려 면 관련 드라이버 를 거 쳐 장치 좌표 공간 에서 물리 장치 좌표 공간 으로 전환 하 는 것 은 필연 적 인 일이 다.이 과정 은 완전히 시스템 에 의 해 완성 된다.그래서 DC 의 원점 과 크기 정 보 는 읽 기만 한다.(표현 편 의 를 위해 장치 컨 텍스트 를 DC 로 표시 합 니 다)
2. 출력 위 치 는 도대체 어디 에 있 습 니까?
상기 설명 을 통 해 알 수 있 듯 이 최종 출력 위치 에 대한 확정 은 적어도 두 번 의 변 화 를 거 쳐 야 합 니 다. (만약 에 세계 좌표 공간 을 사용 했다 면 그것 은 3 번 입 니 다) 어떤 논리 점 이 최종 적 으로 그 물리 적 위치 에 대응 하 는 지 직접 확인 할 수 있 는 방법 이 있 습 니까?이미 만들어 진 것 이 없 으 면 우리 가 스스로 하 나 를 실현 하 는 것 도 사실 복잡 하지 않다.먼저 논리 좌 표를 장치 좌표 로 바 꿔 야 한다. 이 과정 은 affine 매트릭스 와 현재 맵 모드 에 따라 많은 연산 을 해 야 한다. 그러나 우 리 는 지금 스스로 이런 연산 을 하지 않 고 사용 해 야 한다.
BOOL LPtoDP( 
HDC hdc, // handle to device context
 LPPOINT lpPoints, // array of points
 int nCount // count of points in array

);
이 함 수 는 lpPoints 의 논리 좌 표를 hdc 와 연 결 된 장치 좌표 로 변환 하 는 것 을 책임 집 니 다.(잠시 후에 우 리 는 스스로 이 함 수 를 완성 할 것 이다).
장치 좌표 와 물리 장치 좌표 의 단 위 는 일치 하고 모두 물리 장치 점 이기 때문이다.따라서 장치 좌표 에서 물리 장치 좌표 로 전환 하 는 것 은 그리 번 거 롭 지 않 습 니 다. DC 의 원점 만 알 면 됩 니 다. (이곳 의 원점 은 장치 좌표 공간의 원점 이 물리 장치 좌표 공간 에 있 는 위 치 를 말 합 니 다)이 작업 의 본질은 OS 의 DC 구 조 를 읽 는 것 입 니 다. 사용 합 니 다.
BOOL GetDCOrgEx(
 HDC hdc, // handle to a DC
 LPPOINT lpPoint // translation origin
);

이 임 무 를 완수 하 겠 습 니 다.
이렇게 되면 임의의 논리 점 logicalPoint 에 대해 DC 원점 은 dcorgPoint 입 니 다.

physicaldevice Point 는 logicalPoint 이론 적 으로 물리 장치 좌표 공간 에서 의 위치 이다.여기 서 설명 해 야 할 것 은 물리 장치 의 좌표 공간 이 반드시 도형 장치 의 전체 물리 표면 을 포함 하 는 것 이 아니 기 때문에 physicaldevice Point 에서 계산 한 위 치 는 반드시 물리 표면의 위치 가 아니다.예 를 들 어 인쇄 할 때 4 주 동안 인쇄 할 수 없 는 영역 을 더 해 야 실제 위치 가 된다.또한 모니터 와 같은 장 치 는 물리 장치 자체 의 크기 를 고려 해 야 한다. 만약 에 (즉, 모니터 아래 의 단 추 를 사용 하지 않 았 다 는 것) 없 으 면 우리 가 계산 한 사이즈 의 공통점 이 화면 에 있 는 위치 가 잘 맞 는 것 을 발견 할 수 있 을 것 이다.
void GetPhysicalPosition (HDC hDC, LPPOINT lpPoint, int nCount) 은 상기 기능 을 완성 하 는 데 사 용 됩 니 다.구체 적 실현 은 원본 코드 1 참조.

좋은 웹페이지 즐겨찾기