读书人

怎么提高canvas效率

发布时间: 2012-02-21 16:26:23 作者: rapoo

如何提高canvas效率?
俺继承stringgrid 加了一些代码 ,发现在DrawCell(ACol, ARow: Integer; ARect: TRect;AState: TGridDrawState)中写太复杂代码的话,重画超级慢,我把代码放到paint里面速度是提高了不少,但是效果还是不理想,请问delphi中有什么好的方法可以提高canvas的作图效率吗?有时候我还发现第一次并不虽然执行了paint但是画面没有出来,需要2次执行才可以,请知道的告诉下重画中代码的执行顺序,谢谢!分不够你就说^_^

[解决办法]
DrawCell只重画一个单元格,paint是重画整个
[解决办法]
先进制重绘,最后再一次过绘画
[解决办法]
进制->禁止
[解决办法]

Delphi(Pascal) code
procedure DrawCell(xxxx);begin  sendmessage(form.handle, WM_SETREDRAW, 0, 0);  try    //draw xxxxx;  finally    sendmessage(form.handle, WM_SETREDRAW, 1, 0);    redrawwindow(form.handle, nil, 0, RDW_ALLCHILDREN + RDW_UPDATENOW + RDW_INVALIDATE);  end;end;
[解决办法]
一般就是用这种方法来禁止控件刷新,然后再一次过刷新了。

不过试过下,这里确实效果不好。
[解决办法]
DrawCell如果我没记错的话,每绘制一个单元格就会触发一次,所以如果你不判断里面的ACol和ARow的话,那么如果有20个格子,相当于要重画20次,当然速度很慢。
[解决办法]
如果绘画量大的画
可以考虑用TBitmap 在内存里画
然后BitBlt到你的控件上来
[解决办法]
一样可以的,绘画的算法优化,可以把代码贴出来看看。
[解决办法]
下面是我在DrawCell事件中画格式化浮点数的代码,,应该是与继承DrawCell方法差不多的代码,贴在下面供参考:
Delphi(Pascal) code
procedure TMainForm.StringGrid1DrawCell(Sender: TObject; ACol,  ARow: Integer; Rect: TRect; State: TGridDrawState);var  r: TRect;  Text: string;  x: Integer;begin  with StringGrid1 do  begin    Text := Cells[ACol, ARow];    if Text = '' then Text := '0.00'    else    begin      x := Pos('.', Text);      if x < 1 then Text := Text + '.00'      else if x = 1 then Text := '0' + Text;    end;    r := TRect(Rect);    Canvas.FillRect(r);    Canvas.Pen.Color := clBtnShadow;    Canvas.Rectangle(r);    InflateRect(r, -2, -2);    DrawText(Canvas.Handle, PChar(Text), Length(Text), r, DT_RIGHT);  end;end;procedure TMainForm.StringGrid1GetEditText(Sender: TObject; ACol,  ARow: Integer; var Value: String);var  v: Double;begin  if Value = '' then v := 0.0  else v := StrToFloat(Value);  Value := Format('%.2f', [v]);end;
[解决办法]
不会 TCanvas ,路过学习,顺便帮顶
[解决办法]
楼主参考阿发伯的代码

读书人网 >.NET

热点推荐