鼠标移动时如何把鼠标经过的各个点(point(x,y))依次加进一数组 ???(100分)

  • 主题发起人 主题发起人 happymanfreeman
  • 开始时间 开始时间
H

happymanfreeman

Unregistered / Unconfirmed
GUEST, unregistred user!
各位:

鼠标移动时如何把鼠标经过的各个点(point(x,y))依次加进一数组 ??
请给出代码 . 谢谢 !!
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
procedure FormMouseMove(Sender: TObject
Shift: TShiftState
X,
Y: Integer);
procedure FormCreate(Sender: TObject);
private
aryCursorPos: array[0..99999] of TPoint;
I: Integer;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormMouseMove(Sender: TObject
Shift: TShiftState
X,
Y: Integer);
begin
aryCursorPos := Point(X,Y);
Inc(I);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
I := 0;
end;

end.
基本思路就是这样了,具体应用可以仿照以上思路进行优化。
 
在OnMouseMove事件里试试看
 
getcursorpos 函数
 
你是不是想实现鼠标回放呀? 用鼠标链可以实现,你搜一下
 
各位, 我的具体问题是, 在图层编程中, 先定义一个随手画对象, 然后在paintbox.mousemove()事件中, 把鼠标经过的各个点(point(x,y))依次加进一事先
定义的数组points中, 假如事先定义数组points: array[0..99999] of TPoint,
那么, 调用polyline(points)画出来是什么啊 ?? 数组points后面的元素都是空的啊??
这个问题如何解决 ?? 动态数组行吗 ??
 
依据你的需求描述最好不要用数组(无论是静态的或者是动态的都无法满足你随机动态设置数组长度的要求),还是采用链表结构比较合适。
 
你可以参考一下Vc++下面的一个例子叫Scribble,那里面非常的好,不过是C++写的,
其实主要是定义一个链表,里面是线条对象,而线条对象由点数组组成,然后在OnMouseDown,OnMouseMove,OnMouseUp三个事件里面利用GDI函数画图,并将相应的点加到相应的线条里,深入浅出MFC中有具体的做法,你参考一下这本书,用动态数组可能也没有多好,因为delphi里的动态数组使用之前还要先setlength一下,我觉得最好你自己写个链表类,这个链表成员是个结构体point(x,y),然后取得一个点就动态分配内存然后再往后挂就可以了,c++里面处理的比较方便,因为MFC内建了一些类很方便,vcl应该也有你可以找找看
 
Johnny_du: 是啊, 我也考虑过链表, 但好象不太好, 因为每次画的时候都要
调用polyline(points), 都要把Tlist内的元素逐一读取到points, 好像效率很差 !
 
可以考虑采用LineTo取代PolyLine来实现
 
如果想回放的话,可以用回放钩子实现,WH_JOURNALBACK
 
现在的问题是:

如何把Point类型的元素add到Tlist中.

如何把Tlist中的元素逐一读取到Point类型的数组中,

请大家给出代码.谢谢 !!
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormMouseMove(Sender: TObject
Shift: TShiftState
X,
Y: Integer);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
FPoints: TList;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure FreeListMem(List: TList);
var
I: Integer;
Item: Pointer;
begin
for I := List.Count-1 downto 0 do
begin
Item := List.Items;
Dispose(Item);
List.Items := nil;
end;
List.Clear;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FPoints := TList.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FPoints.Free;
end;

procedure TForm1.FormMouseMove(Sender: TObject
Shift: TShiftState
X,
Y: Integer);
var
P: PPoint;
begin
New(P);
P^.X := X;
P^.Y := Y;
FPoints.Add(P);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
PointArr: array of TPoint;
I: Integer;
P: PPoint;
begin
SetLength(PointArr, FPoints.Count);
for I := 0 to FPoints.Count-1 do
begin
P := FPoints.Items;
PointArr.X := P^.X;
PointArr.Y := P^.Y;
end;
FreeListMem(FPoints)
//用完记得释放内存
end;

end.
 
噢,我忘了! 我说的是c++builder 的代码, 请大家把上述代码改为c++builder 代码,
谢谢 !!
 
wjh_wy 和 各位朋友 :

  请大家把上述wjh_wy给出的代码改为c++builder 代码, 谢谢 !!
 
 
后退
顶部