大家各抒己见,MFC中有没有使鼠标只能在一个指定了半径的圆(只是圆弧,不包括圆内)上运动的方法?

解决方案 »

  1.   

    指定了半径的圆(只是圆弧,不包括圆内)上运动的方法?是指在指定的区域内用指定的光标吗?
    拦截WM_MOUSEMOVE消息,GetCursorPos函数得到光标位置,PtInRegion来判断是否在指定的区域内,在就setcursor设定光标,不在设定另一个光标
      

  2.   

    只在曲线上运动,这个有点难,一般思路还是处理WM_MOUSEMOVE,通过鼠标的位置来设定光标,不过很难做好,可以试试这样,先将圆的曲线坐标算好,存在一数组中,在WM_MOUSEMOVE中检查鼠标位置,如果不在曲线上,将光标拉到曲线上距离鼠标当前位置最近的点上来。
      

  3.   

    这么说还真是麻烦呢,还以为会有什么MFC库函数可用呢....
      

  4.   

    不是清除你想要做的到底是什么;
    不过我感觉用mousemove消息应该是可以,圆弧的方程你已经知道了,你可以根据当前鼠标的位置来计算啊,比如根据当前鼠标的位置(100,200),你就根据横坐标100来计算圆弧上的纵坐标啊,然后将光标移到弧线上。
    如果要在上面响应左键或右键,也是同样的,只是根据方程稍微转换下位置坐标而已。
      

  5.   

    是不是这个意思,楼主可以试试看。
    void CXXXView::OnMouseMove(UINT nFlags, CPoint point) 
    {
    CPoint ptCenter(200,200);
    double r = 100;
    double R = sqrt( (point.x - ptCenter.x)*(point.x - ptCenter.x) + (point.y - ptCenter.y)*(point.y - ptCenter.y));
    if( fabs(R-r) < 1.0)
    return;
    CPoint ptOut;
    ptOut.x = ptCenter.x + (point.x - ptCenter.x) * r / R;
    ptOut.y = ptCenter.y + (point.y - ptCenter.y) * r / R;
    ClientToScreen(&ptOut);
    SetCursorPos(ptOut.x, ptOut.y);
    }