自己画的一个简单界面。就想像成上面有一个个的小正方形吧。
用个结构存每个元素的位置rect,颜色等等。
现在想让他能拖动。现在是根据LButtonDown 和mousemove 的时候记录点击的位置,
move的时候发送redrawwindow消息。
在OnPaint的时候用双缓冲 ,在内存dc画。因为动了还得记算
落下的时候的鼠标位置,当前的鼠标位置,鼠标 的状态,等等,计算当前应该显示在哪个坐标
但是运行结果与预期差别很大。不知道跑哪去了。
这种情况 有更好的解决方法吗?跟踪鼠标的拖动
界面中的元素没有子类化,都是在一起画的。
有个CRectTracker是干这个的么?

解决方案 »

  1.   

    空间继承CRectTracker看看,这个类是允许被移动的,你自己实现记得鼠标坐标记得要做屏幕坐标转窗口坐标。。 
      

  2.   

    1 在派生类中处理 不用 LButtonDown
    2 一定要 确定位置
    3 不要用 redrawwindow ,这是 同步 刷新,用  Invalidate(); 可以 积累 无效区(不一直paint)!// CMyStatic message handlers
    void CMyStatic::OnMouseMove(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    static CPoint ptLast;
    //
    if(MK_LBUTTON==nFlags)
    {
    CRect rc;
    GetWindowRect(&rc);
    ScreenToClient(&rc);
    MapWindowPoints(GetParent(),&rc);
    MoveWindow(rc.left+(point.x-ptLast.x), rc.top+(point.y-ptLast.y), rc.Width(), rc.Height());
    }
    else
    {
    ptLast=point;
    CStatic::OnMouseMove(nFlags, point);
    }
    Invalidate();
    }
      

  3.   

    用OPenGL来做吧,比你这样方便多了。
      

  4.   

    按照你的想法做。
    拖动后显示绘制不对,应该是没有转换坐标,
    把鼠标的坐标转换成相对窗口的坐标。
    当然,MouseMove,LButtonDown中是有鼠标坐标的,你可以断点看看它是不是相对窗口的。
      

  5.   

    思路很正确,就是计算出了问题,https://download.csdn.net/download/hhhh63/7710711,看看这个有没有帮助。
      

  6.   

    https://www.codeproject.com/search.aspx?q=CRectTracker&sbo=kw&x=0&y=0