一个关画直线的简单问题!(100分)

  • 主题发起人 主题发起人 anndy1999
  • 开始时间 开始时间
A

anndy1999

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用 鼠标在PaintBox上拖动画直线。
我是这样写的:
procedure TAFXMap.PaintBoxMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
PB_LineMode := True;
PaintBox.Canvas.MoveTo(X,Y);
end;

procedure TAFXMap.PaintBoxMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
If PB_LineMode = True Then
PaintBox.Canvas.LineTo(X,Y);
end;

procedure TAFXMap.PaintBoxMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
PaintBox.Canvas.LineTo(X,Y);
PB_LineMode := False;
end;

但这样画出不是直线,而且鼠标轨迹线,高手指点指点,怎么改呢??(OnMouseMove中的代码如果不要,那么可以画直线,但鼠标在拖动的过程中看不到线。)
 
先定义4个全局变量(X1,Y1,X2,Y2) 先在PaintBoxMouseDown事件中给X1,X2,赋X坐标,Y1,Y2赋Y坐标
在PaintBoxMouseMove事件中先清除线(X1,Y1)(X2,Y2) 然后再画一条(X1,Y1),(X,Y)的线 再给X2,Y2赋相应的值
 
嗯,

屏幕色 Xor 清除
 
我想在拖动画线时,比如输出当前的连线的长度,如果用Textout输出,输出的字会擦掉以前拖动画的线,怎么解决呢?
不能用HINT的方式,因为我没有将它定位(我想把长度值输在线段中间位置),而且过一会儿它就消失了。
 
双缓冲,背景图,实时绘制,速度不会慢的
就是说,原图拷贝到新图上,然后绘制。
每次都是这样,不就好了(其实就是备份一个草稿图)
 
If PB_LineMode = True Then
PaintBox.Canvas.LineTo(X,Y);
不要了就可以了
 
我也听说过用双缓冲之类的,倒底怎么用呢?
能给点代码看看吗?
 
同意倒数二楼的意见
 
先将图片画到一个BMP.canvas中,然后再使用BitBlt将图片拷贝到目标Canvas,可以提高速度。
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
btn_Move: TButton;
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);
procedure DrawLine(StartPt,EndPt: TPoint);
function MoveLine(MyPoint,FirstPt,LastPt: TPoint): Boolean;
procedure RealMoveLine(MyPoint: TPoint);
procedure btn_MoveClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
CanDraw,CanMove,Moving: Boolean;
OriginPt,EndPt,SaveOriginPt,SaveEndPt,MovePt: TPoint;
implementation

{$R *.dfm}

procedure TForm1.DrawLine(StartPt, EndPt: TPoint);
begin
Canvas.MoveTo(StartPt.X,StartPt.Y);
Canvas.LineTo(EndPt.X,EndPt.Y);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
Catched: Boolean;
MyPoint: TPoint;
begin
if Button = mbleft then
begin
CanDraw := True;
OriginPt := Point(x,y);
EndPt := OriginPt;
DrawLine(OriginPt,EndPt);
end;
if CanMove then
begin
CanDraw := False;
MyPoint := Point(x,y);
Catched := MoveLine(Mypoint,SaveOriginPt,SaveEndPt);
if Catched then
begin
MovePt := MyPoint;
SetCursor(LoadCursor(0, IDC_SIZEALL));
Moving := True;
end
else
begin
SetCursor(LoadCursor(0, IDC_ARROW));
Moving := False;
end;
end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
MyPoint: TPoint;
begin
if CanDraw then
begin
Canvas.Pen.Mode := pmNotXor;
DrawLine(OriginPt,EndPt);

EndPt := Point(X,Y);

DrawLine(OriginPt,EndPt);
end;
if Moving then
begin
MyPoint := Point(x,y);
RealMoveLine(MyPoint);
MovePt := MyPoint;
end;

end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
NowPt: TPoint;
begin
if CanDraw then
begin
NowPt := Point(x,y);
Canvas.Pen.Mode := pmCopy;
DrawLine(OriginPt,NowPt);
CanDraw := False;
end;
if Moving then
Moving := False;

end;

function TForm1.MoveLine(MyPoint, FirstPt, LastPt: TPoint): Boolean;
var
lengthA,lengthB,lengthC:real;
lengthX,lengthY:real; //integer;
begin
lengthX:=abs(myPoint.X - FirstPt.X );
lengthY:=abs(myPoint.Y - FirstPt.Y );
lengthX:=sqr(lengthX);
lengthY:=sqr(lengthY);
lengthA:=sqrt(lengthX+lengthY);

lengthX:=abs(myPoint.X - LastPt.X );
lengthY:=abs(myPoint.Y - LastPt.Y );
lengthX:=sqr(lengthX);
lengthY:=sqr(lengthY);
lengthB:=sqrt(lengthX+lengthY);

lengthX:=abs(LastPt.X - FirstPt.X );
lengthY:=abs(LastPt.Y - FirstPt.Y );
lengthX:=sqr(lengthX);
lengthY:=sqr(lengthY);
lengthC:=sqrt(lengthX+lengthY);

if (lengthA + lengthB) < (lengthC + 1) then
result:=true
else
result:=false;
end;

procedure TForm1.RealMoveLine(MyPoint: TPoint);
var
deltaX,deltaY:integer;
firstPoint,secondPoint:TPoint;
begin
Canvas.Pen.Mode := pmNotXor;
DrawLine(SaveOriginPt,SaveEndPt);//

deltaX:=myPoint.X - MovePt.X;
deltaY:=myPoint.Y - MovePt.Y;

firstPoint:=Point(SaveOriginPt.X+deltaX,SaveOriginPt.Y+deltaY);
secondPoint:=Point(SaveEndPt.X+deltaX,SaveEndPt.Y+deltaY);

// Canvas.Pen.Mode := pmCopy;
drawLine(firstPoint,secondPoint);
SaveOriginPt:=firstPoint;
SaveEndPt := secondPoint;
end;

procedure TForm1.btn_MoveClick(Sender: TObject);
begin
CanMove := True;
CanDraw := False;
SaveOriginPt := OriginPt;
SaveEndPt := EndPt;
end;

end.
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
734
import
I
I
回复
0
查看
589
import
I
I
回复
0
查看
746
import
I
后退
顶部