使用mm作为单位画图有有关问题

使用mm作为单位画图有问题
关于使用CDC画图的问题:
我设置用0.1mm作为单位


void CCircleView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
{
pDC->SetMapMode( MM_LOMETRIC );
CView::OnPrepareDC(pDC, pInfo);
}


画一个7cm直径的正圆

void CCircleView::OnDraw(CDC* pDC)
{
CCircleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

pDC->Ellipse( 0,0,700,-700 );
}

但实际画出来的不是7cm,有误差3mm左右,为什么会这样

------解决方案--------------------
这个要转化一下,好像是1.44的比例,具体记不得了,就是像素与实际尺寸的转换!
还有一点,有时候如果显示器没有装驱动(注意是显示器的驱动),计算出来也是不准的
不过,你的显然没有转换造成的!
------解决方案--------------------
把MM_LOMETRIC换成MM_HIMETRIC,再把Ellipse( 0,0,700,-700 )换成Ellipse( 0,0,7000,-7000 ); 
看误差是否小一些
还有误差3mm你是怎么测出来的?
------解决方案--------------------
最近研究过SetMapMode里参数的问题.
MM_LOMETRIC是以0.1mm为单位的,MM_LOENGLISH为0.01inch为单位的.
当我把显示器分辨率调成最大时(1280*800)时,这些都是准确的.
但是当我把分辨率调成800*600时,就不准了.
应该只有当分辨率为最大时才准确.
有个函数
C/C++ code

int GetDeviceCaps(
  HDC hdc,     // handle to the device context
  int nIndex   // index of capability to query
);

------解决方案--------------------
float PixelPerPoint_Y()//求一个内部单位(0.1mm)等于多少个屏幕上的像素点(高度)
{
int rtn=1;
HWND hDesk=GetDesktopWindow();
HDC hdc=GetDC(hDesk);
rtn=GetDeviceCaps(hdc,LOGPIXELSY);
ReleaseDC(hDesk,hdc);
return (float)rtn/254.0f;
}
float PixelPerPoint_X()//求一个内部单位(0.1mm)等于多少个屏幕上的像素点(宽度)
{
int rtn=1;
HWND hDesk=GetDesktopWindow();
HDC hdc=GetDC(hDesk);
rtn=GetDeviceCaps(hdc,LOGPIXELSX);
ReleaseDC(hDesk,hdc);
return (float)rtn/254.0f;
}

楼主按比例量画图就可以了!
------解决方案--------------------
探讨
晕,从成熟软件里面找的东西,居然被质疑!

------解决方案--------------------
楼主如果有正确的代码,也贴出来,便于大家学习参考!只要代码正确,我给楼主加推荐!
------解决方案--------------------
探讨
呵呵,你的正确代码是?

------解决方案--------------------
shia,有些问题,得大家一起解决
------解决方案--------------------
只要你记录的数据是正确的,至于屏幕表现出来图形是否与实际的尺度单位一样,好像没有什么关系吧!
AutoCAD这种专业的绘图软件都没有去考虑这种事情。
------解决方案--------------------
1 屏幕上显示是否正确需要验证
------解决方案--------------------
在屏幕上想要取得精确的长度是很难的。
getdevicecap里貌似只有一个属性返回值是正确的物理度量值。
一切的一切都是相对的,逻辑的。windows有一个dpi值,你可以把他调成一个范围内的任意值。
但是在打印机上精确性会提高不少。