还要能够给出线的位置信息,应该用控件还是鼠标时间啊,大家给点头绪啊。。

解决方案 »

  1.   

    大侠,有个弱智问题,我知道onpaint在收到WMPAINT后被执行,但是都有什么样的屏幕操作会导致WMPAINT消息的发出的啊?
      

  2.   

    一般窗体的的on_size事件
    窗体的最大最小化
    其他窗口的移动涉及到自身窗体了

    都会引发WMPAINT
      

  3.   

    只要客户区的大小,或者可见区域发生任何变化,都会发出WM_PAINT消息。比如有个浮动窗在客户区上移动。
      

  4.   

    任何视觉上的变化都会引起WM_PAINT事件。
      

  5.   

    在鼠标OnmouseMove中要清除刚才画的线怎么办啊,因为画出了一堆的线,可是我只想要一条鼠标当前位置的线啊
      

  6.   

    用CDC::SetROP2(R2_NOT);
    然后先画你要的图
    要擦除的时候再原样再画一遍,图形就复原了。
      

  7.   

    用CDC::SetROP2(R2_NOT);
    然后先画你要的图
    要擦除的时候再原样再画一遍,图形就复原了。
      

  8.   

    还是不行啊,这个函数到底怎么用?比方画图函数:
    void CPlotDlg::PaintLine()
    {
    pDC->MoveTo(linitpos,htorgy);
    pDC->LineTo(linitpos,htorgy+httop);
    pDC->MoveTo(rinitpos,htorgy);
    pDC->LineTo(rinitpos,htorgy+httop);
        pDC->SetROP2(R2_NOT);
    }
    在void CPlotDlg::OnMouseMove(UINT nFlags, CPoint point) 
    {
          linitpos=linitpos+100;
          OnPaint();
          PaintLine();
    }
    这样错在哪里了啊?
      

  9.   

    不要调用OnPaint函数,则是系统调用的。想要OnPaint执行,可以调用Invalidate函数或触发WM_SIZE消息
      

  10.   

    The point is:
    You'd better know when OnPaint event happens, and what does it do... and then, what you need to do is: to add your codes in within this function...
      

  11.   

    用CRectTracker中有一个橡皮筋类!!
    如果你是要话huafda
      

  12.   

    好吧,不调用OnPaint(),可是那还是不行啊
    用Invalidate倒是可以,但是闪烁的太厉害了
      

  13.   

    在绘制直线和删除直线时都先设置pDC->SetROP2(R2_XORPEN);然后在MoveTo,LineTo,就可以将画过的直线删除了。
      

  14.   

    就是说Move一下鼠标就要先画后面的,再画前面的(擦除),对马?
      

  15.   

    void CPlotDlg::OnMouseMove(UINT nFlags, CPoint point) 
    {
             pDC->SetROP2(R2_XORPEN);             
    pDC->MoveTo(linitpos,htorgy);
             pDC->LineTo(linitpos,htorgy+httop);
             pDC->MoveTo(rinitpos,htorgy);
             pDC->LineTo(rinitpos,htorgy+httop); linitpos=linitpos+(point.x-lfpos)*scale*78/66;
             pDC->SetROP2(R2_XORPEN);
             pDC->MoveTo(linitpos,htorgy);
             pDC->LineTo(linitpos,htorgy+httop);
             pDC->MoveTo(rinitpos,htorgy);
             pDC->LineTo(rinitpos,htorgy+httop);
    }
    您是说这样吗?可是不对啊,线没有动就。
      

  16.   

    linitpos=linitpos+(point.x-lfpos)*scale*78/66;-->lfPos是什么类型?
    怎么不行了?
      

  17.   

    是float。好像是因为颜色不对。背景是灰的,应该设SetROP2(R2_XORPEN)是什么啊。我试过XORPEN、NOTXORPEN、NOT等等都不行啊
      

  18.   

    是在OnPaint里面。。没有直接设成屏幕颜色的吗?把前一条线设成屏幕颜色不就行了,可是怎么做啊
      

  19.   

    都用异或方式画吧。OnPaint也这样试试。
      

  20.   

    唉,还是不行。XORPEN的异或关系到底是怎样的?PEN和SCREEN的关系怎样决定当前的颜色?
    是不是需要重新设定一下pen啊?
      

  21.   

    看来大家都没有搞懂。我搞懂了。我自己写的代码如下  CDC *pDC= GetDC();
    CRect rcClient;
    GetClientRect(rcClient); 
    CPen LinePen( PS_SOLID, 1, RGB(255,255,0) );
    CPen* OldPen = pDC->SelectObject(&LinePen);  
      pDC->SetROP2( R2_XORPEN );
    pDC->BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, 0, 0, SRCCOPY);
        pDC->MoveTo( lastp.x,rcClient.bottom);
    pDC->LineTo( lastp.x, rcClient.top);
    lastp=point;
    pDC->SelectObject(OldPen);  
    当鼠标移动时先插除原来的线。然后moveto,lineto,画完后在将点保存起来,就可以了在视图类中定义一个点保存上次的坐标, CPoint lastp;
    怎么会不行呢??
      

  22.   

    http://expert.csdn.net/Expert/topic/2880/2880485.xml?temp=.6766779
      

  23.   

    怎样将PEN设置成屏幕颜色?是用LinePen吗?
    大家快帮我解决问题把,我都急死了。。