如上边这个图形,共8个顶点,我用CRgn类创建了一个多边形区域,然后使用它的PtInRegion判断鼠标是否在此区域内,我的坐标数组这样构建的
CPoint pt[8];
pt[0]=点0;
....
pt[7]=点7;
,现在总感觉染成红色的区域检测不到,我这个是仿照别人的一个应用画的图,他那个检测很准确的,不知道是不是使用了别的什么方法?请达人指教!

解决方案 »

  1.   

    使用PtInRegion之前,对point进行一下ClientToScreen或者ScreenToClient运算之后再试试看
      

  2.   

    我是这样创建区域的,没有发现问题:
    public:
        CRgn Region;
        CPoint PointArray[8];CSDIWindView::CSDIWindView()
    {
    PointArray[0].x  = 100; 
    PointArray[0].y  = 100; 
    PointArray[1].x  = 80; 
    PointArray[1].y  = 150;

    PointArray[2].x = 20; 
    PointArray[2].y = 180; 
    PointArray[3].x = 80; 
    PointArray[3].y = 200;

    PointArray[4].x  = 100; 
    PointArray[4].y  = 400; 
    PointArray[5].x  = 120; 
    PointArray[5].y  = 200;

    PointArray[6].x = 180; 
    PointArray[6].y = 180; 
    PointArray[7].x = 120; 
    PointArray[7].y = 150;
    }
    在LButtonDown里面使用:
    void CSDIWindView::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    if( Region.PtInRegion(point) )
    {
    AfxMessageBox("IN");
    }
    CView::OnLButtonDown(nFlags, point);
    }如果楼主的区域比较小,或者要求比较精确可以考虑使用GDI+里面的Region类来完成,可以支持浮点数。
      

  3.   

    你的Region具体是怎么创建的?我是这样
    Region.CreatePolygonRgn(PointArray,8,ALTERNATE);
    会出现图中所示的红色区域检测不到的情况,区域创建和你一样,只不过我不是写死的,是分别依次赋的0-7的坐标值
      

  4.   

    我的区域是这样创建的Region.CreatePolygonRgn(PointArray, 8, WINDING); 只是后面一个参数不一样 但是我试验了 换成ALTERNATE
    也没有问题。
    如果你的还是有问题 那可能是因为你把点的顺序弄乱了 或者 你查查你在数组附件是不是有内存没有被清理的 另外
    CRgn Region; 如果是局部变量 使用完以后 要记住清理,使用Region.DeleteObject();
    如果公有的Region 是不是在CreatePolygonRgn之前需要先将Region清空啊??实在是想不出别的了, 主要还是因为在我这里怎么用都能检测到,问题处在CRgn 的CreatePolygonRgn函数上的可能性比较低。
      

  5.   

    是能检测到,只是有很少区域不太准确而已。DeleteObject(); 对准确度没什么影响,看来没办法了