我在对话框中,画了一个矩形
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进行缩小时
上图的矩形就不正常了,会发生漂移。一直没找到漂移距离怎么换算 分我大大的有,有上万分,只要你要
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进行缩小时
上图的矩形就不正常了,会发生漂移。一直没找到漂移距离怎么换算 分我大大的有,有上万分,只要你要
Transform是和matrix的顺序有关的,你缩放之后的坐标就是经过缩放的,因此两次Translate并不能使原点回到原来的位置,第二次Translate的坐标要自己先根据缩放比例计算好。
贴出代码,以示感谢大家//计算变形后的矩形
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);