首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

旋转DC后绘制圆出现有关问题

2014-07-18 
旋转DC后绘制圆出现问题在做一个简单的画图软件,现在涉及到了旋转功能,比如画一个矩形,需要给他任意角度,

旋转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对象去画一个圆时,这个圆会向右下角方向扩展一点,不知道这个是怎么回事。如果是画一个直线或者一个矩形的话就没有问题。


[解决办法]
下面多出一点吧。

这个估计是精度的问题。
[解决办法]
楼主也没说矩形有问题啊。
[解决办法]
俺从不变坐标,数据都是自己算,还真没遇到问题。

热点排行