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

解决方案 »

  1.   

    DrawCell只重画一个单元格,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;
      

  3.   

    小弟愚钝,我试了DrawCell中,结果是不停的重画,放在paint中,我只要点该控件的滚动条几次就出错.
    sendmessage(form.handle, WM_SETREDRAW, 1, 0);
    我改成
    sendmessage(self.handle, WM_SETREDRAW, 1, 0);
    能具体点吗?
    invalidate 能说下吗?
      

  4.   

    DrawCell如果我没记错的话,每绘制一个单元格就会触发一次,所以如果你不判断里面的ACol和ARow的话,那么如果有20个格子,相当于要重画20次,当然速度很慢。
      

  5.   

    如果绘画量大的画 
    可以考虑用TBitmap 在内存里画
    然后BitBlt到你的控件上来
      

  6.   


    这个在stringgrid中比较难实现吧
      

  7.   

    下面是我在DrawCell事件中画格式化浮点数的代码,,应该是与继承DrawCell方法差不多的代码,贴在下面供参考: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;
      

  8.   

    多谢大家,特别是阿发伯同志.我已经把大部分绘画代码移动到paint中,速度提上来了,就是快速度滚动会出现白斑点,可能是算法问题,我觉的这问题不错,所以还不想那么快结帖,请大家谅解!
      

  9.   

    麻烦个人到http://topic.csdn.net/u/20091102/17/a70d812b-b85f-420c-86f0-51231cb5f605.html回个帖 我好结帖,因为自己不能给自己分.