限制鼠标移动范围在圆形区域

 

主要是使用了ClipCursor,

void CMy001View::OnLButtonDown(UINT nFlags, CPoint point) //********限制鼠标移动范围
{
CRect rect;  //新建一个矩形框
GetClientRect(&rect);  //把客户区赋值给矩形框
ClientToScreen(&rect);  //将客户区窗口转换为屏幕窗口坐标
ClipCursor(&rect);  //限制鼠标移动范围在矩形框中
CView::OnLButtonDown(nFlags, point);
}

void CMy001View::OnRButtonUp(UINT nFlags, CPoint point) //*********解除鼠标移动范围
{
ClipCursor(NULL);//释放鼠标
CView::OnRButtonUp(nFlags, point);
}


但是这个函数设置鼠标范围必须是一个矩形框,对于圆形就不行了,我在网上找啊找,终于发现一个帖子里,(http://topic.csdn.net/u/20091121/15/83e6e972-8f94-4a17-b7ec-1fbc8c073b13.html?16940)有位大神wartim提到动态地求出当前点所构成的四边形是否是圆内切四边形,然后把四边形赋给ClipCursor。这个想法实在是太好了,于是尝试了一下,在OnMouseMove函数中写下:
////////////////////限制鼠标活动范围///////////////////////////////////////////
     CRect rect;
  GetClientRect(&rect);
  if((point.x-radius)*(point.x-radius)+(point.y-radius)*(point.y-radius) > (radius*radius+5000))
  {//如果鼠标接近圆的边缘
   rect.bottom = point.y>radius?point.y:radius;//设定根据鼠标位置和圆心位置设定矩形大小
   rect.top = point.y>radius?radius:point.y;
   rect.left = point.x>radius?radius:point.x;
   rect.right = point.x>radius?point.x:radius;
   ClientToScreen(&rect);//将客户端转为屏幕坐标
         ClipCursor(&rect); //限制鼠标运动区域
  }
  else
  {//直到鼠标回到圆中,释放鼠标限制区域
  
         ClipCursor(NULL);//释放鼠标
  }
可以实现功能,但是,总还是有些边边角角有些奇怪的现象,鼠标会乱动,出乎意料。如果鼠标拉得过快,也会在边缘上冲出去,就无法响应鼠标移动事件了。

你可能感兴趣的:(限制鼠标移动范围在圆形区域)