我想做个程序,用于画图,显示效果象大多绘图软件一样,例如在划线时,单击左键后得到第一个端点坐标,此时移动光标(左键状态为按下)会出现一条第一个端点到光标之间的闪烁虚线,左键弹起后决定第二个端点,绘制一条直线,应该怎样实现,如果在 OnMouseMove()中添加代码,不断绘制当前坐标与第一个端点之间的连线,然后以背景色擦除原来的临时虚线,直到确定终点后才绘制,有个问题是效率会不会高,而且不停的刷新,擦除背景会把原来划的内容擦除掉,请问大虾应该怎么处理,大家给个思路吧!谢谢!

解决方案 »

  1.   

    看看 MFC 的橡皮框的代码
      

  2.   

    CRectTracker.
    不过要闪烁的还得自己做.
      

  3.   

    在你拖动鼠标的时候不要刷新设置为橡皮线模式,它的特点是在原位置再画一次就擦除原来的CDC::SetROP2(R2_XORPEN)这样效率非常高,基本不占用CPU
      

  4.   

    谢谢
    1楼 橡皮框代码怎么查找 我没找到
    2楼 知识不够CRectTracker看了还是不会使用 能不能给个例子(MSDN也行) 
    3楼 CDC::SetROP2(R2_XORPEN)是在OnMouseMove中调用吧
        我试了下 没有效果,不知道哪弄错了我在OnMouseMove里加入的代码
    if(m_nStatus == LINE){
        CClientDC dc(this);
        dc.SetROP2(R2_XORPEN);
        dc.MoveTo(m_pt1);
        dc.LineTo(point);
    }
      

  5.   

    是这样的它需要画两次,你得保存下鼠标上次画的位置在头文件里定义一个变量,存放上次坐标
    CPoint m_ptLast;
    if(m_nStatus == LINE)
    {
        CClientDC dc(this);
        int nOldMode = dc.SetROP2(R2_XORPEN);
        dc.MoveTo(m_pt1);
        dc.LineTo(m_ptLast);    dc.MoveTo(m_pt1);
        dc.LineTo(point);    m_ptLast = point;    dc.SetROP2(nOldMode); //还原
    }在鼠标按下时要这样:    dc.MoveTo(m_pt1);
        dc.LineTo(point);
        m_ptLast = point;鼠标台起来时还要来一次:
        int nOldMode = dc.SetROP2(R2_XORPEN);
        dc.MoveTo(m_pt1);
        dc.LineTo(m_ptLast);    dc.SetROP2(nOldMode); //还原
      

  6.   

    呵呵,看下我得blog
    http://www.cppblog.com/wlwlxj