我在对话框中,画了一个矩形 
graphics.DrawRectangle(&pen,rect); 
很正常。 
当我用, 
matrix.Reset(); 
matrix.Translate((REAL) -minx , (REAL) -miny , MatrixOrderAppend); 
matrix.Scale(m_fScaleX ,m_fScaleY, MatrixOrderAppend); 
matrix.Translate((REAL) minx , (REAL) miny , MatrixOrderAppend); graphics.SetTransform(&matrix); 
也能正常显示, 当是当我将整个对话框的DC进行缩小时 
上图的矩形就不正常了,会发生漂移。一直没找到漂移距离怎么换算 分我大大的有,有上万分,只要你要

解决方案 »

  1.   

    Transform是和matrix的顺序有关的,你缩放之后的坐标就是经过缩放的,因此两次Translate并不能使原点回到原来的位置,第二次Translate的坐标要自己先根据缩放比例计算好。
      

  2.   

    Transform是和matrix的顺序有关的,你缩放之后的坐标就是经过缩放的,因此两次Translate并不能使原点回到原来的位置,第二次Translate的坐标要自己先根据缩放比例计算好。
      

  3.   

    引用 2 楼 Mackz 的回复:
    Transform是和matrix的顺序有关的,你缩放之后的坐标就是经过缩放的,因此两次Translate并不能使原点回到原来的位置,第二次Translate的坐标要自己先根据缩放比例计算好。 
      

  4.   

    俺搞定的,坐标点的位置有问题,我用了其他方法来计算变化后的点!
    贴出代码,以示感谢大家//计算变形后的矩形
    Rect CalcTransRect()
    {
        Rect R;
        Point pf[4];
        REAL elements[6];
        matrix.GetElements(elements);
        // 分别计算四个角的相对坐标
         pf[0].X = elements[0] * minx + elements[2] * miny;
        pf[0].Y = elements[1] * minx + elements[3] * miny;
        
        pf[1].X = elements[0] * maxx + elements[2] * miny;
        pf[1].Y = elements[1] * maxx + elements[3] * miny;
        
        pf[2].X = elements[0] * maxx + elements[2] * maxy;
        pf[2].Y = elements[1] * maxx + elements[3] * maxy;    pf[3].X = elements[0] * minx + elements[2] * maxy;
        pf[3].Y = elements[1] * minx + elements[3] * maxy;
        //左上角坐标
        R = Rect(pf[0].X, pf[0].Y, 0.0, 0.0);
       //求右下角坐标
        for(int i = 0 ; i <= 3 ; i ++)
       {
    if(R.X > pf[i].X )
    R.X = pf[i].X;
    else if (R.Width < pf[i].X)
    R.Width = pf[i].X; if (R.Y > pf[i].Y)
        R.Y = pf[i].Y;
    else if (R.Height < pf[i].Y)
        R.Height = pf[i].Y;
        }   // 求出矩形尺寸
       R.Width = R.Width - R.X;
       R.Height = R.Height - R.Y;
       // 求得左上角实际坐标
        R.X = R.X + elements[4];
        R.Y = R.Y + elements[5];
        return R;
    }使用时 Rect Tracker;
    Tracker = pPenNode->CalcTransRect();

    int x3 = Tracker.X ;
    int y3 = Tracker.Y ;

    Graphics graphics(pDC->m_hDC);

    Matrix matrix;

    matrix.Translate(-x3,-y3,MatrixOrderAppend);
    matrix.Scale(pPenNode->m_fScaleX,pPenNode->m_fScaleY,MatrixOrderAppend);
    matrix.Translate(x3,y3,MatrixOrderAppend);
    graphics.SetTransform(&matrix); graphics.DrawImage(pPenNode->m_pic , x1 , y1, x2 - x1 , y2 - y1);