我在对话框中建立了一个坐标系,原点定在了:dc.SetMapMode(MM_LOENGLISH);
dc.SetViewportOrg(25,600);
现在我有一个图形的其中的坐标我也计算好啦,想要画在这个坐标系中,我是否需要将我计算出的点用CDC::LPtoDP转换下?

解决方案 »

  1.   

    仅仅是原点偏移的话,不需要LP和DP的转换,一般也不需要对图形坐标数据做处理。
    因为设置DC视口原点一般是用于对输出整体作偏移,比如滚屏的处理;或者每一个
    局部有自己的相对坐标系。LP和DP的转换主要是用于SetMapMode方法改变了DC坐标单位和Y轴方向之后。
      

  2.   

    “LP和DP的转换主要是用于SetMapMode方法改变了DC坐标单位和Y轴方向之后。”
    我上面的也是采用了坐标的变化啊,MM_LOENGLISH,计算出来的点,怎么在图形中乱跑啊?
      

  3.   

    噢……没仔细看你贴的代码,不好意思:)这样说的话,是需要的,不过应该是DPToLP,DP的单位始终是像素,也就是屏幕或客户区坐标(要看是谁的DC了)。LP即逻辑坐标,才是DC输出图形的方法所需要传入参数的坐标。
      

  4.   

    所谓DP(设备坐标)的“设备”指的是输出设备(显示器、打印机),而不是DC本身
      

  5.   

    下面是我想画图形的部分代码,您看下有什么不对吗?
    dc.SetMapMode(MM_LOENGLISH);
    dc.SetViewportOrg(25,600); CPoint ptset[5]; ptset[0]=CPoint(int(m_G2+m_Za2),int(m_Ga2+m_Za2*tan(m_deltaA2*PI)));//第1点坐标;
    dc.DPtoLP(&ptset[0]);
        ptset[1]=CPoint(int (m_Re2*cos(m_delta2*PI)),int(m_Re2*sin(m_delta2*PI))); //第2点坐标
        dc.DPtoLP(&ptset[1]);
        ptset[2]=CPoint(int(((m_G2+m_Za2)*m_Re2*sin(m_delta2*PI)+tan(m_deltaF2*PI)*(m_Gf2-m_G2)*(m_Re2*cos(m_delta2*PI)
        -m_G2-m_Za2)-(m_Ga2+m_Za2)*tan(m_deltaA2*PI)*m_Re2*cos(m_delta2*PI))/(m_Re2*sin(m_delta2*PI)
         -m_Ga2*tan(m_deltaA2*PI)-m_Za2*tan(m_deltaA2*PI)-tan(m_deltaF2*PI)*(m_Re2*cos(m_delta2*PI)-m_G2-m_Za2))),int (
         ((m_G2+m_Za2)*m_Re2*sin(m_delta2*PI)+tan(m_deltaF2*PI)*(m_Gf2-m_G2)*(m_Re2*cos(m_delta2*PI)
        -m_G2-m_Za2)-(m_Ga2+m_Za2)*tan(m_deltaA2*PI)*m_Re2*cos(m_delta2*PI))/(m_Re2*sin(m_delta2*PI)
         -m_Ga2*tan(m_deltaA2*PI)-m_Za2*tan(m_deltaA2*PI)-tan(m_deltaF2*PI)*(m_Re2*cos(m_delta2*PI)-m_G2-m_Za2))*tan(m_deltaF2*PI)+
         tan(m_deltaF2*PI)*(m_Gf2-m_G2)));//第3点坐标:
    dc.DPtoLP(&ptset[2]); ptset[3]=CPoint(int((((m_G2+m_Za2)*m_Re2*sin(m_delta2*PI)+tan(m_deltaF2*PI)*(m_Gf2-m_G2)*(m_Re2*cos(m_delta2*PI)
        -m_G2-m_Za2)-(m_Ga2+m_Za2)*tan(m_deltaA2*PI)*m_Re2*cos(m_delta2*PI))/(m_Re2*sin(m_delta2*PI)
        -m_Ga2*tan(m_deltaA2*PI)-m_Za2*tan(m_deltaA2*PI)-tan(m_deltaF2*PI)*(m_Re2*cos(m_delta2*PI)-m_G2-m_Za2)))+8),
        int((((m_G2+m_Za2)*m_Re2*sin(m_delta2*PI)+tan(m_deltaF2*PI)*(m_Gf2-m_G2)*(m_Re2*cos(m_delta2*PI)
        -m_G2-m_Za2)-(m_Ga2+m_Za2)*tan(m_deltaA2*PI)*m_Re2*cos(m_delta2*PI))/(m_Re2*sin(m_delta2*PI)
        -m_Ga2*tan(m_deltaA2*PI)-m_Za2*tan(m_deltaA2*PI)-tan(m_deltaF2*PI)*(m_Re2*cos(m_delta2*PI)-m_G2-m_Za2))*tan(m_deltaF2*PI)+
        tan(m_deltaF2*PI)*(m_Gf2-m_G2))-8));//第4点坐标;
    dc.DPtoLP(&ptset[3]);
    ptset[4]=CPoint(int((((m_G2+m_Za2)*m_Re2*sin(m_delta2*PI)+tan(m_deltaF2*PI)*(m_Gf2-m_G2)*(m_Re2*cos(m_delta2*PI)
        -m_G2-m_Za2)-(m_Ga2+m_Za2)*tan(m_deltaA2*PI)*m_Re2*cos(m_delta2*PI))/(m_Re2*sin(m_delta2*PI)
       -m_Ga2*tan(m_deltaA2*PI)-m_Za2*tan(m_deltaA2*PI)-tan(m_deltaF2*PI)*(m_Re2*cos(m_delta2*PI)-m_G2-m_Za2)))+8),0);//第5点坐标;
    dc.DPtoLP(&ptset[3]);

    dc.Polyline(ptset,5);
      

  6.   

    至少您对DC的使用都是正确的,除了要注意回复DC属性之外。只能怀疑问题是出在计算图形坐标的算法上了。
      

  7.   

    当我用了LP和DP后图形,完全跑掉啦,与我建立的(25,600)的坐标原点关系没有,不知道什么情况?当不用这个LP和DP至少还在图形中,但是图形不对.您看?
      

  8.   


    有点无语……如果你的DC是局部变量,那不回复属性无所谓。如果是非局部量比如CView::OnDraw(CDC* pDC)
    的参数,那么在绘制之后必须将更改了的属性回复。如果只是整个图形的一个局部的绘制需要更改
    DC属性,那么绘制之后也必须回复。这样说你能明白吧:)
      

  9.   

    当然,视口原点这个,只要不是在局部绘制过程中,不回复无所谓。关于你10L的问题,关键是你计算点数组坐标值是基于什么单位、什么原点的。
    应该基于英寸,并且原点是(0, 0)。图形数据不需要考虑原点问题。原点问题是DC本身处理的,不管是设视口原点你还是设平移矩阵。
    其它坐标变换问题也是一样。