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是逻辑坐标,因此在检测之前一定要把逻辑坐标转换到设备坐标。然后才能得到正确的结果。