unit UnitMain;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ToolWin, ExtCtrls, Math;type TDrawMode=(dmNone,dmLine); TForm5 = class(TForm) Image1: TImage; ToolBar1: TToolBar; ToolButton1: TToolButton; ToolButton2: TToolButton; procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure ToolButton2Click(Sender: TObject); procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } public { Public declarations } DrawMode:TDrawMode; MouseDown:Boolean; DownX,DownY:Integer; procedure DrawGrid; procedure DrawGridLine(X1,Y1,X2,Y2:Integer); end;var Form5: TForm5; ForceColor:TColor=clBlack; BackColor:TColor=clWhite; GridSize:Integer=20;implementation{$R *.dfm} procedure TForm5.DrawGrid; var X,Y:Integer; begin with Image1, Canvas do begin Brush.Color:=BackColor; FillRect(ClientRect); Pen.Color:=ForceColor; X:=0; while X<Width do begin MoveTo(X,0); LineTo(X,Height); Inc(X, GridSize); end; Y:=0; while Y<Height do begin MoveTo(0,Y); LineTo(Width,Y); Inc(Y, GridSize); end; end; end; procedure TForm5.DrawGridLine(X1, Y1, X2, Y2: Integer); var StepX,StepY:Double; DX,DY:Double; Step:Integer; begin DrawGrid; X1:=X1 div GridSize; Y1:=Y1 div GridSize; X2:=X2 div GridSize; Y2:=Y2 div GridSize; Step:=Max(Abs(X2-X1),Abs(Y2-Y1)); with Image1,Canvas do begin DX:=X1; DY:=Y1; if Step<1 then begin Rectangle(Round(DX)*GridSize,Round(DY)*GridSize,Round(DX)*GridSize+GridSize,Round(DY)*GridSize+GridSize); Exit; end; StepX:=(X2-X1)/Step; StepY:=(Y2-Y1)/Step; Brush.Color:=ForceColor; Rectangle(Round(DX)*GridSize,Round(DY)*GridSize,Round(DX)*GridSize+GridSize,Round(DY)*GridSize+GridSize); DX:=DX+StepX; DY:=DY+StepY; while (Abs(X2-DX)>0.4) or (Abs(Y2-DY)>0.4) do begin Rectangle(Round(DX)*GridSize,Round(DY)*GridSize,Round(DX)*GridSize+GridSize,Round(DY)*GridSize+GridSize); DX:=DX+StepX; DY:=DY+StepY; end; end; end;procedure TForm5.FormCreate(Sender: TObject); begin DrawGrid; end;procedure TForm5.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if not MouseDown then begin case DrawMode of dmNone: ; dmLine: begin MouseDown:=True; DownX:=X; DownY:=Y; end; end; end else begin case DrawMode of dmNone:; dmLine: begin MouseDown:=False; DrawMode:=dmNone; end; end; end;end;procedure TForm5.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if MouseDown then begin case DrawMode of dmNone: ; dmLine: begin DrawGridLine(DownX,DownY,X,Y); end; end; end; end;procedure TForm5.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin MouseDown:=False; end;procedure TForm5.ToolButton2Click(Sender: TObject); begin DrawMode:=dmLine; end;end.
是不是你另外一个贴中的问题呀,FillRect的问题,参数应该是Trect,不是坐标
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, ExtCtrls, Math;type
TDrawMode=(dmNone,dmLine);
TForm5 = class(TForm)
Image1: TImage;
ToolBar1: TToolBar;
ToolButton1: TToolButton;
ToolButton2: TToolButton;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ToolButton2Click(Sender: TObject);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCreate(Sender: TObject);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
DrawMode:TDrawMode;
MouseDown:Boolean;
DownX,DownY:Integer;
procedure DrawGrid;
procedure DrawGridLine(X1,Y1,X2,Y2:Integer);
end;var
Form5: TForm5;
ForceColor:TColor=clBlack;
BackColor:TColor=clWhite;
GridSize:Integer=20;implementation{$R *.dfm}
procedure TForm5.DrawGrid;
var
X,Y:Integer;
begin
with Image1, Canvas do
begin
Brush.Color:=BackColor;
FillRect(ClientRect);
Pen.Color:=ForceColor;
X:=0;
while X<Width do
begin
MoveTo(X,0);
LineTo(X,Height);
Inc(X, GridSize);
end;
Y:=0;
while Y<Height do
begin
MoveTo(0,Y);
LineTo(Width,Y);
Inc(Y, GridSize);
end;
end;
end;
procedure TForm5.DrawGridLine(X1, Y1, X2, Y2: Integer);
var
StepX,StepY:Double;
DX,DY:Double;
Step:Integer;
begin
DrawGrid;
X1:=X1 div GridSize;
Y1:=Y1 div GridSize;
X2:=X2 div GridSize;
Y2:=Y2 div GridSize; Step:=Max(Abs(X2-X1),Abs(Y2-Y1));
with Image1,Canvas do
begin
DX:=X1;
DY:=Y1;
if Step<1 then
begin
Rectangle(Round(DX)*GridSize,Round(DY)*GridSize,Round(DX)*GridSize+GridSize,Round(DY)*GridSize+GridSize);
Exit;
end;
StepX:=(X2-X1)/Step;
StepY:=(Y2-Y1)/Step;
Brush.Color:=ForceColor;
Rectangle(Round(DX)*GridSize,Round(DY)*GridSize,Round(DX)*GridSize+GridSize,Round(DY)*GridSize+GridSize);
DX:=DX+StepX;
DY:=DY+StepY;
while (Abs(X2-DX)>0.4) or (Abs(Y2-DY)>0.4) do
begin
Rectangle(Round(DX)*GridSize,Round(DY)*GridSize,Round(DX)*GridSize+GridSize,Round(DY)*GridSize+GridSize);
DX:=DX+StepX;
DY:=DY+StepY;
end;
end;
end;procedure TForm5.FormCreate(Sender: TObject);
begin
DrawGrid;
end;procedure TForm5.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if not MouseDown then
begin
case DrawMode of
dmNone: ;
dmLine:
begin
MouseDown:=True;
DownX:=X;
DownY:=Y;
end;
end;
end
else
begin
case DrawMode of
dmNone:;
dmLine:
begin
MouseDown:=False;
DrawMode:=dmNone;
end;
end;
end;end;procedure TForm5.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if MouseDown then
begin
case DrawMode of
dmNone: ;
dmLine:
begin
DrawGridLine(DownX,DownY,X,Y);
end;
end;
end;
end;procedure TForm5.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
MouseDown:=False;
end;procedure TForm5.ToolButton2Click(Sender: TObject);
begin
DrawMode:=dmLine;
end;end.