-
Delphi(Pascal) code
-
if not self.doubleBuffered then self.doubleBuffered: = true
解决了一些问题,现在有个新问题
就是我控件里面有个变量,比如说
private
...
FPanel :TPanel;
然后控件的构造函数中,我也写了
..
FPanel:=Tpanel.Create(self);
if not Fpanel.doublebuffered then
Fpanel.doubleBuffered:=true;
..
结果pannel还是闪个不停,晕了,我看了先资料,是C#的
如果你在Form中绘图的话,不论是不是采用的双缓存,都会看到图片在更新的时候都会不断地闪烁,解决方法就是在这个窗体的构造函数中增加以下三行代码:
我想问delphi中怎么办。我已经用了双缓冲了,可是还是闪烁。
各位有没有好的办法???
/
我基本上每个控件只要一创建,或者一引用的会像我上面的说的那样判断 doublebuffered的值,不为true,然后弄成true
所以Fpanel的容器类,或者放在FPanel里面的类,只要有doublebuffered属性的我都判断了的,我看了下,闪烁,的确是panel在闪,因为闪出来的白条,是贯穿整个pannel的
我也再看看代码,现在看来要参考下cnpack的代码了
/
不用delphi很多年, 不过这个问题还是要说一句, 闪烁跟什么双缓冲一点关系也没有, 为什么会有闪烁, 是因为有色差, 你的窗口背景色和绘图颜色有色差, 当然会闪了, 哪怕是用十缓冲, 也一样照闪不误。
此问题在vc中的解决方法如下:
BOOL CMyView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
return CView::OnEraseBkgnd(pDC);
}
这样窗口背景刷子为NULL, 自己绘图时先用自己的背景色FillRect一下就ok了, 即使是不用双缓冲, 直接在窗口dc上绘图, 也一点不闪。
不过我刚刚试了下, 在delphi中直接处理WM_ERASEBKGND达不到目的, SetClassLong修改窗口背景刷子也不行, 看来vcl是对窗口背景色有特殊的处理。
接下来就要delphi高手来弄了, 反正解决这个问题的根本就是阻止delphi用窗口默认背景色重绘。
来源:http://blog.sina.com.cn/s/blog_4ca9ceef0100exoh.html