"窗口"依赖于逻辑坐标,可以是像素点、毫米或程序员想要的其他尺度。
"视口"依赖于设备坐标(像素点)
1. Windows都用下面两个公式将窗口坐标转换成视口坐标:
2.
3. SetMapMode
Windows定义了表1所列出的8种映射方式。
映 射 方 式 | 逻 辑 单 位 | X 轴 增 加 | Y 轴 增 加 | 毫 米 |
MM_TEXT | 像 素 点 | 右 | 下 | 与 设 备 有 关 |
MM_LOMETRIC | 0. 1mm | 右 | 上 | 0.1 |
MM_HIMETRIC | 0. 01mm | 右 | 上 | 0.01 |
MM_LOENGLISH | 0. 254mm | 右 | 上 | 0.254 |
MM_HIENGLISH | 0. 0254mm | 右 | 上 | 0.0254 |
MM_TWIPS | 0.0176mm | 右 | 上 | 0.0176 |
MM_ISOTROPIC | 任 意(x=y) | 可 选 | 可 选 | 可 设 |
MM_ANISOTROPIC | 任 意(x!=y) | 可 选 | 可 选 | 可 设 |
总结: 作图时在逻辑坐标上作图,然后映射到窗口坐标(视口)
常用函数:SetMapMode();设置映射模式 SetWindowExt()设置逻辑坐标范围 SetViewportExt();设置设备坐标范围 SetViewportOrg()设置设备坐标(视口)原点
举例:
CRect rc;
GetClientRect(rc);
int cx = rc.Width();
int cy = rc.Height();
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(1000, 1000);
pDC->SetViewportExt(cx, -cy);
pDC->SetViewportOrg(cx/2, cy/2);
pDC->Ellipse(-500, 500, 500, -500);
pDC->MoveTo(-500, 0);
pDC->LineTo(500, 0);
pDC->MoveTo(0, 500);
pDC->LineTo(0, -500);