我画图Ondraw()是采用了这种映射模式 int nMapModeOld = pDC->SetMapMode(MM_LOMETRIC);在这种模式下,每个像素点是0.1mm,
然后我画了一些网格线,网格是1mm*1mm的正方形,代码如下
    int RULER_WIDTH; 
    int RULER_HEIHGT;
    int ppiX = pDC->GetDeviceCaps(LOGPIXELSX);
    int ppiY = pDC->GetDeviceCaps(LOGPIXELSY);
    int pixelsX = pDC->GetDeviceCaps(HORZRES);
    int pixelsY = pDC->GetDeviceCaps(VERTRES);
    RULER_HEIHGT = 25.4*pixelsY/ppiY;//单位是mm,而每个最小量化是0.1mm
    RULER_WIDTH  = 25.4*pixelsX/ppiX;
 
     for (i = 0; i <= RULER_HEIHGT; i ++) //画网格横线

                       if (!(i % 5)) 
pOldPen = pDC->SelectObject(&BoldLine); 
else 
pOldPen = pDC->SelectObject(&newPen);  pDC->MoveTo(0, -i * 10); 
pDC->LineTo(RULER_WIDTH * 10, -i * 10); 
pDC->SelectObject(pOldPen); 
}    for (i = 0; i <= RULER_WIDTH; i ++) //画网格竖线

if (!(i % 5)) 
pOldPen = pDC->SelectObject(&BoldLine); 
else 
pOldPen = pDC->SelectObject(&newPen);  pDC->MoveTo(i * 10, 0); 
pDC->LineTo(i * 10, -RULER_HEIHGT * 10); 
pDC->SelectObject(pOldPen); 

我现在想测量屏幕上两点之间的距离,在OnLButtondown中记录起始点坐标,然后在OnLButtonUp中记录终止点坐标,我做了一个实验,把设置的起始点和终止点正好是屏幕上10个网格的距离,但是我求出来的距离值不是10*10个像素点,而是40,特别奇怪。后来我在进行测量前又重新设定映射模式,
CDC *pDC=GetDC(); 
int nMapModeOld = pDC->SetMapMode(MM_LOMETRIC);
hPreCursor = ::LoadCursor(NULL,IDC_CROSS);
hPreCursor = ::SetCursor(hPreCursor);
但是结果还是没有变,不知道问题出在什么地方,请高手指点。

解决方案 »

  1.   

    刚才我看了起始点和终止点的坐标,横坐标和纵坐标都是正数,可是在MM_LOMETRIC映射模式下,纵坐标应该是负的,这样看,好像是测量时映射模式没有设置成,请指点
      

  2.   

    不太明白具体意思
    是根据BeginPoint,EndPoint来计算么??
      

  3.   

    OnLButtondown/OnLButtonUp取得的坐标是像素的点点。
    你要把点坐标变成0.1mm坐标才行。
      

  4.   

    double x = (double)(p.x) * GetDeviceCaps(HORZSIZE) / GetDeviceCaps(HORZRES);
    double y = (double)(p.y) * GetDeviceCaps(VERTSIZE) / GetDeviceCaps(VERTRES);
    变换一下试试。
      

  5.   

    你改的是dc的坐标系。
    窗口系统不知道你做了这件事。
    窗口系统通过OnLButtondown/OnLButtonUp告诉我们的坐标,是显示器上的一个个光点的序号。