自己用VC开发了一个ActiveX控件,类似于钟表,用于实时显示,开发过程中使用了双缓冲区,屏幕无闪烁;但,因为在控件内调用InvalidateControl()太过频繁(大约5毫秒一次),所以CPU占用率到了100%造成实时显示的效果不理想,请问如何解决啊!    简单的说就是Invalidate()调用过于频繁时,造成CPU负荷的问题怎么解决?谢谢!

解决方案 »

  1.   

    这种情况建议不要用双缓冲了,采用xor 方式绘制
      

  2.   

    你为何要如此频繁的调用 Invalidate
      

  3.   

    是啊,我作的控件是用在实时显示上,必须5mm刷新一次啊!
    有什么办法吗??什么是XOR方式?
      

  4.   

    就是不要用invalidate,直接用反色画下原来的图案,就是恢复成底色,然后画新的东西
      

  5.   

    啊? 有例子吗?各位好汉,意思是把画笔改成底色再画一遍吗?
    这就是XOR方式吗?
      

  6.   

    Invalidate()只是设置无效区域,并不会马上引发重画
    你应该仔细检查画的动作,尽量减少画的区域
      

  7.   

    int nSave = dc.SaveDC();
    //int nPrevMode;
    //nPrevMode = dc.SetROP2(R2_NOT);
    dc.SetROP2(R2_XORPEN);
    CPen pen(PS_DOT, 0, RGB(0, 0, 0xFF));
    dc.SelectObject(pen); if ( TRUE == m_bSetPtLast)
    {
    dc.MoveTo(m_ptLast.x, rcClinet.top);
    dc.LineTo(m_ptLast.x, rcClinet.bottom);
    dc.MoveTo(rcClinet.left, m_ptLast.y);
    dc.LineTo(rcClinet.right, m_ptLast.y); 
    }
    dc.MoveTo(point.x, rcClinet.top);
    dc.LineTo(point.x, rcClinet.bottom);
    dc.MoveTo(rcClinet.left, point.y);
    dc.LineTo(rcClinet.right, point.y); m_bSetPtLast = TRUE;
    m_ptLast = point; //dc.SetROP2(nPrevMode);
    dc.RestoreDC(nSave);和这个类似,你参考一下
      

  8.   

    我晕你在OnPaint的时候画不就得了
      

  9.   

    同意用XOR方式,主要用于绘制钟表的指针。再画指针的下一个位置前,先在当前的位置上再画一次用XOR方式,就会恢复到原来的状态。
      

  10.   

    TO:  kimryo(我有一个梦想...) 在OnPaint()里画是什么意思?不会导致CPU100%吗?
      

  11.   

    TO: teli_eurydice(哭泣的仙人掌。) 多谢!按照你的方法的确可以解决我的问题,但新问题又出来了!我的程序有多个页面(Dialog),靠showwindow(SW_SHOW )和SW_HIDE显示不同的页面按你的方法,现在即使我切换到其它页面时,仍然可以看到activex控件的指针(只有指针)在摆来摆去,好恐怖啊!!好像指针什么也挡不住!!请赐教!!谢谢