<font color=red size=+1>怎样在CANVAS上实现矩形橡皮筋,用鼠标拖拉即可画矩形 </font>(100分)

  • 主题发起人 主题发起人 mafan
  • 开始时间 开始时间
M

mafan

Unregistered / Unconfirmed
GUEST, unregistred user!
<href a=http://www.delphibbs.com/delphibbs/DispQ.asp?LID=180398>http://www.delphibbs.com/delphibbs/DispQ.asp?LID=180398</a>
问题就是上面这个,但有个问题:
所划的矩形和鼠标总有所偏离,似乎是MOUSEMOVE造成的,如何解决?即所划矩形和鼠标实际
位置尽量吻合?
 
试一试,不会什么“对不准”的。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Down : Boolean;
FtPt,CurPt : TPoint;

implementation

{$R *.DFM}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Down := TRUE;
FtPt := Point(X,Y);
CurPt := Point(X,Y);
Canvas.Pen.Mode := pmNotXor;
Canvas.Brush.Style := bsClear;
Canvas.Rectangle(FtPt.X,FtPt.Y,CurPt.X,CurPt.Y);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if not Down then Exit;
Canvas.Rectangle(FtPt.X,FtPt.Y,CurPt.X,CurPt.Y);
CurPt := Point(X,Y);
Canvas.Rectangle(FtPt.X,FtPt.Y,CurPt.X,CurPt.Y);
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Down := FALSE;
Canvas.Rectangle(FtPt.X,FtPt.Y,CurPt.X,CurPt.Y);
end;

end.
 
试试这个:

把FORM换成IMAGE就会跑偏,是不是有什么问题

procedure TForm.ImageBmpMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Down := TRUE;
FtPt := Point(X,Y);
CurPt := Point(X,Y);
ImageBmp.Canvas.Pen.Mode := pmNotXor;
ImageBmp.Canvas.Brush.Style := bsClear;
ImageBmp.Canvas.Rectangle(FtPt.X,FtPt.Y,CurPt.X,CurPt.Y);
end;

procedure TForm.ImageBmpMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if not Down then Exit;
ImageBmp.Canvas.Rectangle(FtPt.X,FtPt.Y,CurPt.X,CurPt.Y);
CurPt := Point(X,Y);
ImageBmp.Canvas.Rectangle(FtPt.X,FtPt.Y,CurPt.X,CurPt.Y);
end;

procedure TForm.ImageBmpMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Down := FALSE;
ImageBmp.Canvas.Rectangle(FtPt.X,FtPt.Y,CurPt.X,CurPt.Y);
end;
 
我试过了,没有什么问题。
你指的“跑偏”是什么,能不能用专业术语描述一下?
 
就是鼠标走过的矩形轨迹和 Rectangle 划出来的矩形不符,后者要比前者靠左上一些;
矩形越靠右下,跑偏(是不是叫漂移更合适)越厉害;
真是不明白
 
知道了,原来我把Strech设成True;
 
多谢吕雪松
 
画实在的线,宣示在画布上,应该怎么该一下。
 
后退
顶部