曾经改写过 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 ;
为了保证系统的稳定性,所以还是要放弃他!自己写了一些挺漂亮的控件,但是,
改写 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 ;
解决方案 »
- 如何将Image中的图片按照指定的尺寸打印出来
- 我想问下delphi的路子
- 如何判断一按钮或其他按件的单击事件是否存在?
- 广州程序员购买技术书籍大调查.
- 比较菜的问题!如何动态地改变 TreeView 里面的内容?
- 如何得到一个目录中的所有子目录的名称?
- 关于字符加密问题?
- DataBase在NT Service程序怎么用?要多少分我给多少分!
- 怪怪怪!!!!在使用MKDir函数后才出现这个错误。如果在程序中不使用该命令,则不会出现错误。
- ?没有人会吗??''假如dbgrid的第一列失去焦点'' 这句话如何用delphi语句表示---if dbgrid1.column[0].????????
- Delphi IDE中的问题
- 如何判断一个TTable是在DisableControls状态?
Self.DoubleBuffered := True;就没有那么闪了!
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 ;也去掉吧,没有用呀.
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也一样.用空间换点速度.
try except影响效率的