逻辑坐标和设备坐标之间的转换。
============================================================
摘自inside vc++ vesion 4th;
============================================================
在设置了设备环境的映射模式及相应的参数之后,CDC的LPtoDP和DPtoLP函数就可用来在逻辑坐标系和设备坐标系之间进行转换,而我们的工作就是要决定什么时候该使用什么样的坐标系。
规则:
可以认为CDC的所有成员函数都以逻辑坐标作为其参数。
可以认为CWnd的成员函数都以设备坐标为其参数。
所有选中测试(hit-test)操作都应该考虑设备坐标。区域的定义应采用设备坐标。某些像CRect::PtInRect之类的函数只有在采用设备坐标参数的时候才会保证有正确的结果
将一些需要长期使用的值用逻辑坐标或物理坐标来保存。如果用设备坐标来保存某点的坐标的话,那么只要用户对窗口进行一下滚动,该点的坐标就不再有效了。
如果我们需要知道当用户按下鼠标左键时,鼠标指针是否落在某个矩形之内,则可用如下代码:
//m_rect is CRect data member of the derived view class with MM_LOENGLISH
//logical coordinates
void CMyView::OnLButtonDown(UINT nFlags,CPoint point)
{
CRect rect = m_rect; //rect is a temporary copy of m_rect
CClientDC dc(this); //This is how we get a device context
//for SetMapMode and LPtoDP
dc.SetMapMode(MM_LOENGLISH);
dc.LPtoDP(rect); //rect is now in device coordinates
if(rect.PtInRect(point)){
TRACE("Mouse cursor is inside the rectangle.\n");
}
}
posted on 2008-04-02 17:34
田园的拾荒者 阅读(1248)
评论(1) 编辑 收藏 引用 所属分类:
C/C++