各位大能,本人想做个画图之类的功能,有画笔可以调大小,有橡皮搽;只求思路!
请问:1、橡皮擦功能如何实现啊;
      2、如何记录笔迹;说明:因为我所使用的VCL,如果每次窗体重绘都会清除掉所画的笔迹;
谢谢大家!

解决方案 »

  1.   

    把你画的每个部件用tlist保存起来,再显示
      

  2.   

    开始我也是考虑TLIST,只是有些问题没有弄明白,比如,可以用TLIST保存笔迹,每次重绘重新画,如何安排TLIST也是个问题,还有就是橡皮的作用效果如果反应到TLIST中
      

  3.   

    这是我写的一个手写输入法的部分源代码,同你的要求类似:
    你放一个 TPAINTBOX 在 form1 上,代码自己写入述代码吧
    type
      //手写相关
      TPOINTREC = Record
        pX  : Smallint ;
        pY  : Smallint ;
        pIs : Smallint ;    //== 1 标志终点 否则为 0
      End ;  TfrmVODMain = class(TForm)
      ...
      public
          //手写相关
        IsWriting : Boolean ;
        IsMoving  : Boolean ;
        PointList : TList ;
         //手写相关
        Procedure ClearImagePad ;
        Procedure ClearPointList ;
        Procedure ReDrawTrack ;
      end;
    procedure TfrmVODMain.PaintBox1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var
      tmpPoint : ^TPOINTREC ;
    Begin
      IsWriting := True ;
      IsMoving  := False ;
      New( tmpPoint ) ;
      tmpPoint.pX  := X ;
      tmpPoint.pY  := Y ;
      tmpPoint.PIs := 0 ;
      PointList.Add( tmpPoint ) ;
      PaintBox1.Canvas.MoveTo( X, Y ) ;
      glLastClickTime:=Now ;  //mouse hook 无效
      TimerHandWrite.Enabled :=False ;
    End ;procedure TfrmVODMain.PaintBox1MouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    Var
      tmpPoint  : ^TPOINTREC ;
    Begin
      IsMoving := True ;
      case IsWriting of
      True:
        If ( X>=0 ) And ( Y>=0 ) And ( X<=PaintBox1.Width ) And ( Y<=PaintBox1.Height ) Then
        Begin
          PaintBox1.Canvas.LineTo( X, Y ) ;
          New( TmpPoint ) ;
          tmpPoint.pX  := X ;
          tmpPoint.pY  := Y ;
          tmpPoint.PIs := 0 ;
          PointList.Add( tmpPoint ) ;
        End;
      False:
        begin
        end;
      end;
    End ;procedure TfrmVODMain.PaintBox1MouseUp(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    Var
      tmpPoint : ^TPOINTREC ;
    Begin
      glLastClickTime:=Now ;
      IsWriting:=False ;
      If ( Not IsWriting ) And ( IsMoving ) Then
      Begin
        New( tmpPoint ) ;
        tmpPoint.pX  := X ;
        tmpPoint.pY  := Y ;
        tmpPoint.pIs := 1 ;
        PointList.Add( tmpPoint ) ;
        IdentifyTrack ;
      End ;End ;
    //==清空书写画布
    //==============================================================================
    Procedure TfrmVODMain.ClearImagePad ;
    Begin
      PaintBox1.Refresh ;
    End ;//==清除轨迹点列表内容
    //==============================================================================
    Procedure TfrmVODMain.ClearPointList ;
    Var
      I : Integer ;
      TmpPoint : ^TPointRec ;
    Begin
      For I:=PointList.Count-1 DownTo 0 Do
      Begin
        TmpPoint := PointList.Items[I] ;
        PointList.Delete( I ) ;
        if TmpPoint<>nil then
        begin
          Dispose( TmpPoint ) ;
          TmpPoint:=nil ;
        end;
      End ;
      PointList.Clear ;
    End ;//==
    //==============================================================================
    Procedure TfrmVODMain.ReDrawTrack ;
    Var
      i : Integer ;
      endFlag  : Boolean ;
      tmpPoint : ^TPointRec ;
    Begin
      ClearImagePad ;
      If PointList.Count<=0 Then Exit ;
      endFlag := True ;
      For I:=0 To PointList.Count-1 Do
      Begin
        tmpPoint := PointList.Items[I] ;
        If endFlag Then
        Begin
          PaintBox1.Canvas.MoveTo( tmpPoint.pX, tmpPoint.pY ) ;
          endFlag := False ;
        End
        Else
        Begin
          PaintBox1.Canvas.LineTo( TmpPoint.pX, TmpPoint.pY ) ;
        End ;
        If tmpPoint.pIs=1 Then endFlag := True ;
      End ;
    End ;procedure TfrmVODMain.FormCreate(Sender: TObject);
    begin
       //手写相关
      PointList := Tlist.Create ;
    end;
      

  4.   

    定义线 ,圆,长形,折线这些对象,用来保存所做的操作。然后将这些对象按顺序保存到 List.重次重绘时按保存的参数绘制就OK了。
      

  5.   

    感谢楼上的朋友解答,对于楼上我要说的就是,如果使用橡皮擦你们怎么样定义LIST,因为之前已经有了绘制的线条,而且橡皮擦无法知道擦除哪点?
      

  6.   

    用TList保存元素重绘的方式适用于矢量图,橡皮擦不适用于矢量图,你需要的是用一个TImage/TBitmap在后台保存画面,随时重绘到窗体的Canvas上。
      

  7.   

    LZ可以参考下:
    http://topic.csdn.net/u/20110331/02/D6330B1C-B4B3-4DF1-836F-CB08B48EDFE9.html#r_73340803