旋转DC后绘制圆出现问题
在做一个简单的画图软件,现在涉及到了旋转功能,比如画一个矩形,需要给他任意角度,相对于任意旋转点的旋转。我现在使用了一个旋转DC的功能来实现,定义在一个类内
CRotateDC::CRotateDC()
{
}
CRotateDC::~CRotateDC()
{
if ( m_fAngle != 0 && !m_bRel)
{
m_bRel = true;
m_xform.eM11 = (float)1.0;
m_xform.eM12 = (float)0;
m_xform.eM21 = (float)0;
m_xform.eM22 = (float)1.0;
m_xform.eDx = (float)0;
m_xform.eDy = (float)0;
SetWorldTransform(m_hDC, &m_xform);
SetGraphicsMode(m_hDC, m_iGraphicsMode);
}
}
void CRotateDC::RelRotateDC()
{
if ( m_fAngle != 0 && !m_bRel )
{
m_bRel = true;
m_xform.eM11 = (float)1.0;
m_xform.eM12 = (float)0;
m_xform.eM21 = (float)0;
m_xform.eM22 = (float)1.0;
m_xform.eDx = (float)0;
m_xform.eDy = (float)0;
SetWorldTransform(m_hDC, &m_xform);
SetGraphicsMode(m_hDC, m_iGraphicsMode);
}
}
CRotateDC::CRotateDC( CDC * pDC , float fAngle , const CPoint & ptCenter )
{
m_bRel = false;
m_hDC = NULL;
memset( &m_xform , 0 , sizeof( m_xform ) );
m_iGraphicsMode = 0;
if( fAngle == 0.0 )
return;
m_fAngle = fAngle;
m_hDC = pDC->GetSafeHdc();
m_iGraphicsMode = SetGraphicsMode(m_hDC, GM_ADVANCED);
double dAngle = (double)fAngle / 180.0 * 3.1415926;
m_xform.eM11 = (float)cos(dAngle);
m_xform.eM12 = (float)sin(dAngle);
m_xform.eM21 = (float)(-sin(dAngle));
m_xform.eM22 = (float)cos(dAngle);
m_xform.eDx = (float)(ptCenter.x - cos(dAngle)*ptCenter.x + sin(dAngle)*ptCenter.y);
m_xform.eDy = (float)(ptCenter.y - cos(dAngle)*ptCenter.y - sin(dAngle)*ptCenter.x);
SetWorldTransform(m_hDC, &m_xform);
}
在需要旋转的地方 定义一个 CRotateDC 对象并传参数进去,然后绘制矩形,然后是RelRotateDC 进行后续处理。
这样是可以达到旋转的效果的。
但是在旋转之后,如果调用Ellipse传一个CRect对象去画一个圆时,这个圆会向右下角方向扩展一点,不知道这个是怎么回事。如果是画一个直线或者一个矩形的话就没有问题。
[解决办法]
下面多出一点吧。
这个估计是精度的问题。
[解决办法]
楼主也没说矩形有问题啊。
[解决办法]
俺从不变坐标,数据都是自己算,还真没遇到问题。