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 那不是把所画的线设为屏幕色了,不时应该什么线都画不出来啊?谢谢高手指点下!
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 那不是把所画的线设为屏幕色了,不时应该什么线都画不出来啊?谢谢高手指点下!
在Image1MouseMove最后加上invalidate
1.每次画图先invalidate,使整个区域无效,然后重绘,这样的话在频繁处理大量图形时会引起严重的闪烁
2.取反画图,像1楼说的可以设成pmNotXor或者pmNot或者pmXor,但是设置不同的样式时需要注意设置color,仔细看下penmode的帮助你就会明白的