关于Invalidate函数的问题??高手请进! 自己用VC开发了一个ActiveX控件,类似于钟表,用于实时显示,开发过程中使用了双缓冲区,屏幕无闪烁;但,因为在控件内调用InvalidateControl()太过频繁(大约5毫秒一次),所以CPU占用率到了100%造成实时显示的效果不理想,请问如何解决啊! 简单的说就是Invalidate()调用过于频繁时,造成CPU负荷的问题怎么解决?谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这种情况建议不要用双缓冲了,采用xor 方式绘制 你为何要如此频繁的调用 Invalidate 是啊,我作的控件是用在实时显示上,必须5mm刷新一次啊!有什么办法吗??什么是XOR方式? 就是不要用invalidate,直接用反色画下原来的图案,就是恢复成底色,然后画新的东西 啊? 有例子吗?各位好汉,意思是把画笔改成底色再画一遍吗?这就是XOR方式吗? Invalidate()只是设置无效区域,并不会马上引发重画你应该仔细检查画的动作,尽量减少画的区域 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);和这个类似,你参考一下 我晕你在OnPaint的时候画不就得了 同意用XOR方式,主要用于绘制钟表的指针。再画指针的下一个位置前,先在当前的位置上再画一次用XOR方式,就会恢复到原来的状态。 TO: kimryo(我有一个梦想...) 在OnPaint()里画是什么意思?不会导致CPU100%吗? TO: teli_eurydice(哭泣的仙人掌。) 多谢!按照你的方法的确可以解决我的问题,但新问题又出来了!我的程序有多个页面(Dialog),靠showwindow(SW_SHOW )和SW_HIDE显示不同的页面按你的方法,现在即使我切换到其它页面时,仍然可以看到activex控件的指针(只有指针)在摆来摆去,好恐怖啊!!好像指针什么也挡不住!!请赐教!!谢谢 保存编辑框中实时显示的数据问题,只保存了最后一次的数据. ffdshow设置问题 界面 VC小问题求解,急... vc6读写webservice时如何传递结构体参数 我想禁用键盘的win键,有什么提示吗?(50分) 在线求救!关于LNK2001 怎么设置控件的字体? 请问调用同一个DLL中的函数,为什么在RELEASE下没问题,在DEBUG却会崩溃掉? CFORMVIEW??? 如何取Session中的值? 求助一个导出类的问题!
有什么办法吗??什么是XOR方式?
这就是XOR方式吗?
你应该仔细检查画的动作,尽量减少画的区域
//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);和这个类似,你参考一下