VC++坐标转换

 

1)CDC的所有成员函数都以逻辑坐标作为参数。

2)CWnd的成员函数都以设备坐标作为参数。

3)所有点中测试之类的函数都应该考虑设备坐标,区域的定义应采用设备坐标。某些像CRect::PtInRect之类的函数只有在采用设备坐标参数时才会保证有正确的结果。

4)将一切需要长期使用的值用逻辑坐标或物理坐标保存。

5)一般在虚函数OnPrepareDC中设置映射模式要比在OnDraw函数中设置合适一些。

例子如下:

在View类中添加声明:

private:
 // 画笔颜色
 int m_nColor;
 // 矩形区域
 CRect m_rectEllipse;

在构造函数中对变量进行初始化:

 m_nColor=GRAY_BRUSH;

 m_rectEllipse=CRect(0,0,4000,-4000);

在View类中重载OnPrepareDC函数,添加代码:pDC->SetMapMode(MM_HIMETRIC);将坐标系的单位设为0.01mm

在OnDraw函数中添加代码:

pDC->SelectStockObject(m_nColor);
 pDC->Ellipse(m_rectEllipse);

添加左键单击的消息映射OnLButtonDown:

并添加代码:

CRect rect=m_rectEllipse;
 CClientDC dc(this);
 dc.SetMapMode(MM_HIMETRIC);
 

 dc.LPtoDP(rect);

 if(rect.PtInRect(point))
 {
  if(m_nColor==GRAY_BRUSH)
  {
   m_nColor=WHITE_BRUSH;
  }
  else
   m_nColor=GRAY_BRUSH; 
 }
 InvalidateRect(rect);

这里由于我们定义的m_rectEllipse是逻辑坐标,因此在检测之前一定要把逻辑坐标转换到设备坐标。然后才能得到正确的结果。

posted @ 2006-12-06 20:40  巨巨  阅读(248)  评论(0编辑  收藏  举报