这是我在stackoverflow中的第一个问题,我在发布之前已经在网上搜索了所有内容,所以你们是我的最后一次机会
我正在使用Canvas和MoveTo(X,Y)方法在Delphi xe5中制作一个包含足球场(TImage)画线的小程序,一切都很棒
但我的问题是我想在绘制下一行之前擦除更多的线,所以我不能同时拥有两条线,我该怎么做?
这是我用于绘制线条的代码片段:
procedure TForm2.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
Line: Integer = 0;
begin
if Line = 0 then begin
Canvas.MoveTo(X,Y);
Line := 1;
Label1.Caption := IntToStr(x) ;
label2.Caption := IntToStr(y);
End
else if Line = 1 then begin
Canvas.LineTo(X,Y);
Line := 0;
Label3.Caption := IntToStr(x) ;
label4.Caption := IntToStr(y);
end;
end;
答案 0 :(得分:5)
如果您没有填充颜色的区域,则可以将Pen.Mode
设置为pmXOR
进行所有绘图。它将给出一些奇数点,其中线条交叉(例如红线与蓝色圆圈交叉),但是当你重新绘制红线时 - 它会消失。
只需添加:
Canvas.Pen.Mode := pmXOR;
如有必要,请记住现有的Pen.Mode
并在完成绘图时将其恢复。
答案 1 :(得分:3)
您无法轻松擦除画布上的线条。你怎么知道之前有什么?当你在画布上书写时,之前的任何内容都会被覆盖并丢失。除非你记得之前有什么。
所以,有一个选项,记住以前的情况,然后恢复到那个状态。通常,您可能会记住静态背景。在这种情况下,您将拥有带足球场图案的静态图像。无论何时需要绘制它,绘制静态图像,然后绘制顶部的动态线条。
另一种方法是在需要时从头开始绘制整个图像。
无论你的解决方案是什么,我都建议TImage
是错误的控制。这对静态图像来说非常棒,但只要你需要动态的东西,它就不适合。而是使用TPaintBox
。在控件的OnPaint
事件处理程序中,绘制整个图像。通过从预先准备的位图中移动静态间距图示,然后是动态线。或者只是从头开始绘制整个图像。