比较清楚这两个函数的意义,但是不太清楚在什么情况下来回转换,恳请大侠告之!

解决方案 »

  1.   

    一般都是在CScrollView里面了,视图被滚动上去了,这样屏幕坐标和逻辑坐标就不吻合了。比如你要通过鼠标的点击屏幕来得到视图上的坐标,那就要先进行DPtoLP转换来得到视图的坐标。
      

  2.   

    http://zhidao.baidu.com/question/68366525.html
      

  3.   

    当视图的映射模式是MM_ANISOTROPIC或者MM_ISOTROPIC,也就是说逻辑视图与设备视图的坐标方向与单位都是用户定义的.如果你需要将几个点的坐标从逻辑视图转化到设备视图,就需要使用DPtoLP与LPtoDP.
      

  4.   

    void CMaskedBitmap::Draw(CDC *pDC, int x, int y)
    {
        BITMAP bm;
        GetBitmap (&bm);
        CPoint size (bm.bmWidth, bm.bmHeight);
        pDC->DPtoLP (&size);    CPoint org (0, 0);
        pDC->DPtoLP (&org);    CDC dcMem;
        dcMem.CreateCompatibleDC (pDC);
        CBitmap* pOldBitmap = dcMem.SelectObject (this);
        dcMem.SetMapMode (pDC->GetMapMode ());    pDC->BitBlt (x, y, size.x, size.y, &dcMem, org.x, org.y, SRCCOPY);    dcMem.SelectObject (pOldBitmap);
    }其中CMaskedBitmap是从CBitmap派生的,为什么定义CSise和CPoint之后要调用DPtoLP啊?
      

  5.   

    大哥呀,BitBlt中的所有表示位置与尺寸参数都是以逻辑坐标为单位的。而对于程序员来说,他只是希望将视图左上角绘图。考虑到pDC可能使用MM_ANISOTROPIC或者MM_ISOTROPIC作为映射模式,这时设备视图原点与逻辑视图原点就不一定在同一位置。所以就需要使用DPtoLP将设备坐标中的原点与尺寸转化成逻辑坐标中的原点与尺寸
      

  6.   

    对于MM_ANISOTROPIC或者MM_ISOTROPIC映射模式而言,逻辑视图中位图坐标转化到设备视图比较困难,所以就需要使用DPtoLP
      

  7.   

    是不是CPoint定义一个点就是设备坐标不可能是逻辑坐标?
    有没有可能CPoint定义一个点开始就是逻辑坐标呢?
      

  8.   

    CPoint定义一个点的坐标与设备或逻辑坐标系无关。因为逻辑坐标系是未知的,设备坐标系是固定的,设备视图下的坐标系就是MM_TEXT,原点位于左上角,x轴向为下,y轴向下为正。所以程序员在考虑到特定的位置上绘图时,就会以设备坐标为参考。那个点CPoint org (0, 0); 在设备坐标系下是左上角,因此要使实际绘制出来的图像也位于左上角,就必须使用DPtoLP,将其转化成逻辑坐标。然后才能调用BitBlt.