我想通过SetTimer对view不断重绘,
可是如果我把程序最小化,又最大化后
,怎样才能使最大化保持原来的值,而且获得最新得值?意思就是 最小化后绘图程序仍然在执行,
是不是要用线程控制??

解决方案 »

  1.   

    最小化后绘图程序仍然在执行,是的,程序仍在执行。
    SetTimer()本身就是子线程了。
      

  2.   

    可是我发现最小化之后,还是要重绘屏幕,虽然背景是还有的(因为在onDraw里面
    定义了背景),
    但要在这个背景表面绘图,比如a时刻会的图是从(0,0)到(8,8)了
    ,b时刻最小化,c时刻最大化,可以看到图是(9,9)到(10,10)了,
    也就是前面的被刷掉了。怎么办?
      

  3.   

    这不可能实现,OnDraw()是要重画时就运行的.最大化时OnDraw就重画了.除非你在画(9,9)到(10,10)的时候也画(0,0)到(8,8)等等.....
      

  4.   

    我在Ontimer里面进行自己的绘制阿。OnDraw始终都是绘背景而已,从来
    没变化,不论最小化最大化。
    我在OnTimer里面进行自定义绘画,问题是最大化时自定义绘画(0,0)(8,8)没有了。
    是不是可以通过双缓冲,每个时刻都把自己当前的“模样“copy到
    缓冲区,然后最大化时把缓冲区显示,同时进行自定义绘画呢?
    可是这样好像少了实时。
      

  5.   

    我在Ontimer里面进行自己的绘制阿。
    是的,你自己绘制,但在最大化时系统自动又调用了OnDraw()函数,把你以前的全部又重画了,则覆盖了。我提一个建议给你,你可以用一个数组,把你的(0,0)(8,8)等等全部放在那里,然后SetTeimr()就全部执行一遍,同时把你的画圆代码写在画背景的语句后面,就是放在OnDraw()函数里面,这样或许可以解决你的问题。
      

  6.   

    http://expert.csdn.net/Expert/topic/1528/1528912.xml?temp=.6142542
      

  7.   

    绘图从来都不应该在OnDraw中,应该用双缓冲机制.在Ontimer中对memDc绘图,在OnDraw中直接调用BitBlt就可以了.
    和实时一点关系都没有.OnTime()
    {
      memDc.LineTo(..);
      ...
    }OnDraw()
    {
     dc.BitBlt(0, 0, cx, cy, &memDc, 0, 0, SRCCOPY);
    }就可以了,从来没有程序会去记录点的数据.
      

  8.   

    对了,根本不用在OnTime()中进行绘图,一般在你需要绘图时
    就对memDc进行操作.在OnDraw中重新通过BitBlt就可以.
      

  9.   

    verybigbug() ,有救了,你做过这些示例把?能给个例子给我吗?谢谢
      

  10.   

    CMyDialog::OnInitDialog()
    {
      CDC* pDc = GetDC();
      m_memDc.CreateCompatibleDC(pDc);
      m_memBitmap.CreateCompatibleBitmap(pDc, 1024, 768);
      m_memDc.SelectObject(&m_memBitmap);
      .....
    }CMyDialog::OnMouseMove(...)
    {
      m_memDc.MoveTo(x1, y1);
      m_memDc.LineTo(x2, y2);
      ...
    }CMyDialog::OnPaint()
    {
       ...
       dc.BitBlt(0, 0, 1024, 768, &m_memDc, 0, 0, SRCCOPY);
       ...
    }