曾经改写过 xp-menu 皮肤控件,但是,因为这个控件问题太多了,
为了保证系统的稳定性,所以还是要放弃他!自己写了一些挺漂亮的控件,但是,
改写 TEdit时,遇到了一个刷新显示有点慢的问题!??
如果界面上 这个控件很多(20个)的话,显示有点慢!
主要改写如下:截获:procedure WMPaint(var Message:TWMPaint); message WM_PAINT;procedure TdbEdit_A.WMPaint(var Message: TWMPaint);
var DC : hDc;  Canvas:TCanvas ;
begin
   inherited ;
   try
      DC := GetWindowDC(Handle);
      Canvas:=TCanvas.Create ;
      Canvas.Handle:=dc;
    
      // 1、把外一层黑色边框线替换成 自定义颜色
      Canvas.Brush.Style := bsClear;
      Canvas.Pen.Color := FBorderColor;
      Canvas.Pen.Width := 1;
      Canvas.Rectangle(0,0,self.Width,self.Height);      // 2、如果3D,TEDIT是有内阴影的,把内阴影变成TEDIT框内颜色
      Canvas.Pen.Color := Color;
      Canvas.Pen.Width := 1;
      Canvas.Rectangle(1,1,self.Width-1,self.Height-1);
      Canvas.Free ;
   except
   end ;
end ;

解决方案 »

  1.   

    將窗體的  Self.DoubleBuffered := True;
      

  2.   

    將窗體的  Self.DoubleBuffered := True;不行,不过改控件本身的
    Self.DoubleBuffered := True;就没有那么闪了!
      

  3.   

    XP Menu还是不错的,新版本的让IDE死掉的问题也由人解决了,搂主还发现了什么问题?
      

  4.   

    var 
    DC : hDc;  
    Canvas:TCanvas ;
    将这个定义到控件的 Private 中是不是可以避免每次都取值和创建呀??WM_PAINT事件发生的频率非常高,不停的在堆上创建释放可以会有一定的影响吧.
    Canvas.Pen.Color := Color;
    Canvas.Pen.Width := 1;
    Canvas.Rectangle(1,1,self.Width-1,self.Height-1);这时用 With 可能更好,好象编程器会生成更优化的代码(没有测试过,但起码写成这样更好看).Canvas.Pen.Color := Color;
    如果写成if Canvas.Pen.Color <> Color then
      Canvas.Pen.Color := Color;会更快吧,判断总比执行快很多,因为大多数时间都是相等的,但赋值的时候你看看TEdit的源代码是不是还执行了很多别的操作.Canvas.Pen.Width := 1; 和  Canvas.Rectangle(0,0,self.Width,self.Height);也做同样的优化。
    try
    except
    end ;也去掉吧,没有用呀.
      

  5.   

    if Canvas.Pen.Color <> Color then
      Canvas.Pen.Color := Color;这代码可以更优化一下,我看了Canvas.Pen.Color的实现,Color 是用GetColor取得的。可以定义一个FPenColor ,
    if FPenColor  <> Color then
    begin
      FPenColor  :=Color;
      Canvas.Pen.Color := FPenColor  ;
    end;Canvas.Pen.Width也一样.用空间换点速度.
      

  6.   

    楼上分析的有道理,呵呵
    try except影响效率的
      

  7.   

    ZyxIp(绝望中...) : 好主意!!!谢谢大家!