这个问题应该用映射模式来解决,在 VC++ 中由于 Document/View 框架的原因比较常用,
Delphi 中相对就用得少了,下面是一个典型的 VC++ 设置映射模式的例子,当应用程序每次
绘图的时候,都要调用 OnPrepareDC 函数来定位逻辑坐标,比如:
void CSGEView::OnLButtonDown(UINT nFlags, CPoint point)
{
CClientDC dc(this);
OnPrepareDC(&dc);
dc.DPtoLP(&point); // 设备坐标到逻辑坐标转换
...
}
void CSGEView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: Add your specialized code here and/or call the base class
CSGEDoc* pDoc = GetDocument();
CScrollView::OnPrepareDC(pDC, pInfo);
pDC->SetMapMode(MM_ANISOTROPIC);
CSize sizeDoc = pDoc->GetDocSize();
sizeDoc.cy = -sizeDoc.cy;
pDC->SetWindowExt(sizeDoc);
CSize sizeNum, sizeDenom;
pDoc->GetZoomFactor(&sizeNum, &sizeDenom);
int xLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSX);
int yLogPixPerInch = pDC->GetDeviceCaps(LOGPIXELSY);
long xExt = (long)sizeDoc.cx * xLogPixPerInch * sizeNum.cx;
xExt /= 100 * (long)sizeDenom.cx;
long yExt = (long)sizeDoc.cy * yLogPixPerInch * sizeNum.cy;
yExt /= 100 * (long)sizeDenom.cy;
pDC->SetViewportExt((int)xExt, (int)-yExt);
}
你可以把你的坐标放大,当作逻辑坐标,正确地设置了映射模式之后,对逻辑坐标的 GDI
操作会自动转换到设备坐标。但是在你的要求中,10 位的精度未免太高了。
大致的方法就这些,希望对你能有所帮助。