none
鼠标追踪线该如何处理 RRS feed

  • 问题

  • 在mousmove消息中获取鼠标的坐标并且画出十字标记线,应该怎么处理这个线,在下次鼠标移动到新位置时,擦除刚画的线
    2016年1月17日 10:05

答案

  • 你好,

    >应该怎么处理这个线,在下次鼠标移动到新位置时,擦除刚画的线


    你可以在 mousemove响应中添加如下参考代码, 注意一定要调用Invalidate(),这个方法会发送WM_PAINT 消息从而使窗体重绘。


    Invalidate();

    UpdateWindow();

    CDC* pDC = GetDC();

    pDC->MoveTo(point.x-m_Halflength,point.y);

    pDC->LineTo(point.x+m_Halflength,point.y);

    pDC->MoveTo(point.x,point.y-m_Halflength);

    pDC->LineTo(point.x,point.y+m_Halflength);

    ReleaseDC(pDC);

    如果我不调用Invalidate(),我的运行结果如下:

    类似问题,你还 可以参考以下相似问题的讨论链接:

    http://bbs.csdn.net/topics/310045545

    May


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 Rogerguo 2016年1月20日 12:12
    2016年1月18日 7:28

全部回复

  • 你好,

    >应该怎么处理这个线,在下次鼠标移动到新位置时,擦除刚画的线


    你可以在 mousemove响应中添加如下参考代码, 注意一定要调用Invalidate(),这个方法会发送WM_PAINT 消息从而使窗体重绘。


    Invalidate();

    UpdateWindow();

    CDC* pDC = GetDC();

    pDC->MoveTo(point.x-m_Halflength,point.y);

    pDC->LineTo(point.x+m_Halflength,point.y);

    pDC->MoveTo(point.x,point.y-m_Halflength);

    pDC->LineTo(point.x,point.y+m_Halflength);

    ReleaseDC(pDC);

    如果我不调用Invalidate(),我的运行结果如下:

    类似问题,你还 可以参考以下相似问题的讨论链接:

    http://bbs.csdn.net/topics/310045545

    May


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 Rogerguo 2016年1月20日 12:12
    2016年1月18日 7:28
  • CPoint m_pt;
    void CAEATDlg::OnMouseMove(UINT nFlags, CPoint point)
    {
    	// TODO: Add your message handler code here and/or call default
    	m_pt = point;
    	InvalidateRect(NULL);
    	UpdateWindow();
    
    	CDialog::OnMouseMove(nFlags, point);
    }
    
    void CAEATDlg::OnPaint()
    {
    	CPaintDC dc(this); // device context for painting
    	
    #define BASE_POINT_CX	20
    #define BASE_POINT_CY	20
    	CPoint pt1, pt2, pt3, pt4;
    	pt1.x = m_pt.x - BASE_POINT_CX;
    	pt1.y = m_pt.y;
    	pt2.x = m_pt.x + BASE_POINT_CX;
    	pt2.y = m_pt.y;
    
    	pt3.x = m_pt.x;
    	pt3.y = m_pt.y - BASE_POINT_CY;
    	pt4.x = m_pt.x;
    	pt4.y = m_pt.y + BASE_POINT_CY;
    
    	dc.MoveTo(pt1);
    	dc.LineTo(pt2);
    	dc.MoveTo(pt3);
    	dc.LineTo(pt4);
    }


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2016年1月18日 11:10
    版主
  • May 的方法并不能取得完整的鼠标滑动轨迹WM_MOUSEMOVE值受当前进程运行效率和采样率影响,如果绘制鼠标轨迹的话会得到弯曲的线而非连续平滑的曲线,但windows提供了补偿机制它将鼠标移动实际轨迹存到一块区域内,通过GetMouseMovePointsEx可获取
    2016年4月22日 6:30