诸位,我从来没有接触过VC中的画图,尤其对图形的重绘比较害怕。我老板给的任务是写一个监测系统,以曲线方式动态显示系统的状态,图中有四个坐标系,每个坐标系中有四个动态的曲线,现在我的动态曲线已经出来了,可是当它最小化或者改变窗口大小或者被别的窗口覆盖再移开时,我画的东西都不见了。
    后来才知道有重绘的概念,我手头没有资料,请大家帮忙,听说是要在onpaint或者ondraw里重画,到底用那个?有什么区别?是不是在动态画图的过程中时刻记录窗口中的点的坐标?那么多点时刻要记录下来怎么记啊?
    我真是个菜鸟,大家打我吧,一点都不会。
    请大家发言帮助我,给我思路也行,有代码当然更好,有例子发
     衷心的感谢大家,我会铭记大家对我的帮助。

解决方案 »

  1.   

    在OnSize中调用:
    CRect rc;
    GetClientRect(rc);
    InvalidateRect(rc);在OnDraw中绘图,在需要刷新的地方调用Invalidate()即可.
      

  2.   

    一般情况下,重绘在客户区失效(比如窗口大小改变,遮挡窗口的障碍物移走等)时发生,这时,需要通知程序客户区失效(这样,在下一个WM_PAINT到来时就会重绘失效的客户区),可以实现该功能的函数有CWnd::Invalidate(BOOL bErase = TRUE ),CWindow::InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );
    CWnd::InvalidateRgn( CRgn* pRgn, BOOL bErase = TRUE );等等
    如果在frame/document/view中,还有CDocument::UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL );
    如果想高效的重绘,就需要明确需要重绘的区域,然后以合适的函数调用上述函数.
      

  3.   

    OnDraw()
    OnSize()函数
    invalidate会自动调用OnDraw()函数
    窗口大小改变会自动调用OnSize()函数
    建议你用OnDraw()
      

  4.   

    InvalidateRect()
    UpdateWindow( )
      

  5.   

    楼主绘图的时候一定要放在OnDraw里面用它的CDC* pDC来绘图,这样客户区在被遮挡以后
    是会自动来调用OnDraw重绘的
      

  6.   

    请问各位,是否画曲线都要在OnDraw里画?而不需要另外专门定义一个函数来画图?
      

  7.   

    你把画图的代码都放到OnPaint中就行了
      

  8.   

    OnPaint是最基本的消息,如果你用了MFC的CView或者基于CView类的派生类调用Ondraw会更好
      

  9.   

    OnPaint 和 OnDraw基本上没什么区别,唯一的区别就是在做打印的时候
      

  10.   

    先画到内存位图中,再把位图画到窗口上,并在OnPaint中加入把位图画到窗口上的代码。
    这才是正路。
      

  11.   

    OnPaint()和OnDraw()都行,在你想刷新时调用invalidate()就行了。
      

  12.   

    OnPaint()
    view 里是OnDraw()
    刷新时调用invalidate()
    指定区域用invalidateRgn()InvalidateRect()
      

  13.   

    其实ondraw()调用的也是OnPaint()
    文档结构的程序可以参考scribble示例
      

  14.   

    其实ondraw()调用的也是OnPaint()误导:OnPaint()调用OnDraw()。