俺继承stringgrid 加了一些代码 ,发现在DrawCell(ACol, ARow: Integer; ARect: TRect;AState: TGridDrawState)中写太复杂代码的话,重画超级慢,我把代码放到paint里面速度是提高了不少,但是效果还是不理想,请问delphi中有什么好的方法可以提高canvas的作图效率吗?有时候我还发现第一次并不虽然执行了paint但是画面没有出来,需要2次执行才可以,请知道的告诉下重画中代码的执行顺序,谢谢!分不够你就说^_^
调试欢乐多
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;
sendmessage(form.handle, WM_SETREDRAW, 1, 0);
我改成
sendmessage(self.handle, WM_SETREDRAW, 1, 0);
能具体点吗?
invalidate 能说下吗?
可以考虑用TBitmap 在内存里画
然后BitBlt到你的控件上来
这个在stringgrid中比较难实现吧
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;