在客户区内先固定一个点,然后在客户区画一条直线,使得直线的一端在固定点,而另外一端是鼠标所指示的那一点,直线随着鼠标的移动而移动,而且只显示现在鼠标所在位置的那条直线,我试过,可是鼠标所走过的那些位置所画的直线都留了下来,并没有消除而只留下当前所画的直线。问题出在哪里了呢??????

解决方案 »

  1.   

    在OnMouseMove里,
    用CPoint记住前一次鼠标的位置,
    在画下一个点的时候,
    把原来的那条线(起点与鼠标位置的那条线)用背景色画,
    当前的线就用你自己所定义的线画就行了。
    楼主的问题是不是前面一次画的线没处理掉啊?
      

  2.   

    Invalidate()
    重画一下对话框
      

  3.   

    在OnMouseMove里采用R2_NOT方式重画刚刚画过的直线,覆盖刚刚画过的直线    dc.MoveTo(mPointOrign);
        ddc.LineTo(mPointOld);
        dc.MoveTo(mPointOrign);
        dc.LineTo(point);
        mPointOld=point;
      

  4.   

    OnMouseMove里每次MoveTo前Invalidate()一下就能擦除上一次的线吧
    最后OnLButtonUp时再Invalidate(),再画一条线应该就行吧
      

  5.   

    重绘和用背景色擦除都不是好方法
    视图比较耗时间,需要额外处理画面闪烁的问题
    擦除的问题则在于背景不单一时有问题,会将原本非背景色的地方变成背景色比较理想的方法应该这样:
    1. 在 OnLButtonDwon 里记录起点
    2. 在 OnMouseMove 里不断的读取鼠标的当前位置,同时记录上一个点的位置
      用 SetROP2(R2_XORPEN) 将画笔设为异或模式
      接下来画两条线,一条从起点到上一点、一条从起点到当前点
      将当前点保存为上一点
    3. 在 OnLButtonUp 里读取终点位置
      先画一条从起点到上一点的线
      将画笔模式设为 SetROP2(R2_COPYPEN) 正常模式
      此时才真正的画一条从起点到终点的线
      

  6.   


    //------------------------------------------------------
    采用橡皮筋就可以了....
    在消息响应函数OnMouseMove(  )中    CClientDC dc( this );
        dc.SetROP2( R2_NOT );  //少不了...
        dc.MoveTo(mPointOrign);
        ddc.LineTo(mPointOld);
        dc.MoveTo(mPointOrign);
        dc.LineTo(point);
        mPointOld=point;