也许你没看明白我的意思吧,我是说画线的代码不要放在OnMouseMove过程中,
下面我简单写了一个画线程序,你看一下吧
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
PMyLine = ^TMyLine;
TMyLine = record
P1: TPoint;
P2: TPoint;
end;
TForm1 = class(TForm)
PaintBox1: TPaintBox;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure PaintBox1Paint(Sender: TObject);
procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
LineList: TList;
CurP1, CurP2: TPoint;
MDown: Boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;
LineList := TList.Create;
MDown := False;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
while LineList.Count <> 0 do
begin
Dispose(LineList[0]);
LineList.Delete(0);
end;
LineList.Free;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
i: Integer;
MyLine: PMyLine;
begin
PaintBox1.Canvas.Pen.Mode := pmBlack;
for i := 0 to LineList.Count - 1 do
begin
MyLine := LineList;
PaintBox1.Canvas.MoveTo(MyLine.P1.X, MyLine.P1.Y);
PaintBox1.Canvas.LineTo(MyLine.P2.X, MyLine.P2.Y);
end;
if MDown then
begin
PaintBox1.Canvas.Pen.Mode := pmNotXor;
PaintBox1.Canvas.MoveTo(CurP1.X, CurP1.Y);
PaintBox1.Canvas.LineTo(CurP2.X, CurP2.Y);
end;
end;
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MDown := True;
CurP1 := Point(X, Y);
CurP2 := Point(X, Y);
PaintBox1.Invalidate;
end;
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if MDown then
begin
CurP2 := Point(X, Y);
PaintBox1.Invalidate;
end;
end;
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
MyLine: PMyLine;
begin
MDown := False;
CurP2 := Point(X, Y);
New(MyLine);
MyLine.P1 := CurP1;
MyLine.P2 := CurP2;
LineList.Add(MyLine);
PaintBox1.Invalidate;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
PaintBox1.Invalidate; //这个其实是没有必要的,PaintBox会自动重画
Timer1.Enabled := True;
end;
end.