一个点是否在某个矩形内:CRect xxx.PtInRect( point ) // 只适用于设备坐标系
CRect rectClient ;
GetClientRect(rectClient) // 获得矩形坐标
CRgn rgn.PtInRegion ; // 椭圆类,判断一个点是否在一个椭圆内、
MM_TEXT 映射模式:用来表示设备坐标,坐标被映射到像素:X向右递增,Y向下递增。可以通过调用CDC的SetViewportOrg 和 SetWindowOrg 来重新设置原点。
固定比例映射模式:(唯一的差别在于实际的比例因子)
映射模式 逻辑单位
MM_LOENGLISH 0.01英寸
MM_HIENGLISH 0.001英寸
MM_LOMETRIC 0.1mm
MM_HIMETRIC 0.01mm
MM_TWIPS 1/ 1440 英寸 // 常用于打印机,1TWIPS相当于 1/ 20 磅
可变比例模式:
MM_ISOTROPIC:纵横比总是1:1,不受比例因子变化影响
MM_ANISOTROPIC:X 和 Y 坐标可以独立变化,圆可被拉扁为椭圆
绘制一个椭圆,正好能在窗口中容下:
OnDraw(CDC *pDC)
{
CRect rectClient ;
GetClientRect( rectClient ) ;
pDC->SetMapMode( MM_ANISOTROPIC) ;
pDC->SetWindowExt( 1000, 1000 ) ;
pDC->SetViewPortExt( rectClient.right , - rectClient.buttom ) ;
pDC->SetViewPortOrg( rectClient . right / 2 , rectClient . buttom / 2 ) ;
pDC->Ellipse ( CRect ( -500 , -500 , 500 , 500 ) );
}
逻辑单位转化为设备单位的公式:
X比例因子 = X 视口范围 / X 窗口范围
Y比例因子 = Y 视口范围 / Y窗口范围
设备X = X逻辑*X比例因子 + X坐标原点偏移量
设备Y = Y逻辑*Y比例因子 + Y坐标原点偏移量
鼠标取得的坐标为设备坐标。
在设置了设备映射模式及相应参数后,CDC可以使用LPtoDP 和 DPtoLP 来进行逻辑坐标和设备坐标的转换。
PS:
1、可以认为CDC的所有成员函数都以逻辑坐标来作为参数
2、可以认为CWnd的成员函数都以设备坐标来作为参数
3、所有的选中测试( hit-test )操作都应该考虑设备坐标。区域的定义应该采用设备坐标。
4、某些像CRect::PtInRect() 只有在使用设备坐标才会有正确的结果。
5、将一些长期使用的值用逻辑坐标或物理坐标来保存。如果用设备坐标来保存某点,那么要是窗口移动一下,该点坐标将不再有效。
则判断一个点是否在圆内:
xxx(Point point)
{
Rect rect ;
CClientDC dc(this) ;
dc.SetMapMode( MM_LOENGLISH ) ;
dc.LPtoDP (rect) ;
if ( rect.PtInRect( point ) )
{
TRACE("mouse cursor is insinde rect/n") ;
}
}
应用程序框架 在调用 OnDraw() 之前调用 OnPrepareDC() 虚函数。可在 OnPrepareDC() 中用 SetMapMode()设置映射模式。