本人从USB口接到数据,并绘图显示。需要绘制几条曲线,于是定义了几个cdc,如CDC * c1 = GetDC();c2,c2...
再分别定义了相应的画笔,再分别moveTo,LineTo。
   最后发现问题,一条曲线最后总是moveTo了另外曲线的起始位置,请问什么原因?
画笔问题么,还是CDC定义的问题,抑或其他呢?
   谢谢

解决方案 »

  1.   

    一开始思路就错了,就一个CDC
    几条曲线只是几个数据缓冲区而已
      

  2.   

    请问每次画图时都要选择新的画笔么?
    pdc.selectObject(&pen1);
    //Draw with pen1
    pdc.selectObject(&pen2);
    //Draw with pen2
    ....
    但是我要画很多曲线,每次都要选择画笔很麻烦,能不能先选择好画笔呢?
    于是我就定义了几个CDC,先为每个选择好画笔.听你说好像不行啊?
      

  3.   

    如果需要,换画笔是必须的大概流程是这样CDC *pDC=GetDC();
    选择画笔1
    画曲线1
    .........
    选择画笔n
    画曲线n
    如果你的数据安排得恰当,一个循环就搞定,代码就简单明了了
    而且画笔你可以定义类的数组,在程序初始化的地方就创建好for(int i=0;i<n;i++)
    {
       选择画笔i
       画曲线i
    }
      

  4.   

    楼主好像是多线程画图吧,如果是多线程,建议用一个线程画图,不要每个线程都画。因为有可能你几个线程所用的设备是相同的!
    你每次moveto时,要记录以前鼠标所在的位置,lineto完成后,再moveto回去恢复设备的环境!
      

  5.   


    没用多线程,对vc多线程不大熟。一个CDC的话很麻烦,我要画9条先,每次都要moveTo下条线的起始位置,太麻烦了。
      

  6.   

    定义一个CDC画图很麻烦的,因为我要画9条线,每次要moveTo下条线的起始位置。
    还有我每次运行完程序关闭时,总是出现Debug Assertion Failed。错误,好像是内存泄露。我定义的9个CDC没有释放(我在InitDialog中初始化他的)因为我不知道在哪释放?画图过程中都要用到。请问怎么做呢?
      

  7.   


    我也是这个意思,UI处理本身就是个线程,所以绘图应该在WM_PAIN中绘图。
    VC MFC 应该是在 OnPaint 函数中。CPaintDC dc (this);
    CPen pen(PS_SOLID, 1, 0xff0000); //红色画笔
    CPen* pOld = dc.SelectObject (&pen);//-----------------------------
    //在这里画图
    //-----------------------------dc.SelectObject (pOld);//以上代码没有调试,差不多就是这样一个结构。
      

  8.   


    画图的话,建议你使用微软的新标准 GDI+GDI之所以还存在是为了保持与老程序的兼容。新开发的程序应该使用GDI+。GDI+绘图代码简单,并且功能远比GDI要强大。
      

  9.   

    你画多少条线也用不着那么多CDC呀 void CDrawView::OnMouseMove(UINT nFlags, CPoint point) 

     if ( m_bDraw )
     {
      CClientDC dc(this) ;
      dc.SetROP2(R2_BLACK); //绘图的模式设置,始终绘制黑色图形
      CPen pen( PS_SOLID , 1 , RGB(255,128,128) );
      CPen *pOldPen = dc.SelectObject(&pen);
      dc.MoveTo(m_ptOrigin);
      dc.LineTo(m_ptOld);
      dc.MoveTo(m_ptOrigin);
      dc.LineTo(point);
      dc.MoveTo(m_ptOld);
      dc.LineTo(point);
      m_ptOld = point ;
      dc.SelectObject(pOldPen);
     }
     CView::OnMouseMove(nFlags, point);
    }
      

  10.   


    按照你的这样我每次都要moveTo下一条线的起点,非常麻烦的。
      

  11.   

    哦,GDI+刚听说,查下他的资料。谢谢了