由于初次接触MFC的绘图函数,好不容易弄明白了坐标方面的基本概念,如设备坐标系、逻辑坐标系、SetWindowExt、SetWindowOrg、SetViewportExt、SetViewportOrg。结果在OnMouseMove(UINT nFlags, CPoint point) 这个方法又遇到一些问题,因为此时传入的point是设备坐标系,我们需要做一下设备坐标系到逻辑坐标系之间的转换,但是网上资料大多都直接给出用ScreenToClient方法或者DPtoLP方法,并没有一些特别的注意事项,经常不少时间的摸索,终于知道原来在使用DPtoLP之间需要重新定义一下设备坐标和逻辑坐标之间的映射关系,而这个映射关系实际上在初始化时已经定义,我错误的以为这样逻辑坐标系就不用再管了。废话不多了,直接贴上代码:
void CSunliming_201328014629078View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRect cRect;
pDC->SetMapMode(MM_ISOTROPIC); //设定各同向性坐标系
AfxGetMainWnd()->GetClientRect(cRect);
pDC->SetWindowExt(cRect.Width(),cRect.Height());//设置窗口大小
pDC->SetWindowOrg(0, 0);
pDC->SetViewportExt(cRect.Width(),-cRect.Height());
pDC->SetViewportOrg(cRect.Width()/2,cRect.Height()/2); //设置视口原点为中心,两原点之间建立映射,扩展之间成比例
DPtoLP(pDC->GetSafeHdc(),&point,randSize);
if(current >= 0 )
{
m_rands[current]->setXPos(point.x);
m_rands[current]->setYPos(point.y);
Invalidate() ;
}
}
初学MFC绘图,写这篇文章只为给自己做个记录,以后不至于在这种问题上纠结半天,如果这篇文章对大家有用,it's fine with me!!!