就是在Timage中画了个矩形,然后移动它,我无法擦除移动时的阴影,而且在移动时,鼠标动一下,图像移动比例很大,而不是1:1的距离。分不够另外给。谢谢

解决方案 »

  1.   

    用Xor来擦除。var
        X:integer;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
        Image1.Canvas.Rectangle(X,100,X+100,200);
        inc(X,10);
        Image1.Canvas.Rectangle(X,100,X+100,200);
    end;procedure TForm1.FormActivate(Sender: TObject);
    begin
        Image1.Canvas.Pen.Color:=clRed;
        Image1.Canvas.Pen.Mode:=pmXor;
        Image1.Canvas.Brush.Style:=bsClear ;
        Image1.Canvas.Rectangle(X,100,X+100,200);
    end;
      

  2.   

    有没有在MouseMove中进行处理的
      

  3.   

    跟随Mouse 的位置吗?
    想要Rectangle和鼠标的位置有什么关系呢?
      

  4.   

    就是鼠标移动时,Rectangle也跟着移动
    我用你的代码试了下,还是有点问题,你可以试下
    procedure TfrmMain.FormActivate(Sender: TObject);
    begin
        imgTime.Canvas.Pen.Color:=clRed;
        imgTime.Canvas.Pen.Mode:=pmXor;
        imgTime.Canvas.Brush.Color := clRed;
        //imgTime.Canvas.Brush.Style:=bsClear;
        imgTime.Canvas.Rectangle(0,100,100,200);
        OldPoint := Point(0,100);
    end;procedure TfrmMain.imgTimeMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
        if IsDraw then
        begin
        imgTime.Canvas.Pen.Color:=clRed;
        imgTime.Canvas.Pen.Mode:=pmXor;
        imgTime.Canvas.Brush.Color := clRed;
        imgTime.Canvas.Rectangle(OldPoint.X,100,OldPoint.X+100,200);
        OldPoint := Point(X,Y);
        imgTime.Canvas.Rectangle(OldPoint.X,100,OldPoint.X+100,200);
        end;
    end;procedure TfrmMain.imgTimeMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
        imgTime.Canvas.Brush.Color := clWhite;
        imgTime.Canvas.Pen.Color:=clWhite;
        imgTime.Canvas.Pen.Mode:=pmCOPY;
        imgTime.Canvas.Rectangle(0,100,100,200);
        OldPoint := Point(0,100);
        IsDraw := True;
    end;procedure TfrmMain.imgTimeMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
        IsDraw := False;
    end;
      

  5.   

    是你的逻辑有一点点乱,把你的代码改一改,看看是否满足你的要求:procedure TForm1.imgTimeMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
        imgTime.Canvas.Pen.Color:=clRed;
        imgTime.Canvas.Pen.Mode:=pmXor;
        imgTime.Canvas.Brush.Color := clRed;
        imgTime.Canvas.Rectangle(OldPoint.X,OldPoint.Y,OldPoint.X+100,OldPoint.Y+100);
        OldPoint := Point(X,Y);
        imgTime.Canvas.Rectangle(OldPoint.X,OldPoint.Y,OldPoint.X+100,OldPoint.Y+100);
        IsDraw := True;
    end;procedure TForm1.imgTimeMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
        IsDraw := False;
    end;procedure TForm1.imgTimeMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
        if IsDraw then
        begin
            imgTime.Canvas.Rectangle(OldPoint.X,OldPoint.Y,OldPoint.X+100,OldPoint.Y+100);
            OldPoint := Point(X,Y);
            imgTime.Canvas.Rectangle(OldPoint.X,OldPoint.Y,OldPoint.X+100,OldPoint.Y+100);
        end;
    end;procedure TForm1.FormActivate(Sender: TObject);
    begin
        imgTime.Canvas.Pen.Color:=clRed;
        imgTime.Canvas.Pen.Mode:=pmXor;
        imgTime.Canvas.Brush.Color := clRed;
        OldPoint := Point(0,100);
        imgTime.Canvas.Rectangle(OldPoint.X,OldPoint.Y,OldPoint.X+100,OldPoint.Y+100);
    end;
      

  6.   

    可以做一个缓冲,就是背景图作一个缓冲,每次刷到Image上去的时候就用背景图和方框合成一下。鼠标运动可以强制Image刷新,合成刷图的程序放在image的onpaint事件立面处理。