procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if Drawing then
  begin
    DrawShape(Origin, MovePt, pmNotXor);
    MovePt := Point(X, Y);
    DrawShape(Origin, MovePt, pmNotXor); end;
-----
procedure TForm1.DrawShape(TopLeft, BottomRight: TPoint; AMode: TPenMode);
begin
    Drawing:=true;
   Image1.Canvas.Pen.Mode :=  AMode;  //使上次绘制的图形颜色变成了屏幕颜色,从而达到“橡皮擦”的效果。
  case DrawingTool of
      dtLine:
        begin
           Image1.Canvas.MoveTo(TopLeft.X, TopLeft.Y);
           Image1.Canvas.LineTo(BottomRight.X, BottomRight.Y);
        end;
------
画图程序的用意是每次擦除上一次画的线
但每次调用都要先运行到Image1.Canvas.Pen.Mode :=  AMode  那不是把所画的线设为屏幕色了,不时应该什么线都画不出来啊?谢谢高手指点下!

解决方案 »

  1.   

    为什么是屏幕色????????????这里是AMode = pmNotXor。  执行两次就跟没执行一样,所以达到橡皮擦的效果。
      

  2.   

    是因为没刷新
    在Image1MouseMove最后加上invalidate
      

  3.   

    两种方法:
    1.每次画图先invalidate,使整个区域无效,然后重绘,这样的话在频繁处理大量图形时会引起严重的闪烁
    2.取反画图,像1楼说的可以设成pmNotXor或者pmNot或者pmXor,但是设置不同的样式时需要注意设置color,仔细看下penmode的帮助你就会明白的