我现在有这样的一个东西
TRPanel = class(TCustomControl)
里面有些东西。
在create 事件里面设置color:=$003F2812然后我在我的窗体Form1的acitveChanged事件中
写了个 RPanel1.repaint;问题就出来了 ,form1的actvie只要不停的变,这个控件就会出现白条。我应经设置了doublebuffered:=true;了
然后想了下是不是背景擦除的问题或者重载paint事件?希望高手指点。指出病根,给出药方。熟路给我讲讲WM_ERASEBKGND,我在网上下了几个代码,什么注释都没有,很生硬。所以希望有人生动有趣地给我讲讲,哈哈。

解决方案 »

  1.   

    procedure TRPanel.WMEraseBkgnd(var Message: TWMEraseBkgnd);
    begin
      Message.Result:=1;
    end;这样写了后,不像之前那样闪白条了,现在闪的是黑条,没有以前那样刺眼了。不过仔细看还是能看见那个黑条在闪动。
      

  2.   

    最近工作搞一个控件,界面比较花哨,所以闪屏,双缓冲,结果一些问题。ps:delphi双缓冲的最简单方法直接设置:doubleBuffered:=true;注意这个属性只有继承自TCustomControl的才有。所以使用的时候一定要看看类的继承图。 正题,结果还有一个面板在闪,我已经设置了doublebuffered了。网上看了些资料,结合自己的情况,这个面板的没有用DRaw方法在上面绘图,直接设置的背景色,这个和网上说的擦除有一定的关系。PS://----------------------------------------------------------------------窗口重绘时,会先发送WM_ERASEBKGND,再发送WM_PAINT,前者负责刷背景为底色,后者负责绘图。正因为窗口重绘的两次绘图操作,才造成了画面闪烁的结果。 双缓冲的意义和方法: 
    将两次绘图操作并为一次,即可结果闪烁的问题。 
    所以首先响应WM_ERASEBKGND,直接返回TRUE或者FALSE都可以,不要做多余的动作。 
    在WM_PAINT的响应函数里面(文档类在OnDraw()里面),先创建一张大小合适的位图和一个兼容的内存DC,将位图选到内存DC里面,将此内存DC刷为背景色,所有绘图操作往它身上砸,砸完以后,用BitBlt一次性画到窗口DC上即可解决闪烁问题。 关键: 
    尽量减少对窗口DC的操作次数!//-----------------------------------------------------------------------------上面的话不是我说的。解决方法:重载procedure  WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;把这句写在类的声明区域 然后ctl+shift+c(别说你没有用过这个组合键)。procedure TRight2BarControl.WMEraseBkgnd(var Message: TWMEraseBkgnd);
    begin
        Message.Result:=1;
    end; 这样写了,果然有变化,之前面板闪的是白条,现在是黑条了,因为面板是深灰色滴,所以黑条没有那么刺眼。可是不能就这样结束了。 继续分析代码,发现要这个控件重绘的代码是:ffff.repaint;然后继续看repaint方法,结果发现这个没有重载,他直接用的TWinControl的repaint方法procedure TWinControl.Repaint;
    begin
      Invalidate;
      Update;
    end; 先屏蔽ffff.repaint;发现果然面板什么事都不敢了,连我们想要他干的他也不干了。 ok,重载他procedure repaint;override;  ctrl+shift+c 现在在里面写上我想要的效果,就四边的边缘 绘图,中间区域什么都不弄,好滴,果然不闪了。搞了这么多天终于搞定了。