如上边这个图形,共8个顶点,我用CRgn类创建了一个多边形区域,然后使用它的PtInRegion判断鼠标是否在此区域内,我的坐标数组这样构建的
CPoint pt[8];
pt[0]=点0;
....
pt[7]=点7;
,现在总感觉染成红色的区域检测不到,我这个是仿照别人的一个应用画的图,他那个检测很准确的,不知道是不是使用了别的什么方法?请达人指教!
解决方案 »
- 图形基础
- 如何把工具栏所占的位置也隐藏了?
- 双缓冲 GDI画图 颜色不对
- 1.好多telnet 服务器的telnet端口不是23,那为何我直接输入:telnet bbs.fudan.edu.cn 就可以连上了?
- AfxDeferRegisterClass和AfxEndDeferRegisterClass的关系
- 高手们:金山游侠的"一键必杀"功能怎么实现的?
- 请问,如何处理socket 里的断开连接???
- 如何让about dailog中的版本信息自动升级
- 请问,我想再做一个软件在局域网中能够显示主机硬盘上所共享的所有文件夹,该怎么做。
- 请lownr(双面)进来看一看
- 不兼容的问题!!!!!急救!!!!
- 用CreateProcess()启动进程后如何获得进程句柄
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类来完成,可以支持浮点数。
Region.CreatePolygonRgn(PointArray,8,ALTERNATE);
会出现图中所示的红色区域检测不到的情况,区域创建和你一样,只不过我不是写死的,是分别依次赋的0-7的坐标值
也没有问题。
如果你的还是有问题 那可能是因为你把点的顺序弄乱了 或者 你查查你在数组附件是不是有内存没有被清理的 另外
CRgn Region; 如果是局部变量 使用完以后 要记住清理,使用Region.DeleteObject();
如果公有的Region 是不是在CreatePolygonRgn之前需要先将Region清空啊??实在是想不出别的了, 主要还是因为在我这里怎么用都能检测到,问题处在CRgn 的CreatePolygonRgn函数上的可能性比较低。