U E D R , A S I H C RSS

MFC/Scaling Mode

{{| |}}

1. ScalableMappingMode

논리 좌표와 장치 좌표간의 매핑을 변경할 수 있는 모두는 두가지가 존재한다.
MM_ISOTROPIC, MM_ANISOTROPIC
전자의 것은 x, y축에 대한 scale factor 를 동일하게, 후자는 각각 다르게 설정하는 것이 가능하다.

WindowOrigin 윈도우의 왼쪽 상당 논리 좌표. CDC::SetWindowOrg() 함수를 호출해서 설정
WindowExtent 논리 좌표 안에 지정되어 있는 윈도우의 크기. CDC::SetWindowExt()로 호출
ViewportOrigin 장치 좌표에 되어 있는 윈도우의 왼쪽 상단의 좌표. CDC::SetViewportOrg()로 호출
ViewportExtent 장치 좌표 단위의 윈도우의 크기. CDC::SetViewportExt()함수로 호출
뷰포트는 논리좌표가 장치좌표로 변환되는 파라메터의 역할을 한다.

2. LogicalCoordinate To DeviceCoordinate

~cpp xDevice = (xLogical - xWindowOrg) * (xViewPortExt / xWindowExt) + xViewportOrg
~cpp yDevice = (yLogical - yWindowOrg) * (yViewPortExt / yWindowExt) + yViewportOrg
좌표계가 MM_ISOTROPIC, MM_ANISOTROPIC 이외의 다른 것은 WindowExt, ViewPortExt 가 고정되어 변경이 불가능하다.
CDC::SetWindowExt(), SetViewportExt()를 호출해도 아무런 변화가 생기지 않는다.

3. 확대 기능시의 CScrollView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)

~cpp 
// TODO: 확대 기능의 구현을 위해서 뷰포트의 범위를 변경한다.
CPainterDC* pDoc = GetDocument();
pDC->SetMapMode(MM_ANISOTROPIC);		// map mode 설정
CSize DocSize = pDoc->GetDocSize();

// MM_LOENGLISH 모드를 원하기 때문에 y의 범위는 음수가 되어야 한다.
DocSize.cy = -DocSize.cy;
pDoc->SetWindowExt(DocSize);		// 윈도우의 범위를 설정한다.

// 인치당 픽셀의 개수를 얻는다.
int xLogPixels = pDC->GetDeviceCaps(LOGPIXELSX);	// 인자에 해당하는 장치 정보를 리턴한다. 인치당 픽셀의 개수를 리턴. 100단위
int yLogPixels = pDC->GetDeviceCaps(LOGPIXELSY);

// x와 y에서의 뷰 포트 범위를 계싼한다.
int xExtent = DocSize.cx * m_Scale * xLogPixels / 100;
int yExtent = DocSize.cy * m_Scale * yLogPixels / 100;

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:42
Processing time 0.0251 sec