如何在canvas上用鼠标拖动一个图标跑动(50分)

  • 主题发起人 主题发起人 帅义庭
  • 开始时间 开始时间

帅义庭

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在canvas上用鼠标拖动一个图标移动,就象WINDOWS95桌面上移动图标一样。
 
这是ListView的效果,为什么不用ListView?
 
我想可以在发生事件mousedown时,if button=mbleft then
返回此时鼠标的位置,在在此位置画一个图标就完成了图标的
拖动.等等,我去试试..待会儿再把源代码拿来..

 
桌面是实际上一个ListView,用spy++看一下就知道了。
 
在心:
你的想法很好,我也这样想过,而且我的程序中也必须应用这种方法,只是不知怎样用异或方式画图标,然后再擦除该图标?
 
虽然我并不知道ListView的原理,
虽然我并不知道如何解决问题,
但我知道,判断鼠标画图标是个笨主意,没有那么麻烦.
为什么不能用ListView?


 
rss:
你好!
我现在正在编写一个电网画面图形编辑器程序,该编辑器中需要用到许多的电气符号,我已将这些电气符号作为图标全部存入了一个project.dll中,我的整个编辑器是在FORM的画布中进行的而且是矢量图形格式,因此需要用鼠标在画布上移动各个电气符号即图标,以便能够与其他图形一起组合成一个完整的电网主接线图。
 
rss:
你好!
我现在正在编写一个电网画面图形编辑器程序,该编辑器中需要用到许多的电
气符号,我已将这些电气符号作为图标全部存入了一个project.dll中,我的整个
编辑器是在FORM的画布中进行的而且是矢量图形格式,因此需要用鼠标在画布上移
动各个电气符号即图标,以便能够与其他图形一起组合成一个完整的电网主接线图。

 
在心:
你好!你的想法很与我相同,不知你是否已经写出源码?可与我共享吗?
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Label1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
bdrag:boolean;
x1,y1:integer;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
bdrag:=false;
end;

procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
x1:=x;
y1:=y;
bdrag:=true;
end;

procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var sx,sy:integer;
begin
if bdrag then
begin
label1.left:=label1.left+x-x1;
label1.top:=label1.top+y-y1;
end;{if}
end;

procedure TForm1.Label1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
bdrag:=false;
end;

end.
我的来了,不好意思,在心,
 
dedman:
真是太谢谢你了,可是你移动的是标签,我说的是图标(ICON),也许是我没有讲清楚,图标在画布上移动涉及到图标的显示和擦除,问题的关键也就在这里,我试了许多方法都不能将图标擦除,你有其他方法吗?
 
dedman:
真是太谢谢你了,可是你移动的是标签,我说的是图标(ICON),也许是我没有讲清
楚,图标在画布上移动涉及到图标的显示和擦除,问题的关键也就在这里,我试了许
多方法都不能将图标擦除,你有其他方法吗?

 
我有一个好办法。
在一个新的Form中放入一个Panel,加入如下代码:
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
const
SC_DragMove = $F012; { a magic number }
begin
ReleaseCapture;
panel1.perform(WM_SysCommand, SC_DragMove, 0);
end;
在运行时拖动Panel即可。
我想你可以利用这个方法。虽然有点那个。
注意:该方法不适合TImage,用Button可以模仿。
 
接受答案了.
 
为什么狙击手兄弟的代码,使用image不可以呢,要什么办法呢,要怎样改image也可以呢
 
后退
顶部