(第四版中文版)一

来源:互联网 发布:爱情守望者 软件 编辑:程序博客网 时间:2024/05/04 14:57

一个点是否在某个矩形内: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()设置映射模式。

原创粉丝点击